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 OPENAIRE_NS_PREFIX = "openaire____";
21
	private final static String baseURL = "http://solr.openaire.eu:8983/solr/DMF-index-openaire_shard1_replica1/select?q=%s&wt=json";
22

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

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

    
27
	private OpenAireParser parser = new OpenAireParser();
28

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

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

    
54
	private ResolvedObject parsingResponse(final String response) {
55
		if (response == null) return null;
56

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

    
68
	}
69
}
(9-9/14)