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
            String provisionMode = VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='provisionMode']");
43

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

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

    
50
			final String publisher = VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='publisher']");
51
            final List<ObjectProvenance> provenances = new ArrayList<>();
52

    
53
			if (collectedFromNodes != null && collectedFromNodes.size() > 0) {
54
				collectedFromNodes.forEach(it -> {
55
                    final DLIObjectProvenance provenance = new DLIObjectProvenance();
56
                    provenance.setDatasourceId(it.getAttributes().get("id"));
57
					provenance.setDatasource(it.getAttributes().get("name"));
58
					provenance.setProvisionMode(provisionMode);
59
					provenance.setCompletionStatus(it.getAttributes().get("completionStatus"));
60
					provenance.setPublisher(publisher);
61
					provenances.add(provenance);
62
				});
63
			}
64

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

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

    
79

    
80

    
81

    
82

    
83
			List<Node> relatedIdentifiers =
84
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='relatedIdentifier']",
85
							Arrays.asList("relatedIdentifierType", "relationType", "entityType", "inverseRelationType"));
86

    
87
			if (relatedIdentifiers != null && relatedIdentifiers.size() > 0) {
88
				final List<ObjectRelation> relations = new ArrayList<>();
89
				relatedIdentifiers.forEach(relation -> {
90
					final String currentPid = relation.getTextValue();
91
					final String currentPidType = relation.getAttributes().get("relatedIdentifierType");
92
					final String currentType = relation.getAttributes().containsKey("entityType") ? relation.getAttributes().get("entityType"):"unknown" ;
93
                    final DLIObjectRelation currentRelation = new DLIObjectRelation();
94
                    currentRelation.setTargetPID(new PID(currentPid, currentPidType));
95
					currentRelation.setCompletionStatus(CompletionStatus.incomplete.toString());
96
					currentRelation.setSourcePid(parsedObject.getPid());
97
					currentRelation.setRelationSemantics(relation.getAttributes().get("relationType"));
98
					currentRelation.setInverseRelation(relation.getAttributes().get("inverseRelationType"));
99

    
100

    
101
					currentRelation.setTargetType(ObjectType.valueOf(currentType));
102
					if (parsedObject.getDatasourceProvenance() != null && parsedObject.getDatasourceProvenance().size() > 0) {
103
                        final DLIObjectProvenance provenance = (DLIObjectProvenance) parsedObject.getDatasourceProvenance().get(0);
104

    
105
                        final DLIObjectProvenance newProvenance = new DLIObjectProvenance();
106
                        newProvenance.setCompletionStatus(CompletionStatus.incomplete.toString());
107
						newProvenance.setDatasourceId(provenance.getDatasourceId());
108
						newProvenance.setDatasource(provenance.getDatasource());
109
						newProvenance.setProvisionMode(provenance.getProvisionMode());
110

    
111
						currentRelation.setRelationProvenance(Arrays.asList(newProvenance));
112
					}
113

    
114
					relations.add(currentRelation);
115
				});
116
				parsedObject.setRelations(relations);
117
			}
118

    
119
			final List<Node> hostedBy =
120
					VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='hostedBy']", Arrays.asList("id", "name"));
121

    
122

    
123
			if (hostedBy!= null) {
124
				hostedBy.stream().map(it->new OAFHostedBy(it.getAttributes().get("id"),it.getAttributes().get("name") )).forEach(parsedObject::setHostedBy);
125
			}
126

    
127

    
128
			final List<String> authorsNode = VtdUtilityParser.getTextValue(ap, vn, "//*[local-name()='creator']");
129
			parsedObject.setAuthors(authorsNode);
130
			parsedObject.setTitles(VtdUtilityParser.getTextValue(ap, vn, "//*[local-name()='title']"));
131

    
132
			parsedObject.setDescription(VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='description']"));
133
			parsedObject.setDate(VtdUtilityParser.getSingleValue(ap, vn, "//*[local-name()='date']"));
134
			List<Node> subjects = VtdUtilityParser.getTextValuesWithAttributes(ap, vn, "//*[local-name()='subject']", Arrays.asList("scheme"));
135
            extractSubject(parsedObject, subjects);
136

    
137

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

    
140
			return parsedObject;
141
		} catch (Throwable e) {
142
			log.error("Input record: " + record);
143
			log.error("Error on parsing record ", e);
144
			return null;
145
		}
146

    
147
	}
148
}
(3-3/4)