1 |
43783
|
sandro.lab
|
package eu.dnetlib.resolver.mdstore.plugin;
|
2 |
|
|
|
3 |
|
|
import com.mongodb.DBObject;
|
4 |
|
|
import com.mongodb.client.MongoCollection;
|
5 |
45816
|
sandro.lab
|
import eu.dnetlib.dli.DLIUtils;
|
6 |
49184
|
sandro.lab
|
import eu.dnetlib.dli.resolver.model.CompletionStatus;
|
7 |
|
|
import eu.dnetlib.dli.resolver.model.DLIObjectRelation;
|
8 |
|
|
import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
|
9 |
49208
|
sandro.lab
|
import eu.dnetlib.dli.resolver.model.serializer.DLIResolverSerializer;
|
10 |
49184
|
sandro.lab
|
import eu.dnetlib.pid.resolver.PIDResolver;
|
11 |
49384
|
sandro.lab
|
import eu.dnetlib.pid.resolver.mdstore.plugin.AbstractRecordResolver;
|
12 |
49208
|
sandro.lab
|
import eu.dnetlib.pid.resolver.mdstore.plugin.RecordResolver;
|
13 |
|
|
import eu.dnetlib.pid.resolver.mdstore.plugin.ResolverMDStorePlugin;
|
14 |
|
|
import eu.dnetlib.pid.resolver.mdstore.plugin.ResolverSerializer;
|
15 |
49216
|
sandro.lab
|
import eu.dnetlib.pid.resolver.model.ObjectRelation;
|
16 |
49184
|
sandro.lab
|
import eu.dnetlib.pid.resolver.model.ObjectType;
|
17 |
49216
|
sandro.lab
|
import eu.dnetlib.pid.resolver.model.PID;
|
18 |
55169
|
sandro.lab
|
import eu.dnetlib.pid.resolver.model.ResolvedObject;
|
19 |
44050
|
sandro.lab
|
import eu.dnetlib.resolver.parser.DLIParser;
|
20 |
43783
|
sandro.lab
|
import org.antlr.stringtemplate.StringTemplate;
|
21 |
|
|
import org.apache.commons.lang3.StringUtils;
|
22 |
|
|
import org.apache.commons.logging.Log;
|
23 |
|
|
import org.apache.commons.logging.LogFactory;
|
24 |
|
|
|
25 |
49184
|
sandro.lab
|
import java.util.HashMap;
|
26 |
|
|
import java.util.List;
|
27 |
|
|
import java.util.Map;
|
28 |
|
|
import java.util.concurrent.BlockingQueue;
|
29 |
54390
|
sandro.lab
|
import java.util.function.Function;
|
30 |
45816
|
sandro.lab
|
|
31 |
49208
|
sandro.lab
|
|
32 |
43783
|
sandro.lab
|
/**
|
33 |
|
|
* Created by sandro on 9/22/16.
|
34 |
|
|
*/
|
35 |
49384
|
sandro.lab
|
public class DLIRecordResolver extends AbstractRecordResolver {
|
36 |
43783
|
sandro.lab
|
|
37 |
49208
|
sandro.lab
|
private static final Log log = LogFactory.getLog(DLIRecordResolver.class);
|
38 |
44050
|
sandro.lab
|
|
39 |
|
|
private final DLIParser parser = new DLIParser();
|
40 |
|
|
|
41 |
54884
|
sandro.lab
|
public DLIRecordResolver(long ts, boolean forceResolver) {
|
42 |
49384
|
sandro.lab
|
super(ts);
|
43 |
54884
|
sandro.lab
|
this.forceResolver = forceResolver;
|
44 |
45917
|
sandro.lab
|
}
|
45 |
|
|
|
46 |
49384
|
sandro.lab
|
|
47 |
49208
|
sandro.lab
|
public String resolve(final String inputRecord) {
|
48 |
44050
|
sandro.lab
|
|
49 |
49216
|
sandro.lab
|
final DLIResolvedObject inputObject = (DLIResolvedObject) parser.parse(inputRecord);
|
50 |
49752
|
sandro.lab
|
if (inputObject==null)
|
51 |
45835
|
sandro.lab
|
return null;
|
52 |
54884
|
sandro.lab
|
if (!forceResolver && StringUtils.isNoneBlank(inputObject.getResolvedDate()))
|
53 |
49752
|
sandro.lab
|
return null;
|
54 |
45628
|
sandro.lab
|
|
55 |
49752
|
sandro.lab
|
if (!StringUtils.isBlank(inputObject.getPid())) {
|
56 |
45628
|
sandro.lab
|
log.debug("trying to resolve " + inputObject.getPid());
|
57 |
|
|
}
|
58 |
|
|
|
59 |
43783
|
sandro.lab
|
boolean shouldUpdate = false;
|
60 |
|
|
if (inputObject.getCompletionStatus() == null || !inputObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
|
61 |
54287
|
sandro.lab
|
shouldUpdate = tryToResolveRecord(inputObject);
|
62 |
43783
|
sandro.lab
|
}
|
63 |
|
|
|
64 |
54390
|
sandro.lab
|
return resolveRelations(inputRecord, inputObject, shouldUpdate,s -> {
|
65 |
|
|
|
66 |
|
|
try {
|
67 |
|
|
return DLIUtils.getInverse(s);
|
68 |
|
|
} catch (Exception e) {
|
69 |
|
|
log.error("Error on getting Inverse relation from "+s, e);
|
70 |
|
|
return "";
|
71 |
|
|
}
|
72 |
|
|
});
|
73 |
|
|
|
74 |
43783
|
sandro.lab
|
}
|
75 |
|
|
|
76 |
49384
|
sandro.lab
|
@Override
|
77 |
|
|
protected Map<String, ObjectType> tryToResolveRelation(final PID currentPid) {
|
78 |
45816
|
sandro.lab
|
if (currentPid.getId() != null && currentPid.getId().contains("dli_resolver")) {
|
79 |
43783
|
sandro.lab
|
return null;
|
80 |
|
|
}
|
81 |
45628
|
sandro.lab
|
log.debug("tryToResolveRelation " + currentPid);
|
82 |
|
|
|
83 |
55169
|
sandro.lab
|
DLIResolvedObject resolvedObject = (DLIResolvedObject) pluginResolver.get(0).retrievePIDfromCache(currentPid.getId(), currentPid.getType());
|
84 |
|
|
final Map<String, ObjectType> result_from_cache = fixResolvedRelation(currentPid, resolvedObject);
|
85 |
|
|
if (result_from_cache != null) return result_from_cache;
|
86 |
43783
|
sandro.lab
|
for (PIDResolver resolver : pluginResolver) {
|
87 |
49676
|
sandro.lab
|
final DLIResolvedObject currentIdentifier = (DLIResolvedObject) resolver.retrievePID(currentPid.getId(), currentPid.getType(), offline);
|
88 |
55169
|
sandro.lab
|
final Map<String, ObjectType> result = fixResolvedRelation(currentPid, currentIdentifier);
|
89 |
|
|
if (result != null) return result;
|
90 |
|
|
}
|
91 |
|
|
return null;
|
92 |
|
|
}
|
93 |
45816
|
sandro.lab
|
|
94 |
55169
|
sandro.lab
|
private Map<String, ObjectType> fixResolvedRelation(PID currentPid, DLIResolvedObject currentIdentifier) {
|
95 |
|
|
if (currentIdentifier != null && !StringUtils.isBlank(currentIdentifier.getPid()) && currentIdentifier.getPid().toLowerCase().equals(currentPid.getId().toLowerCase())) {
|
96 |
|
|
final HashMap<String, ObjectType> result = new HashMap<>();
|
97 |
|
|
result.put("dli_resolver::" + DLIUtils.generateIdentifier(currentIdentifier.getPid(), currentIdentifier.getPidType()),
|
98 |
|
|
currentIdentifier.getType());
|
99 |
|
|
return result;
|
100 |
43783
|
sandro.lab
|
}
|
101 |
|
|
return null;
|
102 |
|
|
}
|
103 |
|
|
|
104 |
55169
|
sandro.lab
|
private boolean tryToResolveRecord(final DLIResolvedObject object) {
|
105 |
43783
|
sandro.lab
|
|
106 |
55169
|
sandro.lab
|
DLIResolvedObject resolvedObject1 = (DLIResolvedObject) pluginResolver.get(0).retrievePIDfromCache(object.getPid(), object.getPidType());
|
107 |
|
|
if (fixResolvedObject(object, pluginResolver.get(0), resolvedObject1)) return true;
|
108 |
|
|
|
109 |
43783
|
sandro.lab
|
for (PIDResolver resolver : pluginResolver) {
|
110 |
49676
|
sandro.lab
|
final DLIResolvedObject resolvedObject = (DLIResolvedObject) resolver.retrievePID(object.getPid(), object.getPidType(), offline);
|
111 |
55169
|
sandro.lab
|
if (fixResolvedObject(object, resolver, resolvedObject)) return true;
|
112 |
43783
|
sandro.lab
|
}
|
113 |
45628
|
sandro.lab
|
log.debug("Record NOT Resolved PID: " + object.getPid());
|
114 |
43783
|
sandro.lab
|
return false;
|
115 |
|
|
}
|
116 |
|
|
|
117 |
55169
|
sandro.lab
|
private boolean fixResolvedObject(DLIResolvedObject object, PIDResolver resolver, DLIResolvedObject resolvedObject) {
|
118 |
|
|
if (resolvedObject != null &&
|
119 |
|
|
resolvedObject.getCompletionStatus() != null &&
|
120 |
|
|
resolvedObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
|
121 |
|
|
{
|
122 |
|
|
object.setAuthors(resolvedObject.getAuthors());
|
123 |
|
|
object.setTitles(resolvedObject.getTitles());
|
124 |
|
|
object.setCompletionStatus(resolvedObject.getCompletionStatus());
|
125 |
|
|
object.setDate(resolvedObject.getDate());
|
126 |
|
|
object.getDatasourceProvenance().addAll(resolvedObject.getDatasourceProvenance());
|
127 |
|
|
object.setDescription(resolvedObject.getDescription());
|
128 |
|
|
object.setSubjects(resolvedObject.getSubjects());
|
129 |
|
|
object.setType(resolvedObject.getType());
|
130 |
|
|
log.debug("Record Resolved by " + resolver.getClass().getCanonicalName() + " PID: " + object.getPid());
|
131 |
|
|
return true;
|
132 |
|
|
}
|
133 |
|
|
}
|
134 |
|
|
return false;
|
135 |
|
|
}
|
136 |
|
|
|
137 |
43783
|
sandro.lab
|
public void setPluginResolver(final List<PIDResolver> pluginResolver) {
|
138 |
|
|
this.pluginResolver = pluginResolver;
|
139 |
|
|
}
|
140 |
|
|
|
141 |
46475
|
sandro.lab
|
|
142 |
43783
|
sandro.lab
|
public BlockingQueue<DBObject> getInputQueue() {
|
143 |
|
|
return inputQueue;
|
144 |
|
|
}
|
145 |
|
|
|
146 |
|
|
public void setInputQueue(final BlockingQueue<DBObject> inputQueue) {
|
147 |
|
|
this.inputQueue = inputQueue;
|
148 |
|
|
}
|
149 |
|
|
|
150 |
|
|
public MongoCollection<DBObject> getOutputCollection() {
|
151 |
|
|
return outputCollection;
|
152 |
|
|
}
|
153 |
|
|
|
154 |
|
|
public void setOutputCollection(final MongoCollection<DBObject> outputCollection) {
|
155 |
|
|
this.outputCollection = outputCollection;
|
156 |
|
|
}
|
157 |
44050
|
sandro.lab
|
|
158 |
|
|
public void setSerializer(final ResolverSerializer serializer) {
|
159 |
49208
|
sandro.lab
|
final DLIResolverSerializer tmp = new DLIResolverSerializer();
|
160 |
|
|
tmp.setPmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getPmfTemplate().getTemplate()));
|
161 |
|
|
tmp.setDmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getDmfTemplate().getTemplate()));
|
162 |
|
|
tmp.setScholixTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getScholixTemplate().getTemplate()));
|
163 |
|
|
this.serializer = tmp;
|
164 |
44050
|
sandro.lab
|
}
|
165 |
43783
|
sandro.lab
|
}
|