Project

General

Profile

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

    
3
import java.util.List;
4
import java.util.concurrent.BlockingQueue;
5
import java.util.concurrent.Callable;
6

    
7
import com.mongodb.DBObject;
8
import com.mongodb.client.MongoCollection;
9
import eu.dnetlib.resolver.PIDResolver;
10
import eu.dnetlib.resolver.model.CompletionStatus;
11
import eu.dnetlib.resolver.model.ObjectRelation;
12
import eu.dnetlib.resolver.model.PID;
13
import eu.dnetlib.resolver.model.ResolvedObject;
14
import eu.dnetlib.resolver.model.serializer.ResolverSerializer;
15
import eu.dnetlib.resolver.parser.DMFResolverParser;
16
import org.antlr.stringtemplate.StringTemplate;
17
import org.apache.commons.lang3.StringUtils;
18
import org.apache.commons.logging.Log;
19
import org.apache.commons.logging.LogFactory;
20

    
21
/**
22
 * Created by sandro on 9/22/16.
23
 */
24
public class RecordResolver implements Callable<Boolean> {
25

    
26
	private static final Log log = LogFactory.getLog(RecordResolver.class);
27
	private final ResolverSerializer serializer = new ResolverSerializer();
28
	private final DMFResolverParser parser = new DMFResolverParser();
29
	private List<PIDResolver> pluginResolver;
30
	private BlockingQueue<DBObject> inputQueue;
31
	private MongoCollection<DBObject> outputCollection;
32

    
33
	public String resolve(final String inputRecord) {
34
		final ResolvedObject inputObject = parser.parseObject(inputRecord);
35
		boolean shouldUpdate = false;
36
		if (inputObject.getCompletionStatus() == null || !inputObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
37
			shouldUpdate = shouldUpdate || tryToResolveRecord(inputObject);
38
		}
39
		if (inputObject.getRelations() != null) {
40
			for (ObjectRelation rel : inputObject.getRelations()) {
41
				final String dnetId = tryToResolveRelation(rel.getTargetPID());
42
				if (dnetId != null && !StringUtils.isEmpty(dnetId)) {
43
					rel.setTargetPID(new PID(dnetId, "dnet"));
44
					shouldUpdate = true;
45
				}
46
			}
47
			if (shouldUpdate) {
48
				final String newXML = serializer.serializeReplacingXML(inputRecord, inputObject);
49
				return newXML;
50
			}
51
		}
52
		return null;
53
	}
54

    
55
	public void setTemplate(final StringTemplate template) {
56
		serializer.setDmfTemplate(template);
57
	}
58

    
59
	private String tryToResolveRelation(final PID currentPid) {
60
		if (currentPid.getId() != null && currentPid.getId().contains("dli_resolver")) {
61
			return null;
62
		}
63
		for (PIDResolver resolver : pluginResolver) {
64
			final String currentIdentifier = resolver.retrieveDnetID(currentPid.getId(), currentPid.getType());
65
			if (currentIdentifier != null && !StringUtils.isBlank(currentIdentifier)) {
66
				return currentIdentifier;
67
			}
68
		}
69
		return null;
70
	}
71

    
72
	private boolean tryToResolveRecord(final ResolvedObject object) {
73

    
74
		for (PIDResolver resolver : pluginResolver) {
75
			final ResolvedObject resolvedObject = resolver.retrievePID(object.getPid(), object.getPidType());
76
			if (resolvedObject != null &&
77
					resolvedObject.getCompletionStatus() != null &&
78
					resolvedObject.getCompletionStatus().toString().equals(CompletionStatus.complete.toString())) {
79
				{
80
					object.setAuthors(resolvedObject.getAuthors());
81
					object.setTitles(resolvedObject.getTitles());
82
					object.setCompletionStatus(resolvedObject.getCompletionStatus());
83
					object.setDate(resolvedObject.getDate());
84
					object.getDatasourceProvenance().addAll(resolvedObject.getDatasourceProvenance());
85
					object.setType(resolvedObject.getType());
86
					return true;
87
				}
88
			}
89
		}
90
		return false;
91
	}
92

    
93
	public List<PIDResolver> getPluginResolver() {
94
		return pluginResolver;
95
	}
96

    
97
	public void setPluginResolver(final List<PIDResolver> pluginResolver) {
98
		this.pluginResolver = pluginResolver;
99
	}
100

    
101
	@Override
102
	public Boolean call() throws Exception {
103
		DBObject currentObject = inputQueue.take();
104
		while (currentObject != ResolverMDStorePlugin.DONE) {
105
			try {
106
				final String currentRecord = (String) currentObject.get("body");
107

    
108
				final String resolvedRecord = resolve(currentRecord);
109
				if (resolvedRecord != null) {
110
					currentObject.put("body", resolvedRecord);
111
					outputCollection.insertOne(currentObject);
112
				}
113

    
114
				currentObject = inputQueue.take();
115
			} catch (Throwable e) {
116
				log.error("Error on resolving objects ", e);
117
				return false;
118
			}
119
		}
120
		if (currentObject == ResolverMDStorePlugin.DONE) {
121
			inputQueue.put(currentObject);
122
		}
123
		return true;
124

    
125
	}
126

    
127
	public BlockingQueue<DBObject> getInputQueue() {
128
		return inputQueue;
129
	}
130

    
131
	public void setInputQueue(final BlockingQueue<DBObject> inputQueue) {
132
		this.inputQueue = inputQueue;
133
	}
134

    
135
	public MongoCollection<DBObject> getOutputCollection() {
136
		return outputCollection;
137
	}
138

    
139
	public void setOutputCollection(final MongoCollection<DBObject> outputCollection) {
140
		this.outputCollection = outputCollection;
141
	}
142
}
(1-1/2)