diff --git a/src/main/java/org/gcube/accounting/datamodel/implementations/StorageUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/implementations/StorageUsageRecord.java index 9b1e508..3b5c8ef 100644 --- a/src/main/java/org/gcube/accounting/datamodel/implementations/StorageUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/implementations/StorageUsageRecord.java @@ -14,6 +14,7 @@ import org.gcube.accounting.datamodel.validations.annotations.NotEmptyIfNotNull; import org.gcube.accounting.datamodel.validations.annotations.ValidIP; import org.gcube.accounting.datamodel.validations.annotations.ValidInteger; import org.gcube.accounting.datamodel.validations.annotations.ValidLong; +import org.gcube.accounting.datamodel.validations.annotations.ValidOperationType; import org.gcube.accounting.exception.InvalidValueException; /** @@ -27,11 +28,19 @@ public class StorageUsageRecord extends RawUsageRecord implements SingleUsageRec */ private static final long serialVersionUID = 1381025822586583326L; + /* + * Actually workspace uses + * DOWNLOAD, UPLOAD, COPY, MOVE, DELETE, + */ + public enum OperationType { + GET, PUT, UPDATE, DELETE + } + @NotEmptyIfNotNull public static final String PROVIDER_ID = "providerId"; @NotEmptyIfNotNull public static final String OBJECT_URI = "objectURI"; - @RequiredField @NotEmpty + @RequiredField @ValidOperationType public static final String OPERATION_TYPE = "operationType"; @NotEmpty public static final String QUALIFIER = "qualifier"; diff --git a/src/main/java/org/gcube/accounting/datamodel/implementations/TaskUsageRecord.java b/src/main/java/org/gcube/accounting/datamodel/implementations/TaskUsageRecord.java index 1394803..cd5dbab 100644 --- a/src/main/java/org/gcube/accounting/datamodel/implementations/TaskUsageRecord.java +++ b/src/main/java/org/gcube/accounting/datamodel/implementations/TaskUsageRecord.java @@ -11,10 +11,10 @@ import org.gcube.accounting.datamodel.RawUsageRecord; import org.gcube.accounting.datamodel.SingleUsageRecord; import org.gcube.accounting.datamodel.decorators.RequiredField; import org.gcube.accounting.datamodel.deprecationmanagement.annotations.DeprecatedWarning; +import org.gcube.accounting.datamodel.deprecationmanagement.annotations.MoveToOperationResult; import org.gcube.accounting.datamodel.validations.annotations.NotEmpty; import org.gcube.accounting.datamodel.validations.annotations.ValidInteger; import org.gcube.accounting.datamodel.validations.annotations.ValidLong; -import org.gcube.accounting.datamodel.validations.annotations.ValidOperationResult; import org.gcube.accounting.exception.InvalidValueException; /** @@ -46,8 +46,10 @@ public class TaskUsageRecord extends RawUsageRecord implements SingleUsageRecord public static final String USAGE_START_TIME = "usageStartTime"; @RequiredField @ValidLong public static final String USAGE_END_TIME = "usageEndTime"; - @ValidOperationResult - public static final String USAGE_PHASE = "usagePhase"; + + @MoveToOperationResult + protected static final String USAGE_PHASE = "usagePhase"; + @ValidInteger public static final String INPUT_FILES_NUMBER = "inputFilesNumber"; @ValidLong @@ -134,6 +136,7 @@ public class TaskUsageRecord extends RawUsageRecord implements SingleUsageRecord } + /* public USAGE_PHASE getUsagePhase() { return (USAGE_PHASE) this.resourceProperties.get(USAGE_PHASE); } @@ -141,6 +144,7 @@ public class TaskUsageRecord extends RawUsageRecord implements SingleUsageRecord public void setUsagePhase(USAGE_PHASE usagePhase) throws InvalidValueException { setResourceProperty(USAGE_PHASE, usagePhase); } + */ public int getInputFilesNumber() { return (Integer) this.resourceProperties.get(INPUT_FILES_NUMBER); diff --git a/src/main/java/org/gcube/accounting/datamodel/validations/annotations/ValidOperationType.java b/src/main/java/org/gcube/accounting/datamodel/validations/annotations/ValidOperationType.java new file mode 100644 index 0000000..098c1b0 --- /dev/null +++ b/src/main/java/org/gcube/accounting/datamodel/validations/annotations/ValidOperationType.java @@ -0,0 +1,16 @@ +package org.gcube.accounting.datamodel.validations.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.gcube.accounting.datamodel.decorators.FieldDecorator; +import org.gcube.accounting.datamodel.validations.validators.ValidOperationTypeValidator; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +@FieldDecorator(managed=ValidOperationTypeValidator.class) +public @interface ValidOperationType { + +} diff --git a/src/main/java/org/gcube/accounting/datamodel/validations/validators/ValidOperationTypeValidator.java b/src/main/java/org/gcube/accounting/datamodel/validations/validators/ValidOperationTypeValidator.java new file mode 100644 index 0000000..a0ff8f8 --- /dev/null +++ b/src/main/java/org/gcube/accounting/datamodel/validations/validators/ValidOperationTypeValidator.java @@ -0,0 +1,62 @@ +package org.gcube.accounting.datamodel.validations.validators; + +import java.io.Serializable; + +import org.gcube.accounting.datamodel.UsageRecord; +import org.gcube.accounting.datamodel.UsageRecord.OperationResult; +import org.gcube.accounting.datamodel.decorators.FieldAction; +import org.gcube.accounting.datamodel.implementations.StorageUsageRecord.OperationType; +import org.gcube.accounting.exception.InvalidValueException; + +public class ValidOperationTypeValidator implements FieldAction { + + private static final String ERROR = String.format("Not Instance of %s", OperationResult.class.getSimpleName()); + + /** + * {@inheritDoc} + */ + @SuppressWarnings("rawtypes") + @Override + public Serializable validate(String key, Serializable value, UsageRecord usageRecord) throws InvalidValueException { + if(value instanceof OperationType){ + return value; + } + + try { + if(value instanceof String){ + try{ + OperationType operationType = OperationType.valueOf((String) value); + if(operationType !=null){ + return operationType; + } + } catch(Exception e){ + // Trying another way + } + + try{ + Integer integer = Integer.getInteger((String) value); + if(integer!=null){ + value = integer; + } + } catch(Exception e){ + // Trying another way + } + } + + if(value instanceof Integer){ + return OperationType.values()[(Integer) value]; + } + + if(value instanceof Enum){ + return OperationType.values()[((Enum) value).ordinal()]; + } + + }catch(Exception e){ + throw new InvalidValueException(ERROR, e.getCause()); + } + + throw new InvalidValueException(ERROR); + } + + +}