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.dli.resolver.model.*;
11
import eu.dnetlib.data.transform.VtdUtilityParser;
12
import eu.dnetlib.data.transform.VtdUtilityParser.Node;
13
import eu.dnetlib.pid.resolver.model.*;
14
import eu.dnetlib.pid.resolver.parser.AbstractResolverParser;
15

    
16
/**
17
 * Created by sandro on 9/13/16.
18
 */
19
public class PMFResolverParser extends AbstractResolverParser {
20

    
21
	@Override
22
    public DLIResolvedObject parseObject(final String record) {
23
        try {
24
            final DLIResolvedObject parsedObject = new DLIResolvedObject();
25
            final VTDGen vg = new VTDGen();
26
			vg.setDoc(record.getBytes());
27
			vg.parse(true);
28

    
29
			final VTDNav vn = vg.getNav();
30
			final AutoPilot ap = new AutoPilot(vn);
31

    
32
			ap.declareXPathNameSpace("dri", "http://www.driver-repository.eu/namespace/dri");
33

    
34
			final String resolvedDate = VtdUtilityParser.getSingleValue(ap, vn, "//dri:resolvedDate");
35
			parsedObject.setResolvedDate(resolvedDate);
36

    
37
			ap.declareXPathNameSpace("oaf", "http://namespace.dnet.eu/oaf");
38
			final List<Node> pid = VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//oaf:pid", Arrays.asList("type"));
39

    
40
            if (extractIdentifier(parsedObject, pid)) return null;
41

    
42
			List<Node> collectedFromNodes =
43
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//oaf:collectedFrom", Arrays.asList("name", "id", "mode", "completionStatus"));
44

    
45
            final List<ObjectProvenance> provenances = new ArrayList<>();
46

    
47
			if (collectedFromNodes != null && collectedFromNodes.size() > 0) {
48
				collectedFromNodes.forEach(it -> {
49
                    final DLIObjectProvenance provenance = new DLIObjectProvenance();
50
                    provenance.setDatasourceId(it.getAttributes().get("id"));
51
					provenance.setDatasource(it.getAttributes().get("name"));
52
					provenance.setProvisionMode(it.getAttributes().get("mode"));
53
					provenance.setCompletionStatus(it.getAttributes().get("completionStatus"));
54
					provenances.add(provenance);
55
				});
56
			}
57

    
58
			parsedObject.setDatasourceProvenance(provenances);
59
			parsedObject.setCompletionStatus(VtdUtilityParser.getSingleValue(ap, vn, "//oaf:completionStatus"));
60

    
61
			List<Node> relatedIdentifiers =
62
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//oaf:relatedIdentifier",
63
							Arrays.asList("relatedIdentifierType", "relationType", "entityType", "inverseRelationType"));
64

    
65
			if (relatedIdentifiers != null && relatedIdentifiers.size() > 0) {
66
				final List<ObjectRelation> relations = new ArrayList<>();
67
				relatedIdentifiers.forEach(relation -> {
68
					final String currentPid = relation.getTextValue();
69
					final String currentPidType = relation.getAttributes().get("relatedIdentifierType");
70
					final String currentType = relation.getAttributes().get("entityType");
71
                    final DLIObjectRelation currentRelation = new DLIObjectRelation();
72
                    currentRelation.setTargetPID(new PID(currentPid, currentPidType));
73
					currentRelation.setCompletionStatus(CompletionStatus.incomplete.toString());
74
					currentRelation.setSourcePid(parsedObject.getPid());
75
					currentRelation.setRelationSemantics(relation.getAttributes().get("relationType"));
76
					currentRelation.setInverseRelation(relation.getAttributes().get("inverseRelationType"));
77

    
78

    
79
					currentRelation.setTargetType(ObjectType.valueOf(currentType));
80
					if (parsedObject.getDatasourceProvenance() != null && parsedObject.getDatasourceProvenance().size() > 0) {
81
                        final DLIObjectProvenance provenance = (DLIObjectProvenance) parsedObject.getDatasourceProvenance().get(0);
82

    
83
                        final DLIObjectProvenance newProvenance = new DLIObjectProvenance();
84
                        newProvenance.setCompletionStatus(CompletionStatus.incomplete.toString());
85
						newProvenance.setDatasourceId(provenance.getDatasourceId());
86
						newProvenance.setDatasource(provenance.getDatasource());
87
						newProvenance.setProvisionMode(provenance.getProvisionMode());
88
						currentRelation.setRelationProvenance(Arrays.asList(newProvenance));
89
					}
90

    
91
					relations.add(currentRelation);
92
				});
93
				parsedObject.setRelations(relations);
94
			}
95

    
96
			ap.declareXPathNameSpace("dc", "http://purl.org/dc/elements/1.1/");
97
			final List<String> authorsNode = VtdUtilityParser.getTextValue(ap, vn, "//dc:creator");
98
			parsedObject.setAuthors(authorsNode);
99
			parsedObject.setTitles(VtdUtilityParser.getTextValue(ap, vn, "//dc:title"));
100

    
101
			parsedObject.setDescription(VtdUtilityParser.getSingleValue(ap, vn, "//dc:description"));
102
			parsedObject.setDate(VtdUtilityParser.getSingleValue(ap, vn, "//dc:date"));
103
			List<Node> subjects = VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//dc:subject", Arrays.asList("scheme"));
104
            extractSubject(parsedObject, subjects);
105

    
106

    
107
			setType(parsedObject, VtdUtilityParser.getSingleValue(ap, vn, "//dc:type"));
108

    
109
			return parsedObject;
110
		} catch (Throwable e) {
111
			log.debug("Input record: " + record);
112
			log.error("Error on parsing record ", e);
113
			return null;
114
		}
115

    
116
	}
117
}
(3-3/4)