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.resolver.parser.DLIParser;
19
import org.antlr.stringtemplate.StringTemplate;
20
import org.apache.commons.lang3.StringUtils;
21
import org.apache.commons.logging.Log;
22
import org.apache.commons.logging.LogFactory;
23

    
24
import java.util.HashMap;
25
import java.util.List;
26
import java.util.Map;
27
import java.util.concurrent.BlockingQueue;
28

    
29

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

    
35
    private static final Log log = LogFactory.getLog(DLIRecordResolver.class);
36

    
37
	private final DLIParser parser = new DLIParser();
38

    
39
    public DLIRecordResolver(long ts) {
40
        super(ts);
41
    }
42

    
43

    
44
    public String resolve(final String inputRecord) {
45

    
46
		final DLIResolvedObject inputObject = (DLIResolvedObject) parser.parse(inputRecord);
47
		if (inputObject != null && StringUtils.isNoneBlank(inputObject.getResolvedDate()))
48
			return null;
49

    
50
		if (inputObject != null && !StringUtils.isBlank(inputObject.getPid())) {
51
			log.debug("trying to resolve " + inputObject.getPid());
52
		}
53

    
54
		boolean shouldUpdate = false;
55
		if (inputObject.getCompletionStatus() == null || !inputObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
56
			shouldUpdate = shouldUpdate || tryToResolveRecord(inputObject);
57
		}
58
        return resolveRelations(inputRecord, inputObject, shouldUpdate);
59

    
60
	}
61

    
62
    @Override
63
    protected Map<String, ObjectType> tryToResolveRelation(final PID currentPid) {
64
        if (currentPid.getId() != null && currentPid.getId().contains("dli_resolver")) {
65
			return null;
66
		}
67
		log.debug("tryToResolveRelation " + currentPid);
68

    
69
		for (PIDResolver resolver : pluginResolver) {
70
            final DLIResolvedObject currentIdentifier = (DLIResolvedObject) resolver.retrievePID(currentPid.getId(), currentPid.getType(), offline);
71

    
72

    
73
            if (currentIdentifier != null && !StringUtils.isBlank(currentIdentifier.getPid()) && currentIdentifier.getPid().toLowerCase().equals(currentPid.getId().toLowerCase())) {
74
                final HashMap<String, ObjectType> result = new HashMap<>();
75
				result.put("dli_resolver::" + DLIUtils.generateIdentifier(currentIdentifier.getPid(), currentIdentifier.getPidType()),
76
						currentIdentifier.getType());
77
                return result;
78
            }
79
		}
80
		return null;
81
	}
82

    
83
    private boolean tryToResolveRecord(final DLIResolvedObject object) {
84

    
85
		for (PIDResolver resolver : pluginResolver) {
86
            final DLIResolvedObject resolvedObject = (DLIResolvedObject) resolver.retrievePID(object.getPid(), object.getPidType(), offline);
87
            if (resolvedObject != null &&
88
					resolvedObject.getCompletionStatus() != null &&
89
                    resolvedObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
90
                {
91
					object.setAuthors(resolvedObject.getAuthors());
92
					object.setTitles(resolvedObject.getTitles());
93
					object.setCompletionStatus(resolvedObject.getCompletionStatus());
94
					object.setDate(resolvedObject.getDate());
95
					object.getDatasourceProvenance().addAll(resolvedObject.getDatasourceProvenance());
96
					object.setDescription(resolvedObject.getDescription());
97
					object.setSubjects(resolvedObject.getSubjects());
98
					object.setType(resolvedObject.getType());
99
					log.debug("Record Resolved by " + resolver.getClass().getCanonicalName() + "  PID: " + object.getPid());
100
					return true;
101
				}
102
			}
103
		}
104
		log.debug("Record NOT Resolved  PID: " + object.getPid());
105
		return false;
106
	}
107

    
108
	public void setPluginResolver(final List<PIDResolver> pluginResolver) {
109
		this.pluginResolver = pluginResolver;
110
	}
111

    
112

    
113
	public BlockingQueue<DBObject> getInputQueue() {
114
		return inputQueue;
115
	}
116

    
117
	public void setInputQueue(final BlockingQueue<DBObject> inputQueue) {
118
		this.inputQueue = inputQueue;
119
	}
120

    
121
	public MongoCollection<DBObject> getOutputCollection() {
122
		return outputCollection;
123
	}
124

    
125
	public void setOutputCollection(final MongoCollection<DBObject> outputCollection) {
126
		this.outputCollection = outputCollection;
127
	}
128

    
129
	public void setSerializer(final ResolverSerializer serializer) {
130
        final DLIResolverSerializer tmp = new DLIResolverSerializer();
131
        tmp.setPmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getPmfTemplate().getTemplate()));
132
        tmp.setDmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getDmfTemplate().getTemplate()));
133
        tmp.setScholixTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getScholixTemplate().getTemplate()));
134
        this.serializer = tmp;
135
	}
136
}
(1-1/2)