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
        return true;
40
    }
41

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

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

    
50
    }
51

    
52

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

    
69

    
70
}
(4-4/16)