Project

General

Profile

1
package eu.dnetlib.dli.resolver;
2

    
3
import com.google.common.collect.Lists;
4
import com.google.gson.JsonArray;
5
import com.google.gson.JsonElement;
6
import com.google.gson.JsonObject;
7
import com.google.gson.JsonParser;
8
import eu.dnetlib.dli.resolver.model.CompletionStatus;
9
import eu.dnetlib.dli.resolver.model.DLIObjectProvenance;
10
import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
11
import eu.dnetlib.pid.resolver.AbstractPIDResolver;
12
import org.apache.commons.logging.Log;
13
import org.apache.commons.logging.LogFactory;
14

    
15
import java.net.URLEncoder;
16
import java.util.Arrays;
17

    
18
public class OpenaireResolver extends AbstractPIDResolver {
19

    
20
	private final static String templateURL = "objidentifier:\"%s\"";
21
	private final static String OPENAIRE_NS_PREFIX = "openaire____";
22
	private final static String baseURL = "http://solr.openaire.eu:8983/solr/TMF-index-openaire_shard1_replica1/select?q=%s&wt=json";
23

    
24
	private static final Log log = LogFactory.getLog(OpenaireResolver.class); // NOPMD by marko on 11/24/08 5:02 PM
25

    
26

    
27
	private final OpenAireParser parser = new OpenAireParser();
28

    
29

    
30
    @Override
31
	protected boolean canResolvePid(final String pidType) {
32
		return (pidType != null && pidType.toLowerCase().equals("openaire"));
33
	}
34

    
35
	@Override
36
    protected DLIResolvedObject resolve(final String pid, final String pidType) {
37
        try {
38
			final String currentQuery = String.format(baseURL, URLEncoder.encode(String.format(templateURL, pid.replace("oai:dnet:", "")), "UTF-8"));
39
            DLIResolvedObject obj = parsingResponse(requestURL(currentQuery));
40
            if (obj == null)
41
				return null;
42
			obj.setPidType(pidType);
43
			obj.setPid(pid);
44
			return obj;
45
		} catch (Throwable e) {
46
			log.error("Error on resolve pid " + pid, e);
47
		}
48
		return null;
49
	}
50

    
51
    private DLIResolvedObject parsingResponse(final String response) {
52
        if (response == null) return null;
53
		final JsonElement jElement = new JsonParser().parse(response);
54
		final JsonObject jobject = jElement.getAsJsonObject();
55
		if (jobject.has("response")) {
56
			long total = jobject.get("response").getAsJsonObject().get("numFound").getAsLong();
57
			if (total == 0) return null;
58
			JsonArray hits = ((JsonObject) jobject.get("response")).get("docs").getAsJsonArray();
59
			JsonElement s = ((JsonObject) hits.get(0)).get("__result").getAsJsonArray().get(0);
60
            final DLIResolvedObject resolvedObject = parser.parseObject(s.getAsString());
61
            resolvedObject.setRelations(Lists.newArrayList());
62
            final DLIObjectProvenance op = new DLIObjectProvenance();
63
            op.setDatasource("OpenAIRE");
64
			op.setDatasourceId("dli_________::openaire");
65
			op.setCompletionStatus(CompletionStatus.complete.toString());
66
			op.setProvisionMode("resolved");
67
			resolvedObject.setCompletionStatus(CompletionStatus.complete.toString());
68
			resolvedObject.setDatasourceProvenance(Arrays.asList(op));
69
			return resolvedObject;
70
		}
71
		return null;
72
	}
73
}
(14-14/17)