Project

General

Profile

1
package eu.dnetlib.data.transform;
2

    
3
import java.io.IOException;
4
import java.io.InputStream;
5
import java.io.StringReader;
6
import java.util.Arrays;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.function.Function;
10
import java.util.stream.Collectors;
11

    
12
import javax.annotation.PostConstruct;
13

    
14
import com.google.common.collect.Maps;
15
import com.google.gson.Gson;
16
import eu.dnetlib.enabling.locators.UniqueServiceLocator;
17
import eu.dnetlib.rmi.enabling.ISLookUpException;
18
import eu.dnetlib.rmi.enabling.ISLookUpService;
19
import org.apache.commons.io.IOUtils;
20
import org.apache.commons.logging.Log;
21
import org.apache.commons.logging.LogFactory;
22
import org.dom4j.Document;
23
import org.dom4j.DocumentException;
24
import org.dom4j.Element;
25
import org.dom4j.Node;
26
import org.dom4j.io.SAXReader;
27
import org.springframework.beans.factory.annotation.Autowired;
28
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
29
import org.springframework.stereotype.Component;
30

    
31
/**
32
 * Created by claudio on 12/12/2016.
33
 */
34
@Component
35
public class OntologyLoader {
36

    
37
	private static final Log log = LogFactory.getLog(OntologyLoader.class);
38

    
39
	private static final String PATTERN = "classpath*:/eu/dnetlib/bootstrap/profiles/OntologyDSResources/OntologyDSResourceType/*.xml";
40

    
41
    private static UniqueServiceLocator staticServiceLocator;
42

    
43
    @Autowired
44
    private UniqueServiceLocator serviceLocator;
45

    
46
	public static Ontology loadOntologyFromCp(final InputStream profile) {
47
        return loadOntologyProfilefromPath(profile);
48
    }
49

    
50
    public static Ontologies loadOntologiesFromCp() throws IOException {
51
	    final PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
52
	    final List<InputStream> files = Arrays.asList(resolver.getResources(PATTERN)).stream().map(r -> {
53
		    try {
54
			    return r.getInputStream();
55
		    } catch (IOException e) {
56
			    throw new RuntimeException(e);
57
		    }
58
	    }).collect(Collectors.toList());
59

    
60
        return createOntologies(files);
61
    }
62

    
63
    public static Ontologies createOntologies(List<InputStream> files) {
64
        final Ontologies ontologies = new Ontologies();
65
        files.stream().map(
66
                s -> loadOntologyProfilefromPath(s))
67
                .collect(Collectors.toMap(Ontology::getCode, Function.identity()))
68
                .entrySet()
69
                .forEach(it -> ontologies.put(it.getKey(), it.getValue()));
70
        return ontologies;
71
    }
72

    
73
    public static Ontologies loadOntologiesFromIS() throws ISLookUpException {
74
        final ISLookUpService lookUpService = staticServiceLocator.getService(ISLookUpService.class);
75
        List<String> files = lookUpService.quickSearchProfile("for $x in collection('/db/DRIVER/OntologyDSResources/OntologyDSResourceType') return $x");
76
        final Ontologies ontologies = new Ontologies();
77
        files.stream().map
78
                (OntologyLoader::getOntologyFromProfile)
79
                .collect(Collectors.toMap(Ontology::getCode, Function.identity()))
80
                .entrySet()
81
                .forEach(it -> ontologies.put(it.getKey(), it.getValue()));
82
        return ontologies;
83
    }
84

    
85
	public static Ontologies loadOntologies(final String json) throws IOException {
86
		return new Gson().fromJson(json, Ontologies.class);
87
	}
88

    
89
    private static Ontology loadOntologyProfilefromPath(final InputStream profile) {
90
        final String profileXML;
91
        try {
92
            profileXML = IOUtils.toString(profile);
93
        } catch (IOException e) {
94
            log.error(e);
95
            return null;
96
        }
97
        return getOntologyFromProfile(profileXML);
98
    }
99

    
100
    private static Ontology getOntologyFromProfile(final String profile) {
101
        SAXReader saxReader = new SAXReader();
102
        Document doc = null;
103
        StringReader reader = new StringReader(profile);
104

    
105
        try {
106
            doc = saxReader.read(reader);
107
        } catch (DocumentException e) {
108
            e.printStackTrace();
109
            throw new RuntimeException(e);
110
        }
111
        return new Ontology()
112
                .setCode(doc.valueOf("//ONTOLOGY_NAME/@code"))
113
                .setDescription(doc.valueOf("//ONTOLOGY_DESCRIPTION/text()"))
114
                .setTerms(asTerms(doc.selectNodes("//TERMS/TERM")));
115
    }
116

    
117
	private static Map<String,OntologyTerm> asTerms(final List list) {
118
		final Map<String, OntologyTerm> terms = Maps.newHashMap();
119
		if (list != null) {
120
			list.forEach(o -> {
121
				final Element e = (Element) o;
122
				final OntologyTerm ot = OntologyTerm.newInstance()
123
						.setCode(e.attributeValue("code"))
124
						.setEncoding(e.attributeValue("encoding"))
125
						.setEnglishName(e.attributeValue("english_name"))
126
						.setNativeName(e.attributeValue("native_name"))
127
						.setInverseCode(((Node) o).valueOf("./RELATIONS/RELATION[@type = 'inverseOf']/@code"));
128

    
129
				terms.put(ot.getCode(), ot);
130
			});
131
		}
132
		return terms;
133
	}
134

    
135
    @PostConstruct
136
    public void init() {
137
        OntologyLoader.staticServiceLocator = serviceLocator;
138
    }
139

    
140
}
(7-7/13)