Project

General

Profile

1
package eu.dnetlib.data.utils;
2

    
3
import java.io.IOException;
4
import java.io.StringWriter;
5
import java.io.Writer;
6
import java.util.Collection;
7
import java.util.regex.Matcher;
8
import java.util.regex.Pattern;
9
import java.util.stream.Collectors;
10

    
11
import org.apache.commons.lang3.StringUtils;
12
import org.apache.commons.logging.Log;
13
import org.apache.commons.logging.LogFactory;
14
import org.jbibtex.BibTeXDatabase;
15
import org.jbibtex.BibTeXEntry;
16
import org.jbibtex.BibTeXFormatter;
17
import org.jbibtex.Key;
18
import org.jbibtex.StringValue;
19
import org.jbibtex.StringValue.Style;
20

    
21
import eu.dnetlib.data.mdstore.plugins.objects.MdRecord;
22

    
23
public class BibTexConverter {
24

    
25
	private static final Log log = LogFactory.getLog(BibTexConverter.class);
26

    
27
	public static String asBibTex(final MdRecord record) {
28
		try {
29

    
30
			final BibTeXEntry dbEntry = new BibTeXEntry(findBibTexType(record.getType()), new Key(record.getId()));
31

    
32
			addSimpleStringValue(dbEntry, BibTeXEntry.KEY_TITLE, record.getTitle());
33
			addMultipleStringValue(dbEntry, BibTeXEntry.KEY_AUTHOR, record.getCreators());
34
			addSimpleStringValue(dbEntry, BibTeXEntry.KEY_PUBLISHER, record.getPublisher());
35
			addMultipleStringValue(dbEntry, BibTeXEntry.KEY_DOI, record.getDois());
36

    
37
			addSourceAndDate(dbEntry, record);
38

    
39
			final BibTeXFormatter formatter = new BibTeXFormatter();
40
			final Writer res = new StringWriter();
41
			final BibTeXDatabase db = new BibTeXDatabase();
42
			db.addObject(dbEntry);
43
			formatter.format(db, res);
44
			return res.toString();
45
		} catch (final IOException e) {
46
			log.warn("Error generating bibtex", e);
47
			return "";
48
		}
49
	}
50

    
51
	private static void addSimpleStringValue(final BibTeXEntry dbEntry, final Key key, final Object value) {
52
		if ((value != null) && StringUtils.isNotBlank(value.toString())) {
53
			dbEntry.addField(key, new StringValue(value.toString(), Style.BRACED));
54
		}
55
	}
56

    
57
	private static void addMultipleStringValue(final BibTeXEntry dbEntry, final Key key, final Collection<String> list) {
58
		final String val = list.stream()
59
				.map(String::trim)
60
				.filter(StringUtils::isNotBlank)
61
				.collect(Collectors.joining(" and "));
62

    
63
		if (StringUtils.isNotBlank(val)) {
64
			dbEntry.addField(key, new StringValue(val, Style.BRACED));
65
		}
66
	}
67

    
68
	private static void addSourceAndDate(final BibTeXEntry dbEntry, final MdRecord record) {
69
		String year = Integer.toString(record.getDate());
70

    
71
		if (record.getSource() != null) {
72
			switch (record.getType().toLowerCase()) {
73
			case "conference article":
74
			case "contribution to conference":
75
				addSimpleStringValue(dbEntry, BibTeXEntry.KEY_BOOKTITLE, record.getSource());
76
				break;
77
			case "contribution to book":
78
				addSimpleStringValue(dbEntry, BibTeXEntry.KEY_BOOKTITLE, record.getSource());
79
				break;
80
			case "report":
81
				addSimpleStringValue(dbEntry, BibTeXEntry.KEY_INSTITUTION, record.getSource());
82
				break;
83
			case "journal article":
84
				final String regex = "^(.+) (\\d*) \\((\\d{4})\\)(: (\\d+\\–?\\d*))?";
85
				final Pattern pattern = Pattern.compile(regex);
86
				final Matcher matcher = pattern.matcher(record.getSource());
87

    
88
				if (matcher.find()) {
89
					if (matcher.groupCount() >= 1) {
90
						addSimpleStringValue(dbEntry, BibTeXEntry.KEY_JOURNAL, matcher.group(1));
91
					}
92
					if (matcher.groupCount() >= 2) {
93
						addSimpleStringValue(dbEntry, BibTeXEntry.KEY_VOLUME, matcher.group(2));
94
					}
95
					if (matcher.groupCount() >= 3) {
96
						year = matcher.group(3);
97
					}
98
					if (matcher.groupCount() >= 5) {
99
						addSimpleStringValue(dbEntry, BibTeXEntry.KEY_PAGES, matcher.group(5));
100
					}
101
				}
102
				break;
103
			case "patent":
104
				addSimpleStringValue(dbEntry, BibTeXEntry.KEY_HOWPUBLISHED, record.getSource());
105
				break;
106
			}
107
		}
108

    
109
		addSimpleStringValue(dbEntry, BibTeXEntry.KEY_YEAR, year);
110
	}
111

    
112
	private static Key findBibTexType(final String resourceType) {
113
		switch (resourceType.toLowerCase()) {
114
		case "conference article":
115
		case "contribution to conference":
116
			return BibTeXEntry.TYPE_INPROCEEDINGS;
117
		case "report":
118
			return BibTeXEntry.TYPE_TECHREPORT;
119
		case "journal article":
120
			return BibTeXEntry.TYPE_ARTICLE;
121
		case "other":
122
			return BibTeXEntry.TYPE_MISC;
123
		case "contribution to book":
124
			return BibTeXEntry.TYPE_INBOOK;
125
		case "book":
126
			return BibTeXEntry.TYPE_BOOK;
127
		case "bachelor thesis":
128
			return BibTeXEntry.TYPE_MASTERSTHESIS;
129
		case "doctoral thesis":
130
			return BibTeXEntry.TYPE_PHDTHESIS;
131
		case "patent":
132
			return BibTeXEntry.TYPE_MISC;
133
		case "master thesis":
134
			return BibTeXEntry.TYPE_MASTERSTHESIS;
135
		default:
136
			return BibTeXEntry.TYPE_MISC;
137
		}
138
	}
139
}
(1-1/5)