Project

General

Profile

1
package eu.dnetlib.resolver;
2

    
3
import java.net.URLEncoder;
4

    
5
import com.google.common.collect.Lists;
6
import com.google.gson.JsonArray;
7
import com.google.gson.JsonElement;
8
import com.google.gson.JsonObject;
9
import com.google.gson.JsonParser;
10
import eu.dnetlib.miscutils.functional.xml.ApplyXslt;
11
import eu.dnetlib.resolver.model.ObjectProvenance;
12
import eu.dnetlib.resolver.model.ResolvedObject;
13
import org.apache.commons.logging.Log;
14
import org.apache.commons.logging.LogFactory;
15
import org.springframework.core.io.ClassPathResource;
16

    
17
public class OpenaireResolver extends AbstractPIDResolver {
18

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

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

    
24
	private ApplyXslt xsltMapper = new ApplyXslt(new ClassPathResource("eu/dnetlib/resolver/xslt/openaire2Dli.xslt"));
25

    
26
	private OpenAireParser parser = new OpenAireParser();
27

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

    
33
	@Override
34
	protected ResolvedObject resolve(final String pid, final String pidType) {
35
		try {
36
			final String currentQuery = String.format(baseURL, URLEncoder.encode(String.format(templateURL, pid), "UTF-8"));
37
			ResolvedObject obj = parsingResponse(requestURL(currentQuery));
38
			if (obj == null)
39
				return null;
40
			obj.setPidType(pidType);
41
			obj.setPid(pid);
42
			ObjectProvenance provenance = new ObjectProvenance("dli::openaireResolver", "resolved", "complete", null, null, true);
43
			obj.fixContribution(provenance);
44
			obj.setDatasourceProvenance(Lists.newArrayList(provenance));
45
			return obj;
46
		} catch (Throwable e) {
47
			log.error("Error on resolve pid " + pid, e);
48
		}
49
		return null;
50
	}
51

    
52
	private ResolvedObject parsingResponse(final String response) {
53
		if (response == null) return null;
54

    
55
		JsonElement jElement = new JsonParser().parse(response);
56
		JsonObject jobject = jElement.getAsJsonObject();
57
		if (jobject.has("response")) {
58
			long total = jobject.get("response").getAsJsonObject().get("numFound").getAsLong();
59
			if (total == 0) return null;
60
			JsonArray hits = ((JsonObject) jobject.get("response")).get("docs").getAsJsonArray();
61
			JsonElement s = ((JsonObject) hits.get(0)).get("__result").getAsJsonArray().get(0);
62
			return parser.parseObject(s.getAsString());
63
		}
64
		return null;
65

    
66
	}
67
}
(9-9/14)