diff --git a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedJobUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedJobUsageRecord.java index 85d9437..7f43e5c 100644 --- a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedJobUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedJobUsageRecord.java @@ -6,12 +6,14 @@ package org.gcube.accounting.datamodel.aggregation; import java.io.Serializable; import java.util.Calendar; import java.util.Map; +import java.util.Set; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.basetypes.AbstractJobUsageRecord; import org.gcube.accounting.datamodel.usagerecords.JobUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions; +import org.gcube.documentstore.records.aggregation.AggregationUtility; /** * This Class is for library internal use only @@ -37,6 +39,11 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements throw new UnsupportedOperationException(); } + @Override + public Set getAggregatedFields() { + return aggregatedFields; + } + @Override public int getOperationCount() { return super.getOperationCount(); @@ -85,7 +92,17 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements @Override public AggregatedJobUsageRecord aggregate(AggregatedJobUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub + try { + /* + AggregationUtility aggregationUtility = new AggregationUtility(this); + aggregationUtility.aggregate(record); + */ + // TODO + }catch(Exception e){ + throw new UnsupportedOperationException(e); + } + //return this; + throw new UnsupportedOperationException(); } @@ -95,10 +112,35 @@ public class AggregatedJobUsageRecord extends AbstractJobUsageRecord implements @Override public AggregatedJobUsageRecord aggregate(JobUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); + try { + return aggregate(new AggregatedJobUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(AggregatedJobUsageRecord record) throws NotAggregatableRecordsExceptions { + AggregationUtility aggregationUtility = new AggregationUtility(this); + return aggregationUtility.isAggregable(record); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(JobUsageRecord record) throws NotAggregatableRecordsExceptions { + try { + return isAggregable(new AggregatedJobUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } + } + /** * {@inheritDoc} */ diff --git a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedPortletUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedPortletUsageRecord.java index b997557..47ab000 100644 --- a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedPortletUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedPortletUsageRecord.java @@ -6,12 +6,14 @@ package org.gcube.accounting.datamodel.aggregation; import java.io.Serializable; import java.util.Calendar; import java.util.Map; +import java.util.Set; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.basetypes.AbstractPortletUsageRecord; import org.gcube.accounting.datamodel.usagerecords.PortletUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions; +import org.gcube.documentstore.records.aggregation.AggregationUtility; /** * This Class is for library internal use only @@ -38,6 +40,11 @@ public class AggregatedPortletUsageRecord extends AbstractPortletUsageRecord imp throw new UnsupportedOperationException(); } + @Override + public Set getAggregatedFields() { + return aggregatedFields; + } + @Override public int getOperationCount() { return super.getOperationCount(); @@ -87,7 +94,17 @@ public class AggregatedPortletUsageRecord extends AbstractPortletUsageRecord imp public AggregatedPortletUsageRecord aggregate( AggregatedPortletUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub + try { + /* + AggregationUtility aggregationUtility = new AggregationUtility(this); + aggregationUtility.aggregate(record); + */ + // TODO + }catch(Exception e){ + throw new UnsupportedOperationException(e); + } + //return this; + throw new UnsupportedOperationException(); } @@ -97,10 +114,35 @@ public class AggregatedPortletUsageRecord extends AbstractPortletUsageRecord imp @Override public AggregatedPortletUsageRecord aggregate(PortletUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); + try { + return aggregate(new AggregatedPortletUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } } + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(AggregatedPortletUsageRecord record) throws NotAggregatableRecordsExceptions { + AggregationUtility aggregationUtility = new AggregationUtility(this); + return aggregationUtility.isAggregable(record); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(PortletUsageRecord record) throws NotAggregatableRecordsExceptions { + try { + return isAggregable(new AggregatedPortletUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } + } + + /** * {@inheritDoc} */ diff --git a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedServiceUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedServiceUsageRecord.java index 7c77295..ae132b4 100644 --- a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedServiceUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedServiceUsageRecord.java @@ -6,12 +6,14 @@ package org.gcube.accounting.datamodel.aggregation; import java.io.Serializable; import java.util.Calendar; import java.util.Map; +import java.util.Set; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.basetypes.AbstractServiceUsageRecord; import org.gcube.accounting.datamodel.usagerecords.ServiceUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions; +import org.gcube.documentstore.records.aggregation.AggregationUtility; import org.gcube.documentstore.records.implementation.AggregatedField; import org.gcube.documentstore.records.implementation.RequiredField; import org.gcube.documentstore.records.implementation.validations.annotations.ValidLong; @@ -56,6 +58,11 @@ public class AggregatedServiceUsageRecord extends AbstractServiceUsageRecord imp this.setEndTime(creationTime); } + @Override + public Set getAggregatedFields() { + return aggregatedFields; + } + @Override public int getOperationCount() { return super.getOperationCount(); @@ -128,8 +135,10 @@ public class AggregatedServiceUsageRecord extends AbstractServiceUsageRecord imp public AggregatedServiceUsageRecord aggregate(AggregatedServiceUsageRecord record) throws NotAggregatableRecordsExceptions { try { + AggregationUtility aggregationUtility = new AggregationUtility(this); + aggregationUtility.aggregate(record); + setDuration(durationWeightedAverage(record)); - setOperationCount(this.getOperationCount() + record.getOperationCount()); long max = record.getMaxInvocationTime(); if(max > this.getMaxInvocationTime()){ @@ -140,9 +149,10 @@ public class AggregatedServiceUsageRecord extends AbstractServiceUsageRecord imp if(min < this.getMinInvocationTime()){ this.setMinInvocationTime(min); } - - }catch(Exception e){ - throw new UnsupportedOperationException(e); + } catch(NotAggregatableRecordsExceptions e){ + throw e; + } catch(Exception ex){ + throw new NotAggregatableRecordsExceptions(ex); } return this; @@ -161,6 +171,29 @@ public class AggregatedServiceUsageRecord extends AbstractServiceUsageRecord imp } } + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(AggregatedServiceUsageRecord record) + throws NotAggregatableRecordsExceptions { + AggregationUtility aggregationUtility = new AggregationUtility(this); + return aggregationUtility.isAggregable(record); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(ServiceUsageRecord record) + throws NotAggregatableRecordsExceptions { + try { + return isAggregable(new AggregatedServiceUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } + } + /** * {@inheritDoc} */ diff --git a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedStorageUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedStorageUsageRecord.java index 8212a7b..ff457f5 100644 --- a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedStorageUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedStorageUsageRecord.java @@ -6,12 +6,14 @@ package org.gcube.accounting.datamodel.aggregation; import java.io.Serializable; import java.util.Calendar; import java.util.Map; +import java.util.Set; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.basetypes.AbstractStorageUsageRecord; import org.gcube.accounting.datamodel.usagerecords.StorageUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions; +import org.gcube.documentstore.records.aggregation.AggregationUtility; import org.gcube.documentstore.records.implementation.AggregatedField; import org.gcube.documentstore.records.implementation.RequiredField; import org.gcube.documentstore.records.implementation.validations.annotations.ValidLong; @@ -49,6 +51,11 @@ public class AggregatedStorageUsageRecord extends AbstractStorageUsageRecord imp this.setEndTime(creationTime); } + @Override + public Set getAggregatedFields() { + return aggregatedFields; + } + @Override public int getOperationCount() { return super.getOperationCount(); @@ -99,12 +106,12 @@ public class AggregatedStorageUsageRecord extends AbstractStorageUsageRecord imp AggregatedStorageUsageRecord record) throws NotAggregatableRecordsExceptions { try { - this.setOperationCount(this.getOperationCount() + record.getOperationCount()); + AggregationUtility aggregationUtility = new AggregationUtility(this); + aggregationUtility.aggregate(record); this.setDataVolume(this.getDataVolume() + record.getDataVolume()); }catch(Exception e){ throw new UnsupportedOperationException(e); } - return this; } @@ -121,6 +128,29 @@ public class AggregatedStorageUsageRecord extends AbstractStorageUsageRecord imp } } + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(AggregatedStorageUsageRecord record) + throws NotAggregatableRecordsExceptions { + AggregationUtility aggregationUtility = new AggregationUtility(this); + return aggregationUtility.isAggregable(record); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(StorageUsageRecord record) + throws NotAggregatableRecordsExceptions { + try { + return isAggregable(new AggregatedStorageUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } + } + /** * {@inheritDoc} */ diff --git a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedTaskUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedTaskUsageRecord.java index f2604c8..f30ba40 100644 --- a/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedTaskUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/aggregation/AggregatedTaskUsageRecord.java @@ -6,19 +6,20 @@ package org.gcube.accounting.datamodel.aggregation; import java.io.Serializable; import java.util.Calendar; import java.util.Map; +import java.util.Set; import org.gcube.accounting.datamodel.AggregatedUsageRecord; import org.gcube.accounting.datamodel.basetypes.AbstractTaskUsageRecord; import org.gcube.accounting.datamodel.usagerecords.TaskUsageRecord; import org.gcube.documentstore.exception.InvalidValueException; import org.gcube.documentstore.exception.NotAggregatableRecordsExceptions; +import org.gcube.documentstore.records.aggregation.AggregationUtility; /** * This Class is for library internal use only * @author Luca Frosini (ISTI - CNR) http://www.lucafrosini.com/ */ public class AggregatedTaskUsageRecord extends AbstractTaskUsageRecord implements AggregatedUsageRecord { - /** * Generated Serial version UID @@ -32,7 +33,18 @@ public class AggregatedTaskUsageRecord extends AbstractTaskUsageRecord implement public AggregatedTaskUsageRecord(Map> properties) throws InvalidValueException{ super(properties); } + + // TODO + public AggregatedTaskUsageRecord(TaskUsageRecord taskUsageRecord) throws InvalidValueException{ + throw new UnsupportedOperationException(); + } + + @Override + public Set getAggregatedFields() { + return aggregatedFields; + } + @Override public int getOperationCount() { return super.getOperationCount(); @@ -81,7 +93,17 @@ public class AggregatedTaskUsageRecord extends AbstractTaskUsageRecord implement @Override public AggregatedTaskUsageRecord aggregate(AggregatedTaskUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub + try { + /* + AggregationUtility aggregationUtility = new AggregationUtility(this); + aggregationUtility.aggregate(record); + */ + // TODO + }catch(Exception e){ + throw new UnsupportedOperationException(e); + } + //return this; + throw new UnsupportedOperationException(); } @@ -91,8 +113,32 @@ public class AggregatedTaskUsageRecord extends AbstractTaskUsageRecord implement @Override public AggregatedTaskUsageRecord aggregate(TaskUsageRecord record) throws NotAggregatableRecordsExceptions { - // TODO Auto-generated method stub - throw new UnsupportedOperationException(); + try { + return aggregate(new AggregatedTaskUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(AggregatedTaskUsageRecord record) throws NotAggregatableRecordsExceptions { + AggregationUtility aggregationUtility = new AggregationUtility(this); + return aggregationUtility.isAggregable(record); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isAggregable(TaskUsageRecord record) throws NotAggregatableRecordsExceptions { + try { + return isAggregable(new AggregatedTaskUsageRecord(record)); + } catch (InvalidValueException e) { + throw new NotAggregatableRecordsExceptions(e.getCause()); + } } /** @@ -102,4 +148,5 @@ public class AggregatedTaskUsageRecord extends AbstractTaskUsageRecord implement public Class getAggregable() { return TaskUsageRecord.class; } + } diff --git a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java index afa7d6e..47a34cc 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractJobUsageRecord.java @@ -97,7 +97,7 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord { public Calendar getJobStartTime() { long millis = (Long) this.resourceProperties.get(JOB_START_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } public void setJobStartTime(Calendar jobStartTime) throws InvalidValueException { @@ -106,7 +106,7 @@ public abstract class AbstractJobUsageRecord extends BasicUsageRecord { public Calendar getJobEndTime() { long millis = (Long) this.resourceProperties.get(JOB_END_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } public void setJobEndTime(Calendar jobEndTime) throws InvalidValueException { diff --git a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java index b13245d..b1fe002 100644 --- a/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/basetypes/AbstractTaskUsageRecord.java @@ -121,7 +121,7 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { @Deprecated public Calendar getUsageStartTime() { long millis = (Long) this.resourceProperties.get(USAGE_START_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } @Deprecated public void setUsageStartTime(Calendar usageStartTime) throws InvalidValueException { @@ -131,7 +131,7 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { @Deprecated public Calendar getUsageEndTime() { long millis = (Long) this.resourceProperties.get(USAGE_END_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } @Deprecated public void setUsageEndTime(Calendar usageEndTime) throws InvalidValueException { @@ -141,7 +141,7 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { public Calendar getTaskStartTime() { long millis = (Long) this.resourceProperties.get(TASK_START_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } public void setTaskStartTime(Calendar startTime) throws InvalidValueException { @@ -151,7 +151,7 @@ public abstract class AbstractTaskUsageRecord extends BasicUsageRecord { public Calendar getTaskEndTime() { long millis = (Long) this.resourceProperties.get(TASK_END_TIME); - return timestampStringToCalendar(millis); + return timestampToCalendar(millis); } public void setTaskEndTime(Calendar endTime) throws InvalidValueException { diff --git a/src/test/java/org/gcube/accounting/testutility/StressTestUtility.java b/src/test/java/org/gcube/accounting/testutility/StressTestUtility.java index 7eddd95..cbade85 100644 --- a/src/test/java/org/gcube/accounting/testutility/StressTestUtility.java +++ b/src/test/java/org/gcube/accounting/testutility/StressTestUtility.java @@ -18,7 +18,7 @@ public class StressTestUtility { private static final Logger logger = LoggerFactory.getLogger(StressTestUtility.class); - protected final static int DEFAULT_NUMBER_OF_RECORDS = 3000; + public final static int DEFAULT_NUMBER_OF_RECORDS = 3000; public static void stressTest(TestOperation operation) throws Exception { stressTest(operation, DEFAULT_NUMBER_OF_RECORDS); diff --git a/src/test/java/org/gcube/documentstore/records/aggregation/AggregationSchedulerTest.java b/src/test/java/org/gcube/documentstore/records/aggregation/AggregationSchedulerTest.java index f4c16b6..cb01bff 100644 --- a/src/test/java/org/gcube/documentstore/records/aggregation/AggregationSchedulerTest.java +++ b/src/test/java/org/gcube/documentstore/records/aggregation/AggregationSchedulerTest.java @@ -3,6 +3,10 @@ */ package org.gcube.documentstore.records.aggregation; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import org.gcube.accounting.datamodel.UsageRecord; import org.gcube.accounting.datamodel.basetypes.TestUsageRecord; import org.gcube.accounting.datamodel.usagerecords.ServiceUsageRecord; @@ -10,8 +14,9 @@ import org.gcube.accounting.testutility.StressTestUtility; import org.gcube.accounting.testutility.TestOperation; import org.gcube.common.scope.api.ScopeProvider; import org.gcube.documentstore.persistence.PersistenceExecutor; +import org.gcube.documentstore.records.AggregatedRecord; import org.gcube.documentstore.records.Record; -import org.gcube.documentstore.records.aggregation.AggregationScheduler; +import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +44,22 @@ public class AggregationSchedulerTest { }; + protected void madeAssertion(Map> bufferedRecords, List types, int size, int count) { + + for(String type : types){ + Assert.assertTrue(bufferedRecords.containsKey(type)); + List records = bufferedRecords.get(type); + Assert.assertTrue(records.size()==size); + for(Record record : records){ + Assert.assertTrue(record.getRecordType().compareTo(type)==0); + Assert.assertTrue(record instanceof AggregatedRecord); + @SuppressWarnings("rawtypes") + AggregatedRecord aggregatedRecord = (AggregatedRecord) record; + Assert.assertTrue(aggregatedRecord.getOperationCount()==count); + } + } + } + @Test public void stressTestAggregableURSingleType() throws Exception { ScopeProvider.instance.set(TestUsageRecord.TEST_SCOPE); @@ -50,6 +71,10 @@ public class AggregationSchedulerTest { aggregationScheduler.aggregate(usageRecord, persistenceExecutor); } }); + List types = new ArrayList(); + String serviceUsageRecordtype = TestUsageRecord.createTestServiceUsageRecordAutomaticScope().getRecordType(); + types.add(serviceUsageRecordtype); + madeAssertion(aggregationScheduler.bufferedRecords, types, 1, StressTestUtility.DEFAULT_NUMBER_OF_RECORDS); aggregationScheduler.flush(persistenceExecutor); } @@ -69,6 +94,12 @@ public class AggregationSchedulerTest { aggregationScheduler.aggregate(usageRecord, persistenceExecutor); } }); + List types = new ArrayList(); + String serviceUsageRecordtype = TestUsageRecord.createTestServiceUsageRecordAutomaticScope().getRecordType(); + types.add(serviceUsageRecordtype); + + madeAssertion(aggregationScheduler.bufferedRecords, types, 2, StressTestUtility.DEFAULT_NUMBER_OF_RECORDS/2); + aggregationScheduler.flush(persistenceExecutor); } @@ -88,6 +119,15 @@ public class AggregationSchedulerTest { aggregationScheduler.aggregate(usageRecord, persistenceExecutor); } }); + + List types = new ArrayList(); + String serviceUsageRecordtype = TestUsageRecord.createTestServiceUsageRecordAutomaticScope().getRecordType(); + String storageUsageRecordtype = TestUsageRecord.createTestStorageUsageRecordAutomaticScope().getRecordType(); + types.add(serviceUsageRecordtype); + types.add(storageUsageRecordtype); + + madeAssertion(aggregationScheduler.bufferedRecords, types, 1, StressTestUtility.DEFAULT_NUMBER_OF_RECORDS/2); + aggregationScheduler.flush(persistenceExecutor); } @@ -116,6 +156,16 @@ public class AggregationSchedulerTest { aggregationScheduler.aggregate(usageRecord, persistenceExecutor); } }); + + /* + List types = new ArrayList(); + String serviceUsageRecordtype = TestUsageRecord.createTestServiceUsageRecordAutomaticScope().getRecordType(); + String storageUsageRecordtype = TestUsageRecord.createTestStorageUsageRecordAutomaticScope().getRecordType(); + types.add(serviceUsageRecordtype); + types.add(storageUsageRecordtype); + madeAssertion(aggregationScheduler.bufferedRecords, types, 1, StressTestUtility.DEFAULT_NUMBER_OF_RECORDS/4); + */ + aggregationScheduler.flush(persistenceExecutor); }