fixes #275: Create CouchDB connector for persistence accounting as separated project
https://support.d4science.org/issues/275 git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/accounting/accounting-lib@115445 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
e2ee2c5103
commit
f0a4588f16
|
@ -23,5 +23,10 @@
|
||||||
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
|
<attribute name="org.eclipse.jst.component.nondependency" value=""/>
|
||||||
</attributes>
|
</attributes>
|
||||||
</classpathentry>
|
</classpathentry>
|
||||||
|
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
|
||||||
|
<attributes>
|
||||||
|
<attribute name="maven.pomderived" value="true"/>
|
||||||
|
</attributes>
|
||||||
|
</classpathentry>
|
||||||
<classpathentry kind="output" path="target/classes"/>
|
<classpathentry kind="output" path="target/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
eclipse.preferences.version=1
|
eclipse.preferences.version=1
|
||||||
encoding//src/main/java=UTF-8
|
encoding//src/main/java=UTF-8
|
||||||
encoding//src/test/java=UTF-8
|
encoding//src/test/java=UTF-8
|
||||||
|
encoding//src/test/resources=UTF-8
|
||||||
encoding/<project>=UTF-8
|
encoding/<project>=UTF-8
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
disabled=06target
|
||||||
|
eclipse.preferences.version=1
|
16
pom.xml
16
pom.xml
|
@ -45,21 +45,6 @@
|
||||||
<artifactId>slf4j-api</artifactId>
|
<artifactId>slf4j-api</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- CouchDB libraries -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.ektorp</groupId>
|
|
||||||
<artifactId>org.ektorp</artifactId>
|
|
||||||
<version>1.3.0</version>
|
|
||||||
<type>jar</type>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.codehaus.jackson</groupId>
|
|
||||||
<artifactId>jackson-core-asl</artifactId>
|
|
||||||
<version>1.9.7</version>
|
|
||||||
<type>jar</type>
|
|
||||||
</dependency>
|
|
||||||
<!-- END CouchDB libraries -->
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>junit</groupId>
|
<groupId>junit</groupId>
|
||||||
|
@ -73,7 +58,6 @@
|
||||||
<version>1.0.13</version>
|
<version>1.0.13</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -1,116 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.gcube.accounting.persistence;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.codehaus.jackson.JsonNode;
|
|
||||||
import org.codehaus.jackson.map.ObjectMapper;
|
|
||||||
import org.ektorp.CouchDbConnector;
|
|
||||||
import org.ektorp.CouchDbInstance;
|
|
||||||
import org.ektorp.ViewQuery;
|
|
||||||
import org.ektorp.ViewResult;
|
|
||||||
import org.ektorp.http.HttpClient;
|
|
||||||
import org.ektorp.http.StdHttpClient;
|
|
||||||
import org.ektorp.http.StdHttpClient.Builder;
|
|
||||||
import org.ektorp.impl.StdCouchDbConnector;
|
|
||||||
import org.ektorp.impl.StdCouchDbInstance;
|
|
||||||
import org.gcube.accounting.datamodel.BasicUsageRecord;
|
|
||||||
import org.gcube.accounting.datamodel.UsageRecord;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CouchDBPersistence extends Persistence {
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(CouchDBPersistence.class);
|
|
||||||
|
|
||||||
protected CouchDbInstance couchDbInstance;
|
|
||||||
protected CouchDbConnector couchDbConnector;
|
|
||||||
|
|
||||||
protected final static String HOST = "HOST";
|
|
||||||
protected final static String DEFAULT_HOST = "localhost";
|
|
||||||
protected final static String PORT = "PORT";
|
|
||||||
protected final static String USERNAME = "USERNAME";
|
|
||||||
protected final static String PASSWORD = "PASSWORD";
|
|
||||||
|
|
||||||
protected String host = "localhost";
|
|
||||||
protected int port = 5984;
|
|
||||||
protected String username = "";
|
|
||||||
protected String password = "";
|
|
||||||
protected String dbName = "accounting";
|
|
||||||
|
|
||||||
protected CouchDBPersistence() throws Exception {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected HttpClient initHttpClient(String uri, int port, String username, String password){
|
|
||||||
Builder builder = new StdHttpClient.Builder().host(uri).port(port);
|
|
||||||
if(username!=null && username.compareTo("")!=0 &&
|
|
||||||
password!=null && password.compareTo("")!=0){
|
|
||||||
builder.username(username).password(password);
|
|
||||||
}
|
|
||||||
HttpClient httpClient = builder.build();
|
|
||||||
return httpClient;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ViewResult query(ViewQuery query){
|
|
||||||
ViewResult result = couchDbConnector.queryView(query);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void close() throws Exception {
|
|
||||||
couchDbConnector.getConnection().shutdown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void prepareConnection() throws Exception {
|
|
||||||
logger.debug("Preparing Connection for {}", this.getClass().getSimpleName());
|
|
||||||
HttpClient httpClient = initHttpClient(host, port, username, password);
|
|
||||||
couchDbInstance = new StdCouchDbInstance(httpClient);
|
|
||||||
couchDbConnector = new StdCouchDbConnector(dbName, couchDbInstance);
|
|
||||||
couchDbConnector.createDatabaseIfNotExists(); // TODO remove this
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void createItem(JsonNode node, String id) throws Exception {
|
|
||||||
if(id!=null && id.compareTo("")!=0){
|
|
||||||
couchDbConnector.create(id, node);
|
|
||||||
}else{
|
|
||||||
couchDbConnector.create(node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void reallyAccount(UsageRecord usageRecord) throws Exception {
|
|
||||||
JsonNode node = usageRecordToJsonNode(usageRecord);
|
|
||||||
createItem(node, usageRecord.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static JsonNode usageRecordToJsonNode(UsageRecord usageRecord) throws Exception {
|
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
|
||||||
JsonNode node = mapper.valueToTree(usageRecord.getResourceProperties());
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UsageRecord jsonNodeToUsageRecord(JsonNode jsonNode) throws Exception {
|
|
||||||
ObjectMapper mapper = new ObjectMapper();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String, Serializable> result = mapper.convertValue(jsonNode, Map.class);
|
|
||||||
UsageRecord usageRecord = BasicUsageRecord.getUsageRecord(result);
|
|
||||||
return usageRecord;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,17 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.gcube.accounting.persistence;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class MongoDBPersistence {
|
|
||||||
|
|
||||||
protected MongoDBPersistence(){
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -4,6 +4,7 @@
|
||||||
package org.gcube.accounting.persistence;
|
package org.gcube.accounting.persistence;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.ServiceLoader;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
@ -54,7 +55,6 @@ public abstract class Persistence {
|
||||||
protected static void init() {
|
protected static void init() {
|
||||||
setFallbackLocation(null);
|
setFallbackLocation(null);
|
||||||
try {
|
try {
|
||||||
/*
|
|
||||||
ServiceLoader<Persistence> serviceLoader = ServiceLoader.load(Persistence.class);
|
ServiceLoader<Persistence> serviceLoader = ServiceLoader.load(Persistence.class);
|
||||||
for (Persistence foundPersistence : serviceLoader) {
|
for (Persistence foundPersistence : serviceLoader) {
|
||||||
if(foundPersistence.getClass().isInstance(FallbackPersistence.class)){
|
if(foundPersistence.getClass().isInstance(FallbackPersistence.class)){
|
||||||
|
@ -66,19 +66,16 @@ public abstract class Persistence {
|
||||||
persistence = foundPersistence;
|
persistence = foundPersistence;
|
||||||
break;
|
break;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.debug(String.format("%s not initialized correctly. It will not be used", persistence.getClass().getSimpleName()));
|
logger.debug(String.format("%s not initialized correctly. It will not be used", foundPersistence.getClass().getSimpleName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(persistence==null){
|
if(persistence==null){
|
||||||
persistence = fallback;
|
persistence = fallback;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
persistence = new CouchDBPersistence();
|
|
||||||
persistence.prepareConnection();
|
|
||||||
persistence.account(createTestUsageRecord());
|
persistence.account(createTestUsageRecord());
|
||||||
} catch(Exception e){
|
} catch(Exception e){
|
||||||
logger.error("Unable to instance {}. Using fallback as default",
|
logger.error("Unable to instance a Persistence Implementation. Using fallback as default",
|
||||||
CouchDBPersistence.class.getSimpleName());
|
e.getCause());
|
||||||
persistence = fallback;
|
persistence = fallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ import org.junit.Test;
|
||||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RawUsageRecordTest {
|
public class UsageRecordTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCompareToSameObject(){
|
public void testCompareToSameObject(){
|
|
@ -1,33 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
package org.gcube.accounting.datamodel.persistence;
|
|
||||||
|
|
||||||
import org.codehaus.jackson.JsonNode;
|
|
||||||
import org.gcube.accounting.datamodel.UsageRecord;
|
|
||||||
import org.gcube.accounting.persistence.CouchDBPersistence;
|
|
||||||
import org.gcube.accounting.persistence.Persistence;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class CouchDBPersistenceTest {
|
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(CouchDBPersistenceTest.class);
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void TestJsonNodeUsageRecordConversions() throws Exception {
|
|
||||||
UsageRecord usageRecord = Persistence.createTestUsageRecord();
|
|
||||||
logger.debug("UsageRecord : {}", usageRecord.toString());
|
|
||||||
JsonNode node = CouchDBPersistence.usageRecordToJsonNode(usageRecord);
|
|
||||||
logger.debug("Node : {}", node.toString());
|
|
||||||
UsageRecord ur = CouchDBPersistence.jsonNodeToUsageRecord(node);
|
|
||||||
Assert.assertEquals(0, usageRecord.compareTo(ur));
|
|
||||||
Assert.assertEquals(0, ur.compareTo(usageRecord));
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue