Project

General

Profile

1
package eu.dnetlib.common.logging.dao;
2

    
3
import java.util.*;
4
import java.util.Map.Entry;
5
import java.util.function.Consumer;
6
import javax.annotation.Resource;
7

    
8
import com.google.common.collect.Lists;
9
import com.google.common.collect.Maps;
10
import com.google.common.collect.Sets;
11
import com.mongodb.BasicDBObject;
12
import com.mongodb.BasicDBObjectBuilder;
13
import com.mongodb.DBObject;
14
import com.mongodb.client.MongoCollection;
15
import com.mongodb.client.MongoCursor;
16
import com.mongodb.client.MongoDatabase;
17
import com.mongodb.client.model.Filters;
18
import com.mongodb.client.model.IndexOptions;
19
import eu.dnetlib.common.logging.LogMessage;
20
import org.apache.commons.lang.StringUtils;
21
import org.apache.commons.logging.Log;
22
import org.apache.commons.logging.LogFactory;
23
import org.bson.Document;
24
import org.bson.conversions.Bson;
25

    
26
public class DnetLoggerMongoDao implements DnetLoggerDao {
27

    
28
	private static final Log log = LogFactory.getLog(DnetLoggerMongoDao.class);
29

    
30
	@Resource(name = "loggingMongoDB")
31
	private MongoDatabase db;
32

    
33
	private IndexOptions indexOptions = new IndexOptions().background(true);
34

    
35
	@Override
36
	public void init(final String collection) {
37
		final Set<String> collections = Sets.newHashSet();
38
		db.listCollectionNames().forEach((Consumer<? super String>) c -> collections.add(c));
39

    
40
		if (!Lists.newArrayList(collections).contains(collection)) {
41
			log.info(String.format("creating collection %s", collection));
42
			db.createCollection(collection);
43
		}
44
	}
45

    
46
	@Override
47
	public void configureIndex(final String collection, final Map<String, IndexConf> conf) {
48
		final MongoCollection<Document> coll = db.getCollection(collection);
49
		coll.dropIndexes();
50
		for (String key : conf.keySet()) {
51
			coll.createIndex(new BasicDBObject(key, 1), indexOptions);
52
		}
53
	}
54

    
55
	@Override
56
	public void writeLog(final String collection, final Map<String, Object> map) {
57
		final MongoCollection coll = db.getCollection(collection);
58
		final Document doc = new Document(replaceKeyNames(map));
59
		coll.insertOne(doc);
60
	}
61

    
62
	private Map<String, Object> replaceKeyNames(final Map<String, Object> inputMap) {
63
		final Map<String, Object> outMap = Maps.newHashMap();
64

    
65
		if (inputMap != null) {
66
			for (Entry<String, Object> e : inputMap.entrySet()) {
67
				final String k = e.getKey();
68
				if (!StringUtils.isBlank(k)) {
69
					Object v = e.getValue();
70
					outMap.put(k.replaceAll("\\.", "_"), v != null ? v : "null");
71
				}
72
			}
73
		}
74
		return outMap;
75
	}
76

    
77
	@Override
78
	public Map<String, String> findOne(final String collection, final String key, final String value) {
79
		final MongoCollection coll = db.getCollection(collection);
80
		final DBObject obj = (DBObject) coll.find(Filters.eq(key, value), DBObject.class).first();
81
		//final DBObject obj = coll.find(getBasicQuery(key, value)).as(BasicDBObject.class);
82

    
83
		return dbObject2Map(obj);
84
	}
85

    
86
	@Override
87
	public Iterator<Map<String, String>> obtainLogIterator(final String collection) {
88
		final MongoCollection coll = db.getCollection(collection);
89
		return iter(coll.find().iterator());
90
	}
91

    
92
	@Override
93
	public Iterator<Map<String, String>> find(final String collection, final String key, final String value) {
94
		final MongoCollection coll = db.getCollection(collection);
95
		return iter(coll.find(getBasicQuery(key, value)).iterator());
96
	}
97

    
98
	@Override
99
	public Iterator<Map<String, String>> find(final String collection, final Map<String, Object> criteria) {
100
		final MongoCollection coll = db.getCollection(collection);
101
		return iter(coll.find(getCustomQuery(criteria)).iterator());
102
	}
103

    
104
	@Override
105
	public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate) {
106
		final MongoCollection coll = db.getCollection(collection);
107
		return iter(coll.find(getDateQuery(startDate, endDate)).iterator());
108
	}
