Project

General

Profile

1
package eu.dnetlib.resolver.parser;
2

    
3
import java.util.ArrayList;
4
import java.util.Arrays;
5
import java.util.List;
6

    
7
import com.ximpleware.AutoPilot;
8
import com.ximpleware.VTDGen;
9
import com.ximpleware.VTDNav;
10
import eu.dnetlib.data.transform.VtdUtilityParser;
11
import eu.dnetlib.dli.resolver.model.*;
12

    
13
import eu.dnetlib.pid.resolver.model.ObjectType;
14
import org.apache.commons.lang3.StringUtils;
15
import org.apache.commons.logging.Log;
16
import org.apache.commons.logging.LogFactory;
17

    
18
/**
19
 * Created by sandro on 9/29/16.
20
 */
21
public class ScholixResolverParser extends AbstractResolverParser {
22

    
23
	private static final Log log = LogFactory.getLog(ScholixResolverParser.class);
24

    
25
	@Override
26
    public DLIResolvedObject parseObject(final String record) {
27

    
28
		try {
29
            final DLIResolvedObject parsedObject = new DLIResolvedObject();
30
            final VTDGen vg = new VTDGen();
31
			vg.setDoc(record.getBytes());
32
			vg.parse(true);
33

    
34
			final VTDNav vn = vg.getNav();
35
			final AutoPilot ap = new AutoPilot(vn);
36
            ap.declareXPathNameSpace("dri", "http://www.driver-repository.eu/namespace/dri");
37

    
38
            final String resolvedDate = VtdUtilityParser.getSingleValue(ap, vn, "//dri:resolvedDate");
39
            parsedObject.setResolvedDate(resolvedDate);
40

    
41
            //final String datasourcePrefix = VtdUtilityParser.getSingleValue(ap, vn, "//dri:datasourceprefix");
42
            ap.declareXPathNameSpace("oaf", "http://namespace.dnet.eu/oaf");
43

    
44
			final String completionStatus = VtdUtilityParser.getSingleValue(ap, vn, "//oaf:completionStatus");
45
            //final String provisionMode = VtdUtilityParser.getSingleValue(ap, vn, "//oaf:provisionMode");
46

    
47
			List<VtdUtilityParser.Node> provenances =
48
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//oaf:collectedFrom", Arrays.asList("completionStatus", "id", "name"));
49

    
50

    
51
            ap.declareXPathNameSpace("scholix", "http://www.scholix.org");
52

    
53
            final String sourcePid = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/identifier/identifier");
54
            final String sourcePidTye = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/identifier/schema");
55
            final String sourceType = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/objectType/type");
56

    
57
            final String sourcePublisherId = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/publisher//identifier");
58
            final String sourcePublisher = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/publisher/name");
59

    
60

    
61
            if (StringUtils.isEmpty(sourcePid) || StringUtils.isEmpty(sourcePidTye)) {
62
                return null;
63
            }
64

    
65
            final List<DLIObjectProvenance> provenanceList = new ArrayList<>();
66
            if (provenances != null) {
67
				provenances.forEach(it -> {
68
                    final DLIObjectProvenance provenance = new DLIObjectProvenance();
69
                    provenance.setDatasourceId(it.getAttributes().get("id"));
70
					provenance.setDatasource(it.getAttributes().get("name"));
71
					provenance.setCompletionStatus(it.getAttributes().get("completionStatus"));
72
                    provenance.setPublisher(sourcePublisher);
73
                    provenance.setPublisherId(sourcePublisherId);
74
                    provenance.setProvisionMode("collected");
75
					provenanceList.add(provenance);
76

    
77
				});
78
			}
79

    
80

    
81
			parsedObject.setDatasourceProvenance(provenanceList);
82

    
83
			parsedObject.setCompletionStatus(completionStatus);
84

    
85
            parsedObject.setPid(sourcePid);
86
            parsedObject.setPidType(sourcePidTye);
87
            if (!StringUtils.isEmpty(sourceType))
88
                parsedObject.setType(ObjectType.valueOf(sourceType));
89

    
90
            final String sourceTitle = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:source/title");
91

    
92
            final List<String> creators = VtdUtilityParser.getTextValue(ap, vn, "//scholix:source//scholix:creatorName");
93

    
94
            if (!StringUtils.isEmpty(sourceTitle))
95
                parsedObject.setTitles(Arrays.asList(sourceTitle));
96
            if (creators != null) {
97
                final List<String> sourceCreators = new ArrayList<>();
98

    
99
                creators.forEach(
100
                        agent -> {
101
                            if (!StringUtils.isEmpty(agent)) {
102
                                sourceCreators.add(agent);
103
                            }
104
                        }
105
                );
106
                parsedObject.setAuthors(sourceCreators);
107
            }
108

    
109
            parsedObject.setDate(VtdUtilityParser.getSingleValue(ap, vn, "//scholix:link/scholix:publicationDate"));
110

    
111
            final String targetPid = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:target/identifier/identifier");
112
            final String targetPidTye = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:target/identifier/schema");
113
            final String targetType = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:target/objectType/type");
114

    
115

    
116
            if (StringUtils.isEmpty(targetPid) || StringUtils.isEmpty(targetPidTye)) {
117
                return null;
118
			}
119

    
120

    
121
            final String relationType = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:relashionship/name");
122
            final String inverseRelationSemantic = VtdUtilityParser.getSingleValue(ap, vn, "//scholix:relashionship/inverseRelashionship");
123

    
124

    
125
            final List<DLIObjectRelation> relations = new ArrayList<>();
126

    
127
            DLIObjectRelation relation = new DLIObjectRelation();
128
            relation.setCompletionStatus(CompletionStatus.incomplete.toString());
129
			relation.setRelationProvenance(parsedObject.getDatasourceProvenance());
130
            relation.setRelationSemantics(relationType);
131
            relation.setInverseRelation(inverseRelationSemantic);
132
            relation.setTargetPID(new PID(targetPid, targetPidTye));
133
            if (!StringUtils.isEmpty(targetType))
134
                relation.setTargetType(ObjectType.valueOf(targetType));
135
            relations.add(relation);
136
			parsedObject.setRelations(relations);
137

    
138
			return parsedObject;
139
		} catch (Throwable e) {
140
			log.error("Error on parsing parser");
141
		}
142
		return null;
143
	}
144
}
(5-5/5)