2015-12-18 17:02:26 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
package org.gcube.documentstore.persistence;
|
|
|
|
|
|
|
|
import java.io.Serializable;
|
2016-09-27 16:20:01 +02:00
|
|
|
import java.net.SocketTimeoutException;
|
2016-05-24 14:46:10 +02:00
|
|
|
import java.util.HashMap;
|
2015-12-18 17:02:26 +01:00
|
|
|
import java.util.Map;
|
2016-09-27 16:20:01 +02:00
|
|
|
import java.util.concurrent.TimeoutException;
|
2015-12-18 17:02:26 +01:00
|
|
|
|
|
|
|
import org.gcube.documentstore.records.Record;
|
|
|
|
import org.gcube.documentstore.records.RecordUtility;
|
2016-05-25 17:53:55 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
2015-12-18 17:02:26 +01:00
|
|
|
|
|
|
|
import com.couchbase.client.deps.com.fasterxml.jackson.databind.JsonNode;
|
|
|
|
import com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
|
import com.couchbase.client.java.Bucket;
|
|
|
|
import com.couchbase.client.java.Cluster;
|
|
|
|
import com.couchbase.client.java.CouchbaseCluster;
|
|
|
|
import com.couchbase.client.java.document.JsonDocument;
|
|
|
|
import com.couchbase.client.java.document.json.JsonObject;
|
2016-01-28 18:14:31 +01:00
|
|
|
import com.couchbase.client.java.env.CouchbaseEnvironment;
|
|
|
|
import com.couchbase.client.java.env.DefaultCouchbaseEnvironment;
|
2015-12-18 17:02:26 +01:00
|
|
|
|
|
|
|
/**
|
2016-10-12 14:19:10 +02:00
|
|
|
* @author Luca Frosini (ISTI - CNR)
|
2015-12-18 17:02:26 +01:00
|
|
|
*/
|
|
|
|
public class PersistenceCouchBase extends PersistenceBackend {
|
|
|
|
|
2016-06-28 15:02:34 +02:00
|
|
|
|
|
|
|
private static final Logger logger = LoggerFactory
|
|
|
|
.getLogger(PersistenceCouchBase.class);
|
2016-07-20 14:18:10 +02:00
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
public static final String URL_PROPERTY_KEY = "URL";
|
|
|
|
//public static final String USERNAME_PROPERTY_KEY = "username";
|
|
|
|
public static final String PASSWORD_PROPERTY_KEY = "password";
|
|
|
|
public static final String BUCKET_NAME_PROPERTY_KEY = "bucketName";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-05-24 14:46:10 +02:00
|
|
|
/*Different bucket for aggregated*/
|
|
|
|
public static final String BUCKET_STORAGE_NAME_PROPERTY_KEY="AggregatedStorageUsageRecord";
|
|
|
|
public static final String BUCKET_STORAGE_TYPE="StorageUsageRecord";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-05-24 14:46:10 +02:00
|
|
|
public static final String BUCKET_SERVICE_NAME_PROPERTY_KEY="AggregatedServiceUsageRecord";
|
|
|
|
public static final String BUCKET_SERVICE_TYPE="ServiceUsageRecord";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-05-24 14:46:10 +02:00
|
|
|
public static final String BUCKET_PORTLET_NAME_PROPERTY_KEY="AggregatedPortletUsageRecord";
|
|
|
|
public static final String BUCKET_PORTLET_TYPE="PortletUsageRecord";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-05-24 14:46:10 +02:00
|
|
|
public static final String BUCKET_JOB_NAME_PROPERTY_KEY="AggregatedJobUsageRecord";
|
|
|
|
public static final String BUCKET_JOB_TYPE="JobUsageRecord";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-05-24 14:46:10 +02:00
|
|
|
public static final String BUCKET_TASK_NAME_PROPERTY_KEY="AggregatedTaskUsageRecord";
|
|
|
|
public static final String BUCKET_TASK_TYPE="TaskUsageRecord";
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-09-27 16:20:01 +02:00
|
|
|
public static final Integer TIMEOUT_BUCKET=180;
|
|
|
|
public static final Integer ALIVE_INTERVAL=3600;
|
2016-07-20 14:18:10 +02:00
|
|
|
|
2016-06-28 15:02:34 +02:00
|
|
|
/* The environment configuration */
|
|
|
|
protected static final CouchbaseEnvironment ENV =
|
|
|
|
DefaultCouchbaseEnvironment.builder()
|
2016-09-27 16:20:01 +02:00
|
|
|
.connectTimeout(TIMEOUT_BUCKET * 1000) // 180 Seconds in milliseconds
|
|
|
|
.keepAliveInterval(ALIVE_INTERVAL * 1000) // 3600 Seconds in milliseconds
|
2016-06-28 15:02:34 +02:00
|
|
|
.build();
|
|
|
|
|
|
|
|
protected Cluster cluster;
|
|
|
|
/* One Bucket for type*/
|
2016-05-24 14:46:10 +02:00
|
|
|
protected Bucket bucketStorage;
|
|
|
|
protected String bucketNameStorage;
|
|
|
|
|
|
|
|
protected Bucket bucketService;
|
|
|
|
protected String bucketNameService;
|
|
|
|
|
|
|
|
protected Bucket bucketPortlet;
|
|
|
|
protected String bucketNamePortlet;
|
|
|
|
|
|
|
|
protected Bucket bucketJob;
|
|
|
|
protected String bucketNameJob;
|
|
|
|
|
|
|
|
protected Bucket bucketTask;
|
|
|
|
protected String bucketNameTask;
|
2016-06-28 15:02:34 +02:00
|
|
|
|
|
|
|
private Map <String, Bucket> connectionMap;
|
|
|
|
|
2016-09-27 16:20:01 +02:00
|
|
|
//TEST
|
|
|
|
private static Integer count=0;
|
2016-06-28 15:02:34 +02:00
|
|
|
|
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
protected void prepareConnection(PersistenceBackendConfiguration configuration) throws Exception {
|
|
|
|
String url = configuration.getProperty(URL_PROPERTY_KEY);
|
|
|
|
String password = configuration.getProperty(PASSWORD_PROPERTY_KEY);
|
2016-06-28 15:02:34 +02:00
|
|
|
|
|
|
|
try {
|
2016-07-20 14:18:10 +02:00
|
|
|
|
2016-06-28 15:02:34 +02:00
|
|
|
cluster = CouchbaseCluster.create(ENV, url);
|
|
|
|
|
|
|
|
bucketNameStorage = configuration.getProperty(BUCKET_STORAGE_NAME_PROPERTY_KEY);
|
|
|
|
bucketNameService = configuration.getProperty(BUCKET_SERVICE_NAME_PROPERTY_KEY);
|
|
|
|
bucketNameJob = configuration.getProperty(BUCKET_JOB_NAME_PROPERTY_KEY);
|
|
|
|
bucketNamePortlet = configuration.getProperty(BUCKET_PORTLET_NAME_PROPERTY_KEY);
|
|
|
|
bucketNameTask = configuration.getProperty(BUCKET_TASK_NAME_PROPERTY_KEY);
|
|
|
|
|
|
|
|
connectionMap = new HashMap<String, Bucket>();
|
2016-09-27 16:20:01 +02:00
|
|
|
|
2016-07-20 14:18:10 +02:00
|
|
|
bucketStorage = cluster.openBucket( bucketNameStorage,password);
|
2016-06-28 15:02:34 +02:00
|
|
|
connectionMap.put(BUCKET_STORAGE_TYPE, bucketStorage);
|
2016-09-27 16:20:01 +02:00
|
|
|
|
2016-07-20 14:18:10 +02:00
|
|
|
bucketService = cluster.openBucket( bucketNameService,password);
|
2016-06-28 15:02:34 +02:00
|
|
|
connectionMap.put(BUCKET_SERVICE_TYPE, bucketService);
|
2016-09-27 16:20:01 +02:00
|
|
|
|
2016-07-20 14:18:10 +02:00
|
|
|
bucketJob = cluster.openBucket( bucketNameJob,password);
|
2016-06-28 15:02:34 +02:00
|
|
|
connectionMap.put(BUCKET_JOB_TYPE, bucketJob);
|
2016-09-27 16:20:01 +02:00
|
|
|
|
2016-07-20 14:18:10 +02:00
|
|
|
bucketPortlet = cluster.openBucket( bucketNamePortlet,password);
|
2016-06-28 15:02:34 +02:00
|
|
|
connectionMap.put(BUCKET_PORTLET_TYPE, bucketPortlet);
|
|
|
|
|
2016-09-27 16:20:01 +02:00
|
|
|
|
2016-07-20 14:18:10 +02:00
|
|
|
bucketTask = cluster.openBucket( bucketNameTask,password);
|
2016-06-28 15:02:34 +02:00
|
|
|
connectionMap.put(BUCKET_TASK_TYPE, bucketTask);
|
|
|
|
|
|
|
|
} catch(Exception e) {
|
2016-09-27 16:20:01 +02:00
|
|
|
cluster.disconnect();
|
|
|
|
logger.error("Bucket connection error", e);
|
|
|
|
throw e;
|
2016-06-28 15:02:34 +02:00
|
|
|
}
|
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
}
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2016-07-20 14:31:41 +02:00
|
|
|
protected JsonDocument createItem(JsonObject jsonObject, String id,String recordType) throws Exception {
|
2015-12-18 17:02:26 +01:00
|
|
|
JsonDocument doc = JsonDocument.create(id, jsonObject);
|
2016-05-24 14:46:10 +02:00
|
|
|
return connectionMap.get(recordType).upsert(doc);
|
2015-12-18 17:02:26 +01:00
|
|
|
}
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
public static JsonNode usageRecordToJsonNode(Record record) throws Exception {
|
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
|
JsonNode node = mapper.valueToTree(record.getResourceProperties());
|
|
|
|
return node;
|
|
|
|
}
|
2016-06-28 15:02:34 +02:00
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
public static Record jsonNodeToUsageRecord(JsonNode jsonNode) throws Exception {
|
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
|
@SuppressWarnings("unchecked")
|
2016-01-28 18:14:31 +01:00
|
|
|
Map<String, ? extends Serializable> result = mapper.convertValue(jsonNode, Map.class);
|
2015-12-18 17:02:26 +01:00
|
|
|
Record record = RecordUtility.getRecord(result);
|
|
|
|
return record;
|
|
|
|
}
|
2016-06-28 15:02:34 +02:00
|
|
|
|
|
|
|
|
2015-12-18 17:02:26 +01:00
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
protected void reallyAccount(Record record) throws Exception {
|
|
|
|
JsonNode node = PersistenceCouchBase.usageRecordToJsonNode(record);
|
|
|
|
JsonObject jsonObject = JsonObject.fromJson(node.toString());
|
2016-05-24 14:46:10 +02:00
|
|
|
//get a bucket association
|
|
|
|
String recordType=record.getRecordType();
|
|
|
|
createItem(jsonObject, record.getId(),recordType);
|
2015-12-18 17:02:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* {@inheritDoc}
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void close() throws Exception {
|
|
|
|
cluster.disconnect();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|