109

    
110
	@Override
111
	public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate, final String key, final String value) {
112
		final MongoCollection coll = db.getCollection(collection);
113
		final Bson query = Filters.and(getBasicQuery(key, value), getDateQuery(startDate, endDate));
114
		return iter(coll.find(query).iterator());
115
	}
116

    
117
	@Override
118
	public Iterator<Map<String, String>> findByDateRange(final String collection, final Date startDate, final Date endDate, final Map<String, Object> criteria) {
119
		final MongoCollection coll = db.getCollection(collection);
120
		final Bson query = Filters.and(getCustomQuery(criteria), getDateQuery(startDate, endDate));
121
		return iter(coll.find(query).iterator());
122
	}
123

    
124
	@Override
125
	public Iterator<Map<String, String>> find(final String collection, final String mongoquery, final List<String> fields) {
126
		final MongoCollection coll = db.getCollection(collection);
127
		final Bson query = BasicDBObject.parse(mongoquery);
128
		return iter(coll.find(query).iterator());
129
	}
130

    
131
	private Bson getBasicQuery(final String key, final String value) {
132
		return new BasicDBObject(key, value);
133
	}
134

    
135
	private Bson getDateQuery(final Date startDate, final Date endDate) {
136
		return Filters.and(
137
				Filters.gte(LogMessage.LOG_DATE_FIELD, startDate.getTime()),
138
				Filters.lt(LogMessage.LOG_DATE_FIELD, endDate.getTime()));
139
	}
140

    
141
	private Bson getCustomQuery(final Map<String, Object> criteria) {
142
		final BasicDBObjectBuilder b = new BasicDBObjectBuilder();
143
		criteria.forEach((k, v) -> b.add(k, v));
144
		return (BasicDBObject) b.get();
145
	}
146

    
147
	private Bson dateRangeQuery(final Date startDate, final Date endDate) {
148
		Bson dateFilter = Filters.and(Filters.gte(LogMessage.LOG_DATE_FIELD, startDate.getTime()), Filters.lt(LogMessage.LOG_DATE_FIELD, endDate.getTime()));
149
		log.debug("Date filter created: " + dateFilter);
150
		//return new BasicDBObject(LogMessage.LOG_DATE_FIELD, BasicDBObjectBuilder.start("$gte", startDate.getTime()).append("$lt", endDate.getTime()).get());
151
		return dateFilter;
152
	}
153

    
154
	private Iterator<Map<String, String>> iter(final MongoCursor<BasicDBObject> cursor) {
155
		return new Iterator<Map<String, String>>() {
156

    
157
			@Override
158
			public boolean hasNext() {
159
				return cursor.hasNext();
160
			}
161

    
162
			@Override
163
			public Map<String, String> next() {
164
				return dbObject2Map(cursor.next());
165
			}
166

    
167
			@Override
168
			public void remove() {
169
				throw new RuntimeException("NOT IMPLEMENTED");
170
			}
171
		};
172
	}
173

    
174
	private Map<String, String> dbObject2Map(final DBObject obj) {
175
		final Map<String, String> res = Maps.newHashMap();
176
		if (obj != null) {
177
			for (String k : obj.keySet()) {
178
				res.put(k, "" + obj.get(k));
179
			}
180
		}
181
		return res;
182
	}
183

    
184
}
    (1-1/1)