Project

General

Profile

1
package eu.dnetlib.dli.resolver;
2

    
3
import java.net.URLEncoder;
4

    
5
import com.mongodb.DBObject;
6
import com.mongodb.MongoClient;
7
import com.mongodb.QueryBuilder;
8
import com.mongodb.client.FindIterable;
9
import com.mongodb.client.MongoCollection;
10
import com.mongodb.client.MongoCursor;
11
import com.mongodb.client.MongoDatabase;
12
import eu.dnetlib.dli.resolver.model.DLIResolvedObject;
13
import eu.dnetlib.pid.resolver.AbstractPIDResolver;
14
import groovy.transform.Synchronized;
15
import org.apache.commons.logging.Log;
16
import org.apache.commons.logging.LogFactory;
17
import org.bson.Document;
18
import org.bson.conversions.Bson;
19
import org.springframework.beans.factory.annotation.Autowired;
20

    
21
// TODO: Auto-generated Javadoc
22

    
23
/**
24
 * The Class CrossrefDOIResolver.
25
 */
26
public class CrossrefResolver extends AbstractPIDResolver {
27

    
28
	/**
29
	 * The Constant log.
30
	 */
31
	private static final Log log = LogFactory.getLog(CrossrefResolver.class);
32

    
33
	/**
34
	 * The Constant baseUrlCrossref.
35
	 */
36
	private final static String baseUrlCrossref = "http://api.crossref.org/works/";
37

    
38

    
39
	/**
40
	 * The parser.
41
	 */
42
	@Autowired
43
	private CrossRefParserJSON parser;
44

    
45

    
46
	@Autowired
47
	private MongoClient mongoClient;
48

    
49
	private MongoDatabase db;
50

    
51
	@Override
52
	protected boolean canResolvePid(final String pidType) {
53
		return (pidType != null) && ("doi".equals(pidType.toLowerCase().trim()) || "handle".equals(pidType.toLowerCase().trim()));
54
	}
55

    
56
	@Override
57
	@Synchronized
58
    protected DLIResolvedObject resolve(final String pid, final String pidType) {
59
        String response;
60
		try {
61
//			response = requestURL(baseUrlCrossref + URLEncoder.encode(pid, "UTF-8"));
62
			response = retrieveCrossRefFromDump(pid);
63
		} catch (Exception e) {
64
			log.debug("unable to get response");
65
			return null;
66
		}
67
		try {
68

    
69
			log.debug("Obtained " + response);
70
			if (response == null) return null;
71
			if (response.contains("Resource not found")) return null;
72
            DLIResolvedObject record = parser.parseRecord(response);
73
            if (record.getPid() == null) return null;
74
			return record;
75
		} catch (Throwable e) {
76
			log.error("Error on resolve pid  " + pid, e);
77
		}
78
		return null;
79
	}
80

    
81

    
82
	private String retrieveCrossRefFromDump(final String pid) {
83
		if (db == null) {
84
			db = mongoClient.getDatabase("crossRef");
85

    
86
		}
87
		final MongoCollection<Document> crossRef = db.getCollection("dump");
88

    
89
		DBObject query = QueryBuilder.start("_id").is(pid).get();
90
		FindIterable<Document> documents = crossRef.find((Bson) query).limit(1);
91
		MongoCursor<Document> iterator = documents.iterator();
92
		if (iterator.hasNext()){
93
			return iterator.next().toJson();
94
		}
95
		return null;
96
	}
97

    
98

    
99

    
100

    
101

    
102

    
103

    
104
}
(3-3/16)