Project

General

Profile

1
package eu.dnetlib.data.mdstore.modular;
2

    
3
import java.io.ByteArrayInputStream;
4
import java.util.HashMap;
5
import java.util.Map;
6
import java.util.Stack;
7
import javax.xml.stream.XMLInputFactory;
8
import javax.xml.stream.XMLStreamConstants;
9
import javax.xml.stream.XMLStreamException;
10
import javax.xml.stream.XMLStreamReader;
11

    
12
/**
13
 * This method outperforms SimpleRecordParser by a vast amount, especially since we are just getting stuff in the
14
 * header.
15
 *
16
 * @author marko
17
 */
18
public class StreamingRecordParser implements RecordParser {
19

    
20
	@Override
21
	public Map<String, String> parseRecord(String record) {
22

    
23
		try {
24
			XMLInputFactory factory = XMLInputFactory.newInstance();
25
			XMLStreamReader parser = factory.createXMLStreamReader(new ByteArrayInputStream(record.getBytes()));
26

    
27
			HashMap<String, String> res = new HashMap<String, String>();
28

    
29
			Stack<String> elementStack = new Stack<String>();
30
			elementStack.push("/");
31

    
32
			while (parser.hasNext()) {
33
				int event = parser.next();
34

    
35
				if (event == XMLStreamConstants.END_ELEMENT) {
36
					elementStack.pop();
37
				} else if (event == XMLStreamConstants.START_ELEMENT) {
38
					final String localName = parser.getLocalName();
39
					elementStack.push(localName);
40

    
41
					if ("objIdentifier".equals(localName)) {
42
						parser.next();
43

    
44
						res.put("id", parser.getText().trim());
45

    
46
					} else if ("identifier".equals(localName) && "efgEntity".equals(grandParent(elementStack))) {
47
						if (!res.containsKey("originalId")) {
48
							parser.next();
49
							//							log.info("ZZZZZZ OK: found identifier at right depth " + elementStack);
50
							res.put("originalId", parser.getText().trim());
51
						}
52
					} else if ("identifier".equals(localName)) {
53

    
54
						//						log.info("ZZZZZZ: found identifier not at right depth " + elementStack + " grand parent " + grandParent(elementStack));
55
					}
56

    
57
					if (res.containsKey("id") && res.containsKey("originalId"))
58
						return res;
59
				}
60
			}
61
			return res;
62
		} catch (XMLStreamException e) {
63
			throw new IllegalStateException(e);
64
		}
65

    
66
	}
67

    
68
	private String grandParent(Stack<String> elementStack) {
69
		if (elementStack.size() <= 3)
70
			return "";
71
		return elementStack.get(elementStack.size() - 3);
72
	}
73

    
74
}
(10-10/10)