Project

General

Profile

1
package eu.dnetlib.dli.resolver;
2

    
3
import com.google.gson.Gson;
4
import com.google.gson.GsonBuilder;
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.dli.resolver.model.DLIResolvedObjectDeserializer;
14
import eu.dnetlib.pid.resolver.AbstractPIDResolver;
15

    
16
import org.apache.commons.logging.Log;
17
import org.apache.commons.logging.LogFactory;
18
import org.bson.Document;
19
import org.bson.conversions.Bson;
20
import org.springframework.beans.factory.annotation.Autowired;
21

    
22
public class DLIOfflineResolver extends AbstractPIDResolver {
23

    
24
    /**
25
     * The Constant log.
26
     */
27
    private static final Log log = LogFactory.getLog(DLIOfflineResolver.class);
28

    
29
    @Autowired
30
    private MongoClient mongoClient;
31

    
32
    private MongoDatabase db;
33

    
34
    private Gson g = new GsonBuilder().registerTypeAdapter(DLIResolvedObject.class, new DLIResolvedObjectDeserializer()).create();
35

    
36
    @Override
37
    protected boolean canResolvePid(final String pidType) {
38
        return isAvailableOffline();
39
    }
40

    
41
    @Override
42
    protected DLIResolvedObject resolve(final String pid, final String pidType) {
43

    
44
        final String dliItem = retrieveDLIFromDump(pid.toLowerCase().trim(),pidType.toLowerCase().trim());
45
        if (dliItem!= null)
46
            return g.fromJson(dliItem, DLIResolvedObject.class);
47
        return null;
48

    
49
    }
50

    
51

    
52
    private String retrieveDLIFromDump(final String pid, final String pidType) {
53
        log.debug(String.format("trying to find %s of type %s", pid, pidType));
54
        if (db == null) {
55
            db = mongoClient.getDatabase("dli_resolved");
56
        }
57
        final MongoCollection<Document> crossRef = db.getCollection("dli");
58
        DBObject query = QueryBuilder.start("pid").is(pid).and("pid_type").is(pidType).get();
59
        FindIterable<Document> documents = crossRef.find((Bson) query).limit(1);
60
        MongoCursor<Document> iterator = documents.iterator();
61
        if (iterator.hasNext()){
62
            log.debug("found pid "+pid);
63
            return iterator.next().get("body").toString();
64
        }
65
        return null;
66
    }
67

    
68

    
69
}
(4-4/16)