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
import java.util.function.Function;
29

    
30

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

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

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

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

    
44

    
45
    public String resolve(final String inputRecord) {
46

    
47
		final DLIResolvedObject inputObject = (DLIResolvedObject) parser.parse(inputRecord);
48
		if (inputObject==null)
49
			return null;
50
		if (StringUtils.isNoneBlank(inputObject.getResolvedDate()))
51
			return null;
52

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

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

    
62
        return resolveRelations(inputRecord, inputObject, shouldUpdate,s -> {
63

    
64
			try {
65
				return DLIUtils.getInverse(s);
66
			} catch (Exception e) {
67
				log.error("Error on getting Inverse relation from "+s, e);
68
				return "";
69
			}
70
		});
71

    
72
	}
73

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

    
81
		for (PIDResolver resolver : pluginResolver) {
82
            final DLIResolvedObject currentIdentifier = (DLIResolvedObject) resolver.retrievePID(currentPid.getId(), currentPid.getType(), offline);
83

    
84

    
85
            if (currentIdentifier != null && !StringUtils.isBlank(currentIdentifier.getPid()) && currentIdentifier.getPid().toLowerCase().equals(currentPid.getId().toLowerCase())) {
86
                final HashMap<String, ObjectType> result = new HashMap<>();
87
				result.put("dli_resolver::" + DLIUtils.generateIdentifier(currentIdentifier.getPid(), currentIdentifier.getPidType()),
88
						currentIdentifier.getType());
89
                return result;
90
            }
91
		}
92
		return null;
93
	}
94

    
95
    private boolean tryToResolveRecord(final DLIResolvedObject object) {
96

    
97
		for (PIDResolver resolver : pluginResolver) {
98
            final DLIResolvedObject resolvedObject = (DLIResolvedObject) resolver.retrievePID(object.getPid(), object.getPidType(), offline);
99
            if (resolvedObject != null &&
100
					resolvedObject.getCompletionStatus() != null &&
101
                    resolvedObject.getCompletionStatus().equals(CompletionStatus.complete.toString())) {
102
                {
103
					object.setAuthors(resolvedObject.getAuthors());
104
					object.setTitles(resolvedObject.getTitles());
105
					object.setCompletionStatus(resolvedObject.getCompletionStatus());
106
					object.setDate(resolvedObject.getDate());
107
					object.getDatasourceProvenance().addAll(resolvedObject.getDatasourceProvenance());
108
					object.setDescription(resolvedObject.getDescription());
109
					object.setSubjects(resolvedObject.getSubjects());
110
					object.setType(resolvedObject.getType());
111
					log.debug("Record Resolved by " + resolver.getClass().getCanonicalName() + "  PID: " + object.getPid());
112
					return true;
113
				}
114
			}
115
		}
116
		log.debug("Record NOT Resolved  PID: " + object.getPid());
117
		return false;
118
	}
119

    
120
	public void setPluginResolver(final List<PIDResolver> pluginResolver) {
121
		this.pluginResolver = pluginResolver;
122
	}
123

    
124

    
125
	public BlockingQueue<DBObject> getInputQueue() {
126
		return inputQueue;
127
	}
128

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

    
133
	public MongoCollection<DBObject> getOutputCollection() {
134
		return outputCollection;
135
	}
136

    
137
	public void setOutputCollection(final MongoCollection<DBObject> outputCollection) {
138
		this.outputCollection = outputCollection;
139
	}
140

    
141
	public void setSerializer(final ResolverSerializer serializer) {
142
        final DLIResolverSerializer tmp = new DLIResolverSerializer();
143
        tmp.setPmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getPmfTemplate().getTemplate()));
144
        tmp.setDmfTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getDmfTemplate().getTemplate()));
145
        tmp.setScholixTemplate(new StringTemplate(((DLIResolverSerializer) serializer).getScholixTemplate().getTemplate()));
146
        this.serializer = tmp;
147
	}
148
}
(2-2/3)