Project

General

Profile

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
}