refs #200: Create accouting-lib library
https://support.d4science.org/issues/200 Implementing buffer strategy git-svn-id: https://svn.d4science.research-infrastructures.eu/gcube/trunk/accounting/accounting-lib@115674 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
parent
fd5bce26c2
commit
e392879728
|
@ -8,7 +8,7 @@ import org.gcube.accounting.exception.InvalidValueException;
|
|||
/**
|
||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
||||
*/
|
||||
public interface AggregatedUsageRecord<T extends AggregatedUsageRecord<T, B>, B extends SingleUsageRecord> {
|
||||
public interface AggregatedUsageRecord<T extends AggregatedUsageRecord<T, B>, B extends SingleUsageRecord> extends UsageRecord {
|
||||
|
||||
public T getAggregatedUsageRecord(B usageRecord) throws InvalidValueException ;
|
||||
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
package org.gcube.accounting.datamodel.aggregation.scheduler;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.gcube.accounting.datamodel.AggregatedUsageRecord;
|
||||
import org.gcube.accounting.datamodel.AggregationStrategy;
|
||||
import org.gcube.accounting.datamodel.UsageRecord;
|
||||
import org.gcube.accounting.persistence.PersistenceExecutor;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/
|
||||
|
@ -12,6 +17,8 @@ import org.gcube.accounting.persistence.PersistenceExecutor;
|
|||
*/
|
||||
public abstract class AggregationScheduler {
|
||||
|
||||
private static Logger logger = LoggerFactory.getLogger(AggregationScheduler.class);
|
||||
|
||||
protected static AggregationScheduler aggregationScheduler;
|
||||
|
||||
public static AggregationScheduler getInstance(){
|
||||
|
@ -21,20 +28,104 @@ public abstract class AggregationScheduler {
|
|||
return aggregationScheduler;
|
||||
}
|
||||
|
||||
protected List<UsageRecord> records;
|
||||
|
||||
/**
|
||||
* @return the records
|
||||
*/
|
||||
public List<UsageRecord> getRecords() {
|
||||
return records;
|
||||
}
|
||||
protected Map<String, Map<String, UsageRecord>> records;
|
||||
|
||||
protected AggregationScheduler(){
|
||||
this.records = new ArrayList<UsageRecord>();
|
||||
this.records = new HashMap<String, Map<String, UsageRecord>>();
|
||||
}
|
||||
|
||||
protected void madeAggregation(UsageRecord UsageRecord){
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
protected Class<? extends AggregatedUsageRecord> getAggregatedUsageRecordClass(String usageRecordName) throws ClassNotFoundException {
|
||||
Class<? extends AggregatedUsageRecord> clz = null;
|
||||
String aggregatedURFullyQualifiedName = null;
|
||||
try {
|
||||
Package aggregatedPackage = org.gcube.accounting.datamodel.aggregation.ServiceUsageRecord.class.getPackage();
|
||||
aggregatedURFullyQualifiedName = String.format("%s%s", aggregatedPackage.getName(), usageRecordName);
|
||||
clz = (Class<? extends AggregatedUsageRecord>) Class.forName(aggregatedURFullyQualifiedName);
|
||||
} catch (ClassNotFoundException e) {
|
||||
logger.error("Unable To find the Aggregation Class for {}", usageRecordName);
|
||||
throw e;
|
||||
}
|
||||
return clz;
|
||||
}
|
||||
|
||||
protected UsageRecord instantiateAggregatedUsageRecord(UsageRecord usageRecord) throws Exception{
|
||||
String usageRecordName = usageRecord.getClass().getSimpleName();
|
||||
@SuppressWarnings("rawtypes")
|
||||
Class<? extends AggregatedUsageRecord> clz = getAggregatedUsageRecordClass(usageRecordName);
|
||||
@SuppressWarnings("rawtypes")
|
||||
Class[] argTypes = { usageRecord.getClass() };
|
||||
@SuppressWarnings("rawtypes")
|
||||
Constructor<? extends AggregatedUsageRecord> constructor = clz.getDeclaredConstructor(argTypes);
|
||||
Object[] arguments = {usageRecord};
|
||||
@SuppressWarnings("rawtypes")
|
||||
AggregatedUsageRecord aggregatedUsageRecord = constructor.newInstance(arguments);
|
||||
return aggregatedUsageRecord;
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
protected Class<? extends AggregationStrategy> getAggregattionStrategyUsageRecordClass(String usageRecordName) throws ClassNotFoundException {
|
||||
Class<? extends AggregationStrategy> clz = null;
|
||||
String aggregationStrategyName = null;
|
||||
try {
|
||||
Package aggregationStrategyPackage = org.gcube.accounting.datamodel.aggregation.aggregationstrategy.ServiceUsageRecordAggregationStrategy.class.getPackage();
|
||||
aggregationStrategyName = String.format("%s%s", aggregationStrategyPackage.getName(), usageRecordName);
|
||||
clz = (Class<? extends AggregationStrategy>) Class.forName(aggregationStrategyName);
|
||||
} catch (Exception e) {
|
||||
logger.error("Unable To find the Aggregation Strategy Class for {}", usageRecordName);
|
||||
throw e;
|
||||
}
|
||||
return clz;
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
protected AggregationStrategy instantiateAggregationStrategy(AggregatedUsageRecord aggregatedUsageRecord) throws Exception{
|
||||
String usageRecordName = aggregatedUsageRecord.getClass().getSimpleName();
|
||||
Class<? extends AggregationStrategy> clz = getAggregattionStrategyUsageRecordClass(usageRecordName);
|
||||
Class[] argTypes = { aggregatedUsageRecord.getClass() };
|
||||
Constructor<? extends AggregationStrategy> constructor = clz.getDeclaredConstructor(argTypes);
|
||||
Object[] arguments = {aggregatedUsageRecord};
|
||||
AggregationStrategy aggregationStrategy = constructor.newInstance(arguments);
|
||||
return aggregationStrategy;
|
||||
}
|
||||
|
||||
|
||||
// TODO
|
||||
protected void madeAggregation(UsageRecord usageRecord){
|
||||
String usageRecordName = usageRecord.getClass().getSimpleName();
|
||||
UsageRecord aggregatedUsageRecord;
|
||||
|
||||
Map<String, UsageRecord> perUsageRecordNameMap;
|
||||
|
||||
if(this.records.containsKey(usageRecordName)){
|
||||
perUsageRecordNameMap = this.records.get(usageRecordName);
|
||||
|
||||
// TODO
|
||||
|
||||
}else{
|
||||
perUsageRecordNameMap = new HashMap<String, UsageRecord>();
|
||||
this.records.put(usageRecordName, perUsageRecordNameMap);
|
||||
|
||||
if(usageRecord instanceof AggregatedUsageRecord){
|
||||
// the record is already an aggregated version
|
||||
aggregatedUsageRecord = usageRecord;
|
||||
}else{
|
||||
try {
|
||||
// Instantiate the aggregated usage record using reflection with the
|
||||
// simple name of the new UsageRecord to aggregate.
|
||||
// The instantiated UsageRecord is the aggregated version from
|
||||
// org.gcube.accounting.datamodel.aggregation package
|
||||
aggregatedUsageRecord = instantiateAggregatedUsageRecord(usageRecord);
|
||||
} catch (Exception e) {
|
||||
logger.error("Unable to Istantiate the Aggregation Class for {}. The Record will be persisted as is (Better than nothing).", usageRecordName);
|
||||
aggregatedUsageRecord = usageRecord;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
perUsageRecordNameMap.put(usageRecordName, aggregatedUsageRecord);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -48,7 +139,7 @@ public abstract class AggregationScheduler {
|
|||
public synchronized void aggregate(UsageRecord UsageRecord, PersistenceExecutor persistenceExecutor) throws Exception {
|
||||
madeAggregation(UsageRecord);
|
||||
if(isTimeToPersist()){
|
||||
persistenceExecutor.persist(records.toArray(new UsageRecord[records.size()]));
|
||||
persistenceExecutor.persist(records.values().toArray(new UsageRecord[records.size()]));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue