Project

General

Profile

1
package eu.dnetlib.pid.resolver;
2

    
3
import eu.dnetlib.pid.resolver.model.ObjectProvenance;
4
import eu.dnetlib.pid.resolver.model.ResolvedObject;
5
import eu.dnetlib.pid.resolver.store.ResolverStore;
6
import net.sf.ehcache.Cache;
7
import net.sf.ehcache.Element;
8
import org.apache.commons.lang3.StringUtils;
9
import org.apache.commons.logging.Log;
10
import org.apache.commons.logging.LogFactory;
11
import org.apache.http.HttpEntity;
12
import org.apache.http.client.ResponseHandler;
13
import org.apache.http.client.config.RequestConfig;
14
import org.apache.http.client.methods.HttpGet;
15
import org.apache.http.impl.client.CloseableHttpClient;
16
import org.apache.http.impl.client.HttpClientBuilder;
17
import org.apache.http.util.EntityUtils;
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.beans.factory.annotation.Required;
20

    
21
import java.io.IOException;
22

    
23
/**
24
 * Created by sandro on 9/8/16.
25
 */
26
public abstract class AbstractPIDResolver implements PIDResolver {
27

    
28
	private static final Log log = LogFactory.getLog(AbstractPIDResolver.class);
29
	private Cache cache;
30
	protected String name;
31
	protected int order;
32

    
33
	@Autowired
34
	private ResolverStore storeManager;
35

    
36
    private ResponseHandler<String> responseHandler = response -> {
37
		int status = response.getStatusLine().getStatusCode();
38
		if (status >= 200 && status < 300) {
39
			HttpEntity entity = response.getEntity();
40
			return entity != null ? EntityUtils.toString(entity) : null;
41
		} else {
42
			log.debug("Unexpected response status: " + status);
43
			return null;
44
		}
45
	};
46

    
47
//    public abstract void setDatasourceProvenance(final ObjectProvenance provenance, final String namespacePrefix);
48

    
49
	public ResolvedObject retrievePID(final String pid, final String pidType) {
50

    
51
		if (!canResolvePid(pidType)) return null;
52
        final String dnetIdentifier = storeManager.generateDNetIdentifier(pid, pidType);
53
        final Element item = cache.get(dnetIdentifier);
54

    
55
		if (item != null) return (ResolvedObject) item.getObjectValue();
56

    
57
        ResolvedObject resolvedObject = storeManager.getRecord(dnetIdentifier);
58

    
59
		if (resolvedObject != null) {
60
			cache.put(new Element(storeManager.generateDNetIdentifier(pid, pidType), resolvedObject));
61
			return resolvedObject;
62
		}
63

    
64
        log.debug("Cache miss for pid:" + pid + "  and type :" + pidType);
65
        resolvedObject = resolve(pid, pidType);
66
		if (resolvedObject != null) {
67
			storeManager.insertRecord(getName(), resolvedObject);
68
			cache.put(new Element(storeManager.generateDNetIdentifier(pid, pidType), resolvedObject));
69
			return resolvedObject;
70
		}
71
		return null;
72
	}
73

    
74
	public String retrieveDnetID(final String pid, final String pidType) {
75

    
76
		if (!canResolvePid(pidType)) return null;
77
		final String dnetIdentifier = storeManager.generateDNetIdentifier(pid, pidType);
78
		final Element item = cache.get(dnetIdentifier);
79

    
80
		if (item != null) return dnetIdentifier;
81

    
82
        String resolvedIdentifier = storeManager.getRecordIdentifier(dnetIdentifier);
83

    
84
		if (resolvedIdentifier != null && !StringUtils.isBlank(resolvedIdentifier))
85
			return resolvedIdentifier;
86

    
87
		ResolvedObject resolvedObject = resolve(pid, pidType);
88
		if (resolvedObject != null) {
89
			storeManager.insertRecord(getName(), resolvedObject);
90
			cache.put(new Element(dnetIdentifier, resolvedObject));
91
			return dnetIdentifier;
92
		}
93

    
94
		return null;
95
	}
96

    
97
	public String getName() {
98
		return this.getClass().getSimpleName();
99
	}
100

    
101
	public void setName(final String name) {
102
		this.name = name;
103
	}
104

    
105
	protected abstract boolean canResolvePid(final String pidType);
106

    
107
	protected abstract ResolvedObject resolve(final String pid, final String pidType);
108

    
109
	public Cache getCache() {
110
		return cache;
111
	}
112

    
113
	@Required
114
	public void setCache(final Cache cache) {
115
		this.cache = cache;
116
	}
117

    
118
	protected String requestURL(final String url) {
119
        int timeout = 1;
120
        RequestConfig config = RequestConfig.custom()
121
                .setConnectTimeout(timeout * 1000)
122
                .setConnectionRequestTimeout(timeout * 1000)
123
                .setSocketTimeout(timeout * 1000).build();
124
        final CloseableHttpClient httpclient = HttpClientBuilder.create().setDefaultRequestConfig(config).build();
125
        try {
126
			HttpGet httpGet = new HttpGet(url);
127
			return httpclient.execute(httpGet, responseHandler);
128
		} catch (Throwable e) {
129
			log.debug("Error in getting url " + url, e);
130
			return null;
131
		} finally {
132
			try {
133
				httpclient.close();
134
			} catch (IOException e) {
135
				log.error("Error on closing httpclient", e);
136
			}
137
		}
138
	}
139

    
140

    
141
	@Override
142
	public int getOrder() {
143
		return this.order;
144
	}
145

    
146
	@Required
147
	public AbstractPIDResolver setOrder(int order) {
148
		this.order = order;
149
		return this;
150
	}
151

    
152

    
153
	@Override
154
	public int compareTo(PIDResolver o) {
155
		return Integer.compare(getOrder(), o.getOrder());
156
	}
157
}
(1-1/2)