Project

General

Profile

1
package eu.dnetlib.functionality.index.utils;
2

    
3
import java.io.StringReader;
4
import java.util.List;
5
import java.util.Map;
6

    
7
import org.dom4j.Document;
8
import org.dom4j.DocumentException;
9
import org.dom4j.io.SAXReader;
10
import org.springframework.beans.factory.annotation.Autowired;
11
import org.xml.sax.InputSource;
12

    
13
import com.google.common.collect.HashBasedTable;
14
import com.google.common.collect.Table;
15
import com.mycila.xmltool.CallBack;
16
import com.mycila.xmltool.XMLDoc;
17
import com.mycila.xmltool.XMLTag;
18

    
19
import eu.dnetlib.data.provision.index.rmi.IndexServiceException;
20
import eu.dnetlib.functionality.index.client.IndexClientException;
21

    
22
public class MDFormatReader {
23

    
24
	static class XmlUtils {
25

    
26
		/**
27
		 * helper method, parses a list of fields.
28
		 *
29
		 * @param fields
30
		 *            the given fields
31
		 * @return the parsed fields
32
		 * @throws IndexServiceException
33
		 *             if cannot parse the fields
34
		 */
35
		public static Document parse(final String xml) {
36
			try {
37
				return new SAXReader().read(new StringReader(xml));
38
			} catch (DocumentException e) {
39
				throw new IllegalArgumentException("cannot parse: " + xml);
40
			}
41
		}
42

    
43
		public static InputSource asInputSource(final String input) throws DocumentException {
44
			return new InputSource(new StringReader(parse(input).asXML()));
45
		}
46
	}
47

    
48
	@Autowired
49
	private ServiceTools serviceTools;
50

    
51
	@Autowired
52
	private MetadataReferenceFactory mdFactory;
53

    
54
	public List<MetadataReference> listMDRefs() throws IndexClientException {
55
		return serviceTools.listMDRefs();
56
	}
57

    
58
	public Document getFields(final MetadataReference mdRef) {
59
		String fields = serviceTools.getIndexFields(mdRef);
60
		return (fields != null) && !fields.isEmpty() ? XmlUtils.parse(fields) : null;
61
	}
62

    
63
	public Map<String, String> getAttributeMap(final MetadataReference mdRef, final String attribute) throws IndexClientException {
64
		return getAttributeTable(mdRef, attribute).column(attribute);
65
	}
66

    
67
	public Table<String, String, String> getAttributeTable(final MetadataReference mdRef, final String... attributeList) throws IndexClientException {
68

    
69
		final String fields = serviceTools.getIndexFields(mdRef);
70
		if (fields.isEmpty()) throw new IndexClientException("No result getting index layout informations");
71
		final Table<String, String, String> t = HashBasedTable.create();
72
		XMLDoc.from(serviceTools.getIndexFields(mdRef), false).forEach("//FIELD", new CallBack() {
73

    
74
			@Override
75
			public void execute(final XMLTag field) {
76

    
77
				for (String attribute : attributeList) {
78
					String value = null;
79

    
80
					if ("xpath".equals(attribute)) {
81
						if (!(field.hasAttribute("xpath") || field.hasAttribute("value"))) return;
82

    
83
						value = field.hasAttribute("xpath") ? field.getAttribute("xpath") : field.getAttribute("value");
84
					}
85

    
86
					if ("weight".equals(attribute)) {
87
						if (!(field.hasAttribute(attribute))) return;
88

    
89
						value = field.hasAttribute(attribute) ? field.getAttribute(attribute) : "";
90
					}
91

    
92
					if (value == null) {
93
						value = field.getAttribute(attribute);
94
					}
95

    
96
					t.put(field.getAttribute("name").toLowerCase(), attribute, value);
97
				}
98
			}
99
		});
100
		return t;
101
	}
102

    
103
}
(2-2/5)