Project

General

Profile

1
package eu.dnetlib.resolver.mdstore.plugin;
2

    
3
import com.mongodb.DBObject;
4
import com.mongodb.client.MongoCollection;
5
import eu.dnetlib.dli.DLIUtils;
6
import eu.dnetlib.dli.resolver.model.CompletionStatus;
7
import eu.dnetlib.dli.resolver.model.DLIObjectRelation;
8
import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
9
import eu.dnetlib.dli.resolver.model.serializer.DLIResolverSerializer;
10
import eu.dnetlib.pid.resolver.PIDResolver;
11
import eu.dnetlib.pid.resolver.mdstore.plugin.AbstractRecordResolver;
12
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
import eu.dnetlib.pid.resolver.model.ObjectRelation;
16
import eu.dnetlib.pid.resolver.model.ObjectType;
17
import eu.dnetlib.pid.resolver.model.PID;
18
import eu.dnetlib.pid.resolver.model.ResolvedObject;
19
import eu.dnetlib.resolver.parser.DLIParser;
20
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
import java.util.HashMap;
26
import java.util.List;
27
import java.util.Map;
28
import java.util.concurrent.BlockingQueue;
29
import java.util.function.Function;
30

    
31

    
32
/**
33
 * Created by sandro on 9/22/16.
34
 */
35
public class DLIRecordResolver extends AbstractRecordResolver {
36

    
37
    private static final Log log = LogFactory.getLog(DLIRecordResolver.class);
38

    
39
	private final DLIParser parser = new DLIParser();
40

    
41
    public DLIRecordResolver(long ts, boolean forceResolver) {
42
        super(ts);
43
        this.forceResolver = forceResolver;
44
    }
45

    
46

    
47
    public String resolve(final String inputRecord) {
48

    
49
		final DLIResolvedObject inputObject = (DLIResolvedObject) parser.parse(inputRecord);
50
		if (inputObject==null)
51
			return null;
52
		if (!forceResolver && StringUtils.isNoneBlank(inputObject.getResolvedDate()))
53
			return null;
54

    
55
		if (!StringUtils.isBlank(inputObject.getPid())) {
56
			log.debug("trying to resolve " + inputObject.getPid());
57
		}
58

    
59
		boolean shouldUpdate = false;
60
		if (inputObject.getCompletionStatus() == null || !inputObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
61
			shouldUpdate = tryToResolveRecord(inputObject);
62
		}
63

    
64
        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
	}
75

    
76
    @Override
77
    protected Map<String, ObjectType> tryToResolveRelation(final PID currentPid) {
78
        if (currentPid.getId() != null && currentPid.getId().contains("dli_resolver")) {
79
			return null;
80
		}
81
		log.debug("tryToResolveRelation " + currentPid);
82

    
83
		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
		for (PIDResolver resolver : pluginResolver) {
87
            final DLIResolvedObject currentIdentifier = (DLIResolvedObject) resolver.retrievePID(currentPid.getId(), currentPid.getType(), offline);
88
			final Map<String, ObjectType> result = fixResolvedRelation(currentPid, currentIdentifier);
89
			if (result != null) return result;
90
		}
91
		return null;
92
	}
93

    
94
	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
		}
101
		return null;
102
	}
103

    
104
	private boolean tryToResolveRecord(final DLIResolvedObject object) {
105

    
106
		DLIResolvedObject resolvedObject1 = (DLIResolvedObject) pluginResolver.get(0).retrievePIDfromCache(object.getPid(), object.getPidType());
107
		if (fixResolvedObject(object, pluginResolver.get(0), resolvedObject1)) return true;
108

    
109
		for (PIDResolver resolver : pluginResolver) {
110
            final DLIResolvedObject resolvedObject = (DLIResolvedObject) resolver.retrievePID(object.getPid(), object.getPidType(), offline);
111
			if (fixResolvedObject(object, resolver, resolvedObject)) return true;
112
		}
113
		log.debug("Record NOT Resolved  PID: " + object.getPid());
114
		return false;
115
	}
116

    
117
	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
	public void setPluginResolver(final List<PIDResolver> pluginResolver) {
138
		this.pluginResolver = pluginResolver;
139
	}
140

    
141

    
142
	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

    
158
	public void setSerializer(final ResolverSerializer serializer) {
159
        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
	}
165
}
(2-2/3)