Project

General

Profile

1
package eu.dnetlib.data.utils;
2

    
3
import java.io.IOException;
4
import java.io.StringReader;
5
import java.io.StringWriter;
6
import java.io.Writer;
7
import java.util.List;
8
import java.util.stream.Collectors;
9

    
10
import org.apache.commons.lang3.StringUtils;
11
import org.apache.commons.logging.Log;
12
import org.apache.commons.logging.LogFactory;
13
import org.dom4j.Document;
14
import org.dom4j.DocumentException;
15
import org.dom4j.Node;
16
import org.dom4j.io.SAXReader;
17
import org.jbibtex.BibTeXDatabase;
18
import org.jbibtex.BibTeXEntry;
19
import org.jbibtex.BibTeXFormatter;
20
import org.jbibtex.Key;
21
import org.jbibtex.StringValue;
22
import org.jbibtex.StringValue.Style;
23

    
24
public class BibTexConverter {
25

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

    
28
	public static String asBibTex(final String xml) {
29
		try {
30
			final Document doc = new SAXReader().read(new StringReader(xml));
31

    
32
			final BibTeXEntry dbEntry = new BibTeXEntry(
33
					findBibTexType(doc.valueOf("//*[local-name() = 'resourceType']")),
34
					new Key(doc.valueOf("//*[local-name() = 'identifier']")));
35

    
36
			addSimpleStringValue(dbEntry, BibTeXEntry.KEY_TITLE, doc, "//*[local-name() = 'title']");
37
			addMultipleStringValue(dbEntry, BibTeXEntry.KEY_AUTHOR, doc, "//*[local-name() = 'creator']");
38
			addSimpleStringValue(dbEntry, BibTeXEntry.KEY_YEAR, doc, "//*[local-name() = 'date']");
39

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

    
52
	private static void addSimpleStringValue(final BibTeXEntry dbEntry, final Key key, final Document doc, final String xpath) {
53
		final String val = doc.valueOf(xpath).trim();
54
		if (StringUtils.isNotBlank(val)) {
55
			dbEntry.addField(key, new StringValue(val, Style.BRACED));
56
		}
57
	}
58

    
59
	@SuppressWarnings("unchecked")
60
	private static void addMultipleStringValue(final BibTeXEntry dbEntry, final Key key, final Document doc, final String xpath) {
61
		final String val = ((List<Node>) doc.selectNodes(xpath))
62
				.stream()
63
				.map(Node::getText)
64
				.map(String::trim)
65
				.filter(StringUtils::isNotEmpty)
66
				.collect(Collectors.joining(" and "));
67

    
68
		if (StringUtils.isNotBlank(val)) {
69
			dbEntry.addField(key, new StringValue(val, Style.BRACED));
70
		}
71
	}
72

    
73
	private static Key findBibTexType(final String resourceType) {
74
		switch (resourceType) {
75
		case "Conference object":
76
			return BibTeXEntry.TYPE_INPROCEEDINGS;
77
		case "Report":
78
			return BibTeXEntry.TYPE_TECHREPORT;
79
		case "Article":
80
			return BibTeXEntry.TYPE_ARTICLE;
81
		case "Other":
82
			return BibTeXEntry.TYPE_MISC;
83
		case "Part of book or chapter of book":
84
			return BibTeXEntry.TYPE_INBOOK;
85
		case "Book":
86
			return BibTeXEntry.TYPE_BOOK;
87
		case "Bachelor thesis":
88
			return BibTeXEntry.TYPE_MASTERSTHESIS;
89
		case "Doctoral thesis":
90
			return BibTeXEntry.TYPE_PHDTHESIS;
91
		case "Patent":
92
			return BibTeXEntry.TYPE_MISC;
93
		case "Master thesis":
94
			return BibTeXEntry.TYPE_MASTERSTHESIS;
95
		default:
96
			return BibTeXEntry.TYPE_MISC;
97
		}
98
	}
99
}
(1-1/4)