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

    
33

    
34
			final String resolvedDate = VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='resolvedDate']");
35
			parsedObject.setResolvedDate(resolvedDate);
36

    
37

    
38
			final List<Node> pid = VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='pid']", Arrays.asList("type"));
39

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

    
42
			List<Node> collectedFromNodes =
43
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='collectedFrom']", Arrays.asList("name", "id", "mode", "completionStatus"));
44

    
45
            List<Node> resolvededFromNodes =
46
                    VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='resolvedFrom']", Arrays.asList("name", "id", "mode", "completionStatus"));
47

    
48
            final List<ObjectProvenance> provenances = new ArrayList<>();
49

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

    
61
            if (resolvededFromNodes != null && resolvededFromNodes.size() > 0) {
62
                resolvededFromNodes.forEach(it -> {
63
                    final DLIObjectProvenance provenance = new DLIObjectProvenance();
64
                    provenance.setDatasourceId(it.getAttributes().get("id"));
65
                    provenance.setDatasource(it.getAttributes().get("name"));
66
                    provenance.setProvisionMode("resolved");
67
                    provenance.setCompletionStatus(it.getAttributes().get("completionStatus"));
68
                    provenances.add(provenance);
69
                });
70
            }
71

    
72
			parsedObject.setDatasourceProvenance(provenances);
73
			parsedObject.setCompletionStatus(VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='completionStatus']"));
74

    
75
			List<Node> relatedIdentifiers =
76
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='relatedIdentifier']",
77
							Arrays.asList("relatedIdentifierType", "relationType", "entityType", "inverseRelationType"));
78

    
79
			if (relatedIdentifiers != null && relatedIdentifiers.size() > 0) {
80
				final List<ObjectRelation> relations = new ArrayList<>();
81
				relatedIdentifiers.forEach(relation -> {
82
					final String currentPid = relation.getTextValue();
83
					final String currentPidType = relation.getAttributes().get("relatedIdentifierType");
84
					final String currentType = relation.getAttributes().get("entityType");
85
                    final DLIObjectRelation currentRelation = new DLIObjectRelation();
86
                    currentRelation.setTargetPID(new PID(currentPid, currentPidType));
87
					currentRelation.setCompletionStatus(CompletionStatus.incomplete.toString());
88
					currentRelation.setSourcePid(parsedObject.getPid());
89
					currentRelation.setRelationSemantics(relation.getAttributes().get("relationType"));
90
					currentRelation.setInverseRelation(relation.getAttributes().get("inverseRelationType"));
91

    
92

    
93
					currentRelation.setTargetType(ObjectType.valueOf(currentType));
94
					if (parsedObject.getDatasourceProvenance() != null && parsedObject.getDatasourceProvenance().size() > 0) {
95
                        final DLIObjectProvenance provenance = (DLIObjectProvenance) parsedObject.getDatasourceProvenance().get(0);
96

    
97
                        final DLIObjectProvenance newProvenance = new DLIObjectProvenance();
98
                        newProvenance.setCompletionStatus(CompletionStatus.incomplete.toString());
99
						newProvenance.setDatasourceId(provenance.getDatasourceId());
100
						newProvenance.setDatasource(provenance.getDatasource());
101
						newProvenance.setProvisionMode(provenance.getProvisionMode());
102
						currentRelation.setRelationProvenance(Arrays.asList(newProvenance));
103
					}
104

    
105
					relations.add(currentRelation);
106
				});
107
				parsedObject.setRelations(relations);
108
			}
109

    
110

    
111
			final List<String> authorsNode = VtdUtilityParser.getTextValue(ap, vn, "//*[local-name()='creator']");
112
			parsedObject.setAuthors(authorsNode);
113
			parsedObject.setTitles(VtdUtilityParser.getTextValue(ap, vn, "//*[local-name()='title']"));
114

    
115
			parsedObject.setDescription(VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='description']"));
116
			parsedObject.setDate(VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='date']"));
117
			List<Node> subjects = VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='subject']", Arrays.asList("scheme"));
118
            extractSubject(parsedObject, subjects);
119

    
120

    
121
			setType(parsedObject, VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='type']"));
122

    
123
			return parsedObject;
124
		} catch (Throwable e) {
125
			log.error("Input record: " + record);
126
			log.error("Error on parsing record ", e);
127
			return null;
128
		}
129

    
130
	}
131
}
(3-3/4)