Converted BillEntry --> BillEntryMsg. BillTest can now parse and run multiple scenarios
authorProdromos Gerakios <pgerakios@grnet.gr>
Thu, 20 Sep 2012 12:34:00 +0000 (15:34 +0300)
committerProdromos Gerakios <pgerakios@grnet.gr>
Thu, 20 Sep 2012 12:34:00 +0000 (15:34 +0300)
src/main/avro/aquarium-bill.avdl
src/main/java/gr/grnet/aquarium/message/avro/gen/AquariumBill.java
src/main/java/gr/grnet/aquarium/message/avro/gen/BillEntryMsg.java
src/main/java/gr/grnet/aquarium/message/avro/gen/ChargeEntryMsg.java
src/main/java/gr/grnet/aquarium/message/avro/gen/EventEntryMsg.java
src/main/java/gr/grnet/aquarium/message/avro/gen/ResourceEntryMsg.java
src/main/scala/gr/grnet/aquarium/actor/message/GetUserBillResponse.scala
src/main/scala/gr/grnet/aquarium/actor/service/user/UserActor.scala
src/main/scala/gr/grnet/aquarium/charging/bill/BillEntry.scala
src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala
src/test/scala/gr/grnet/aquarium/BillTest.scala

index 3082f7e..8e1e2a1 100644 (file)
@@ -41,7 +41,8 @@ protocol AquariumBill {
     string unitPrice;
     string startTime;
     string endTime;
-    string ellapsedTime;
+    string elapsedTime;
+    string units;
     string credits;
   }
 
@@ -55,17 +56,28 @@ protocol AquariumBill {
     string resourceType;
     string unitName;
     string totalCredits;
+    string totalElapsedTime;
+    string totalUnits;
     array<EventEntryMsg> details;
   }
 
+  record ServiceEntryMsg {
+     string serviceName;
+     string totalCredits;
+     string totalElapsedTime;
+     string totalUnits;
+     string unitName;
+     array<ResourceEntryMsg> details;
+  }
+
   record BillEntryMsg {
     string id;
     string userID;
     string status;
     string remainingCredits;
     string deductedCredits;
-    string startTime; // what is this? millis? date?
+    string startTime;
     string endTime;
-    array<ResourceEntryMsg> bill;
+    array<ServiceEntryMsg> bill;
   }
 }
\ No newline at end of file
index 41e4cb0..c1e0a20 100644 (file)
@@ -7,7 +7,7 @@ package gr.grnet.aquarium.message.avro.gen;
 
 @SuppressWarnings("all")
 public interface AquariumBill {
-  public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"AquariumBill\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"types\":[{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]},{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ChargeEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"EventEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":\"ResourceEntryMsg\"}}]}],\"messages\":{}}");
+  public static final org.apache.avro.Protocol PROTOCOL = org.apache.avro.Protocol.parse("{\"protocol\":\"AquariumBill\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"types\":[{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]},{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ChargeEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"EventEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"ServiceEntryMsg\",\"fields\":[{\"name\":\"serviceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":\"ResourceEntryMsg\"}}]},{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":\"ServiceEntryMsg\"}}]}],\"messages\":{}}");
 
   @SuppressWarnings("all")
   public interface Callback extends AquariumBill {
index 3da4840..c0bd3be 100644 (file)
@@ -6,7 +6,7 @@
 package gr.grnet.aquarium.message.avro.gen;  
 @SuppressWarnings("all")
 public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}}}]}");
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"BillEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"userID\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"status\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"remainingCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"deductedCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"bill\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ServiceEntryMsg\",\"fields\":[{\"name\":\"serviceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}}}]}}}]}");
   @Deprecated public java.lang.String id;
   @Deprecated public java.lang.String userID;
   @Deprecated public java.lang.String status;
@@ -14,7 +14,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
   @Deprecated public java.lang.String deductedCredits;
   @Deprecated public java.lang.String startTime;
   @Deprecated public java.lang.String endTime;
-  @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> bill;
+  @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> bill;
   public org.apache.avro.Schema getSchema() { return SCHEMA$; }
   // Used by DatumWriter.  Applications should not call. 
   public java.lang.Object get(int field$) {
@@ -41,7 +41,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
     case 4: deductedCredits = (java.lang.String)value$; break;
     case 5: startTime = (java.lang.String)value$; break;
     case 6: endTime = (java.lang.String)value$; break;
-    case 7: bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>)value$; break;
+    case 7: bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>)value$; break;
     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
     }
   }
@@ -154,7 +154,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
   /**
    * Gets the value of the 'bill' field.
    */
-  public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> getBill() {
+  public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> getBill() {
     return bill;
   }
 
@@ -162,7 +162,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
    * Sets the value of the 'bill' field.
    * @param value the value to set.
    */
-  public void setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> value) {
+  public void setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> value) {
     this.bill = value;
   }
 
@@ -194,7 +194,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
     private java.lang.String deductedCredits;
     private java.lang.String startTime;
     private java.lang.String endTime;
-    private java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> bill;
+    private java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> bill;
 
     /** Creates a new Builder */
     private Builder() {
@@ -238,7 +238,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
         fieldSetFlags()[6] = true;
       }
       if (isValidValue(fields()[7], other.bill)) {
-        this.bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>) data().deepCopy(fields()[7].schema(), other.bill);
+        this.bill = (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>) data().deepCopy(fields()[7].schema(), other.bill);
         fieldSetFlags()[7] = true;
       }
     }
@@ -419,12 +419,12 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
     }
 
     /** Gets the value of the 'bill' field */
-    public java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> getBill() {
+    public java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> getBill() {
       return bill;
     }
     
     /** Sets the value of the 'bill' field */
-    public gr.grnet.aquarium.message.avro.gen.BillEntryMsg.Builder setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg> value) {
+    public gr.grnet.aquarium.message.avro.gen.BillEntryMsg.Builder setBill(java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg> value) {
       validate(fields()[7], value);
       this.bill = value;
       fieldSetFlags()[7] = true;
@@ -454,7 +454,7 @@ public class BillEntryMsg extends org.apache.avro.specific.SpecificRecordBase im
         record.deductedCredits = fieldSetFlags()[4] ? this.deductedCredits : (java.lang.String) defaultValue(fields()[4]);
         record.startTime = fieldSetFlags()[5] ? this.startTime : (java.lang.String) defaultValue(fields()[5]);
         record.endTime = fieldSetFlags()[6] ? this.endTime : (java.lang.String) defaultValue(fields()[6]);
-        record.bill = fieldSetFlags()[7] ? this.bill : (java.util.List<gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg>) defaultValue(fields()[7]);
+        record.bill = fieldSetFlags()[7] ? this.bill : (java.util.List<gr.grnet.aquarium.message.avro.gen.ServiceEntryMsg>) defaultValue(fields()[7]);
         return record;
       } catch (Exception e) {
         throw new org.apache.avro.AvroRuntimeException(e);
index dde8ade..99ec749 100644 (file)
@@ -6,12 +6,13 @@
 package gr.grnet.aquarium.message.avro.gen;  
 @SuppressWarnings("all")
 public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}");
   @Deprecated public java.lang.String id;
   @Deprecated public java.lang.String unitPrice;
   @Deprecated public java.lang.String startTime;
   @Deprecated public java.lang.String endTime;
-  @Deprecated public java.lang.String ellapsedTime;
+  @Deprecated public java.lang.String elapsedTime;
+  @Deprecated public java.lang.String units;
   @Deprecated public java.lang.String credits;
   public org.apache.avro.Schema getSchema() { return SCHEMA$; }
   // Used by DatumWriter.  Applications should not call. 
@@ -21,8 +22,9 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
     case 1: return unitPrice;
     case 2: return startTime;
     case 3: return endTime;
-    case 4: return ellapsedTime;
-    case 5: return credits;
+    case 4: return elapsedTime;
+    case 5: return units;
+    case 6: return credits;
     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
     }
   }
@@ -34,8 +36,9 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
     case 1: unitPrice = (java.lang.String)value$; break;
     case 2: startTime = (java.lang.String)value$; break;
     case 3: endTime = (java.lang.String)value$; break;
-    case 4: ellapsedTime = (java.lang.String)value$; break;
-    case 5: credits = (java.lang.String)value$; break;
+    case 4: elapsedTime = (java.lang.String)value$; break;
+    case 5: units = (java.lang.String)value$; break;
+    case 6: credits = (java.lang.String)value$; break;
     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
     }
   }
@@ -101,18 +104,33 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
   }
 
   /**
-   * Gets the value of the 'ellapsedTime' field.
+   * Gets the value of the 'elapsedTime' field.
    */
-  public java.lang.String getEllapsedTime() {
-    return ellapsedTime;
+  public java.lang.String getElapsedTime() {
+    return elapsedTime;
   }
 
   /**
-   * Sets the value of the 'ellapsedTime' field.
+   * Sets the value of the 'elapsedTime' field.
    * @param value the value to set.
    */
-  public void setEllapsedTime(java.lang.String value) {
-    this.ellapsedTime = value;
+  public void setElapsedTime(java.lang.String value) {
+    this.elapsedTime = value;
+  }
+
+  /**
+   * Gets the value of the 'units' field.
+   */
+  public java.lang.String getUnits() {
+    return units;
+  }
+
+  /**
+   * Sets the value of the 'units' field.
+   * @param value the value to set.
+   */
+  public void setUnits(java.lang.String value) {
+    this.units = value;
   }
 
   /**
@@ -155,7 +173,8 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
     private java.lang.String unitPrice;
     private java.lang.String startTime;
     private java.lang.String endTime;
-    private java.lang.String ellapsedTime;
+    private java.lang.String elapsedTime;
+    private java.lang.String units;
     private java.lang.String credits;
 
     /** Creates a new Builder */
@@ -187,14 +206,18 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
         this.endTime = (java.lang.String) data().deepCopy(fields()[3].schema(), other.endTime);
         fieldSetFlags()[3] = true;
       }
-      if (isValidValue(fields()[4], other.ellapsedTime)) {
-        this.ellapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.ellapsedTime);
+      if (isValidValue(fields()[4], other.elapsedTime)) {
+        this.elapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.elapsedTime);
         fieldSetFlags()[4] = true;
       }
-      if (isValidValue(fields()[5], other.credits)) {
-        this.credits = (java.lang.String) data().deepCopy(fields()[5].schema(), other.credits);
+      if (isValidValue(fields()[5], other.units)) {
+        this.units = (java.lang.String) data().deepCopy(fields()[5].schema(), other.units);
         fieldSetFlags()[5] = true;
       }
+      if (isValidValue(fields()[6], other.credits)) {
+        this.credits = (java.lang.String) data().deepCopy(fields()[6].schema(), other.credits);
+        fieldSetFlags()[6] = true;
+      }
     }
 
     /** Gets the value of the 'id' field */
@@ -297,31 +320,56 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
       return this;
     }
 
-    /** Gets the value of the 'ellapsedTime' field */
-    public java.lang.String getEllapsedTime() {
-      return ellapsedTime;
+    /** Gets the value of the 'elapsedTime' field */
+    public java.lang.String getElapsedTime() {
+      return elapsedTime;
     }
     
-    /** Sets the value of the 'ellapsedTime' field */
-    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setEllapsedTime(java.lang.String value) {
+    /** Sets the value of the 'elapsedTime' field */
+    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setElapsedTime(java.lang.String value) {
       validate(fields()[4], value);
-      this.ellapsedTime = value;
+      this.elapsedTime = value;
       fieldSetFlags()[4] = true;
       return this; 
     }
     
-    /** Checks whether the 'ellapsedTime' field has been set */
-    public boolean hasEllapsedTime() {
+    /** Checks whether the 'elapsedTime' field has been set */
+    public boolean hasElapsedTime() {
       return fieldSetFlags()[4];
     }
     
-    /** Clears the value of the 'ellapsedTime' field */
-    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearEllapsedTime() {
-      ellapsedTime = null;
+    /** Clears the value of the 'elapsedTime' field */
+    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearElapsedTime() {
+      elapsedTime = null;
       fieldSetFlags()[4] = false;
       return this;
     }
 
+    /** Gets the value of the 'units' field */
+    public java.lang.String getUnits() {
+      return units;
+    }
+    
+    /** Sets the value of the 'units' field */
+    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setUnits(java.lang.String value) {
+      validate(fields()[5], value);
+      this.units = value;
+      fieldSetFlags()[5] = true;
+      return this; 
+    }
+    
+    /** Checks whether the 'units' field has been set */
+    public boolean hasUnits() {
+      return fieldSetFlags()[5];
+    }
+    
+    /** Clears the value of the 'units' field */
+    public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearUnits() {
+      units = null;
+      fieldSetFlags()[5] = false;
+      return this;
+    }
+
     /** Gets the value of the 'credits' field */
     public java.lang.String getCredits() {
       return credits;
@@ -329,21 +377,21 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
     
     /** Sets the value of the 'credits' field */
     public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder setCredits(java.lang.String value) {
-      validate(fields()[5], value);
+      validate(fields()[6], value);
       this.credits = value;
-      fieldSetFlags()[5] = true;
+      fieldSetFlags()[6] = true;
       return this; 
     }
     
     /** Checks whether the 'credits' field has been set */
     public boolean hasCredits() {
-      return fieldSetFlags()[5];
+      return fieldSetFlags()[6];
     }
     
     /** Clears the value of the 'credits' field */
     public gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg.Builder clearCredits() {
       credits = null;
-      fieldSetFlags()[5] = false;
+      fieldSetFlags()[6] = false;
       return this;
     }
 
@@ -355,8 +403,9 @@ public class ChargeEntryMsg extends org.apache.avro.specific.SpecificRecordBase
         record.unitPrice = fieldSetFlags()[1] ? this.unitPrice : (java.lang.String) defaultValue(fields()[1]);
         record.startTime = fieldSetFlags()[2] ? this.startTime : (java.lang.String) defaultValue(fields()[2]);
         record.endTime = fieldSetFlags()[3] ? this.endTime : (java.lang.String) defaultValue(fields()[3]);
-        record.ellapsedTime = fieldSetFlags()[4] ? this.ellapsedTime : (java.lang.String) defaultValue(fields()[4]);
-        record.credits = fieldSetFlags()[5] ? this.credits : (java.lang.String) defaultValue(fields()[5]);
+        record.elapsedTime = fieldSetFlags()[4] ? this.elapsedTime : (java.lang.String) defaultValue(fields()[4]);
+        record.units = fieldSetFlags()[5] ? this.units : (java.lang.String) defaultValue(fields()[5]);
+        record.credits = fieldSetFlags()[6] ? this.credits : (java.lang.String) defaultValue(fields()[6]);
         return record;
       } catch (Exception e) {
         throw new org.apache.avro.AvroRuntimeException(e);
index ade20d5..67eadd6 100644 (file)
@@ -6,7 +6,7 @@
 package gr.grnet.aquarium.message.avro.gen;  
 @SuppressWarnings("all")
 public class EventEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}");
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}");
   @Deprecated public java.lang.String eventType;
   @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.ChargeEntryMsg> details;
   public org.apache.avro.Schema getSchema() { return SCHEMA$; }
index 5fa4137..783ceec 100644 (file)
@@ -6,11 +6,13 @@
 package gr.grnet.aquarium.message.avro.gen;  
 @SuppressWarnings("all")
 public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBase implements org.apache.avro.specific.SpecificRecord {
-  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"ellapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}");
+  public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse("{\"type\":\"record\",\"name\":\"ResourceEntryMsg\",\"namespace\":\"gr.grnet.aquarium.message.avro.gen\",\"fields\":[{\"name\":\"resourceName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"resourceType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitName\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalCredits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalElapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"totalUnits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"EventEntryMsg\",\"fields\":[{\"name\":\"eventType\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"details\",\"type\":{\"type\":\"array\",\"items\":{\"type\":\"record\",\"name\":\"ChargeEntryMsg\",\"fields\":[{\"name\":\"id\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"unitPrice\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"startTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"endTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"elapsedTime\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"units\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}},{\"name\":\"credits\",\"type\":{\"type\":\"string\",\"avro.java.string\":\"String\"}}]}}}]}}}]}");
   @Deprecated public java.lang.String resourceName;
   @Deprecated public java.lang.String resourceType;
   @Deprecated public java.lang.String unitName;
   @Deprecated public java.lang.String totalCredits;
+  @Deprecated public java.lang.String totalElapsedTime;
+  @Deprecated public java.lang.String totalUnits;
   @Deprecated public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> details;
   public org.apache.avro.Schema getSchema() { return SCHEMA$; }
   // Used by DatumWriter.  Applications should not call. 
@@ -20,7 +22,9 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
     case 1: return resourceType;
     case 2: return unitName;
     case 3: return totalCredits;
-    case 4: return details;
+    case 4: return totalElapsedTime;
+    case 5: return totalUnits;
+    case 6: return details;
     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
     }
   }
@@ -32,7 +36,9 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
     case 1: resourceType = (java.lang.String)value$; break;
     case 2: unitName = (java.lang.String)value$; break;
     case 3: totalCredits = (java.lang.String)value$; break;
-    case 4: details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>)value$; break;
+    case 4: totalElapsedTime = (java.lang.String)value$; break;
+    case 5: totalUnits = (java.lang.String)value$; break;
+    case 6: details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>)value$; break;
     default: throw new org.apache.avro.AvroRuntimeException("Bad index");
     }
   }
@@ -98,6 +104,36 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
   }
 
   /**
+   * Gets the value of the 'totalElapsedTime' field.
+   */
+  public java.lang.String getTotalElapsedTime() {
+    return totalElapsedTime;
+  }
+
+  /**
+   * Sets the value of the 'totalElapsedTime' field.
+   * @param value the value to set.
+   */
+  public void setTotalElapsedTime(java.lang.String value) {
+    this.totalElapsedTime = value;
+  }
+
+  /**
+   * Gets the value of the 'totalUnits' field.
+   */
+  public java.lang.String getTotalUnits() {
+    return totalUnits;
+  }
+
+  /**
+   * Sets the value of the 'totalUnits' field.
+   * @param value the value to set.
+   */
+  public void setTotalUnits(java.lang.String value) {
+    this.totalUnits = value;
+  }
+
+  /**
    * Gets the value of the 'details' field.
    */
   public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> getDetails() {
@@ -137,6 +173,8 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
     private java.lang.String resourceType;
     private java.lang.String unitName;
     private java.lang.String totalCredits;
+    private java.lang.String totalElapsedTime;
+    private java.lang.String totalUnits;
     private java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> details;
 
     /** Creates a new Builder */
@@ -168,10 +206,18 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
         this.totalCredits = (java.lang.String) data().deepCopy(fields()[3].schema(), other.totalCredits);
         fieldSetFlags()[3] = true;
       }
-      if (isValidValue(fields()[4], other.details)) {
-        this.details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) data().deepCopy(fields()[4].schema(), other.details);
+      if (isValidValue(fields()[4], other.totalElapsedTime)) {
+        this.totalElapsedTime = (java.lang.String) data().deepCopy(fields()[4].schema(), other.totalElapsedTime);
         fieldSetFlags()[4] = true;
       }
+      if (isValidValue(fields()[5], other.totalUnits)) {
+        this.totalUnits = (java.lang.String) data().deepCopy(fields()[5].schema(), other.totalUnits);
+        fieldSetFlags()[5] = true;
+      }
+      if (isValidValue(fields()[6], other.details)) {
+        this.details = (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) data().deepCopy(fields()[6].schema(), other.details);
+        fieldSetFlags()[6] = true;
+      }
     }
 
     /** Gets the value of the 'resourceName' field */
@@ -274,6 +320,56 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
       return this;
     }
 
+    /** Gets the value of the 'totalElapsedTime' field */
+    public java.lang.String getTotalElapsedTime() {
+      return totalElapsedTime;
+    }
+    
+    /** Sets the value of the 'totalElapsedTime' field */
+    public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setTotalElapsedTime(java.lang.String value) {
+      validate(fields()[4], value);
+      this.totalElapsedTime = value;
+      fieldSetFlags()[4] = true;
+      return this; 
+    }
+    
+    /** Checks whether the 'totalElapsedTime' field has been set */
+    public boolean hasTotalElapsedTime() {
+      return fieldSetFlags()[4];
+    }
+    
+    /** Clears the value of the 'totalElapsedTime' field */
+    public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearTotalElapsedTime() {
+      totalElapsedTime = null;
+      fieldSetFlags()[4] = false;
+      return this;
+    }
+
+    /** Gets the value of the 'totalUnits' field */
+    public java.lang.String getTotalUnits() {
+      return totalUnits;
+    }
+    
+    /** Sets the value of the 'totalUnits' field */
+    public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setTotalUnits(java.lang.String value) {
+      validate(fields()[5], value);
+      this.totalUnits = value;
+      fieldSetFlags()[5] = true;
+      return this; 
+    }
+    
+    /** Checks whether the 'totalUnits' field has been set */
+    public boolean hasTotalUnits() {
+      return fieldSetFlags()[5];
+    }
+    
+    /** Clears the value of the 'totalUnits' field */
+    public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearTotalUnits() {
+      totalUnits = null;
+      fieldSetFlags()[5] = false;
+      return this;
+    }
+
     /** Gets the value of the 'details' field */
     public java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> getDetails() {
       return details;
@@ -281,21 +377,21 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
     
     /** Sets the value of the 'details' field */
     public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder setDetails(java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg> value) {
-      validate(fields()[4], value);
+      validate(fields()[6], value);
       this.details = value;
-      fieldSetFlags()[4] = true;
+      fieldSetFlags()[6] = true;
       return this; 
     }
     
     /** Checks whether the 'details' field has been set */
     public boolean hasDetails() {
-      return fieldSetFlags()[4];
+      return fieldSetFlags()[6];
     }
     
     /** Clears the value of the 'details' field */
     public gr.grnet.aquarium.message.avro.gen.ResourceEntryMsg.Builder clearDetails() {
       details = null;
-      fieldSetFlags()[4] = false;
+      fieldSetFlags()[6] = false;
       return this;
     }
 
@@ -307,7 +403,9 @@ public class ResourceEntryMsg extends org.apache.avro.specific.SpecificRecordBas
         record.resourceType = fieldSetFlags()[1] ? this.resourceType : (java.lang.String) defaultValue(fields()[1]);
         record.unitName = fieldSetFlags()[2] ? this.unitName : (java.lang.String) defaultValue(fields()[2]);
         record.totalCredits = fieldSetFlags()[3] ? this.totalCredits : (java.lang.String) defaultValue(fields()[3]);
-        record.details = fieldSetFlags()[4] ? this.details : (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) defaultValue(fields()[4]);
+        record.totalElapsedTime = fieldSetFlags()[4] ? this.totalElapsedTime : (java.lang.String) defaultValue(fields()[4]);
+        record.totalUnits = fieldSetFlags()[5] ? this.totalUnits : (java.lang.String) defaultValue(fields()[5]);
+        record.details = fieldSetFlags()[6] ? this.details : (java.util.List<gr.grnet.aquarium.message.avro.gen.EventEntryMsg>) defaultValue(fields()[6]);
         return record;
       } catch (Exception e) {
         throw new org.apache.avro.AvroRuntimeException(e);
index f6129be..fe6c494 100644 (file)
@@ -37,6 +37,9 @@ package gr.grnet.aquarium.actor.message
 
 import gr.grnet.aquarium.AquariumInternalError
 import gr.grnet.aquarium.charging.bill.{AbstractBillEntry, BillEntry}
+import gr.grnet.aquarium.message.avro.gen.BillEntryMsg
+import gr.grnet.aquarium.converter.{PrettyJsonTextFormat, StdConverters}
+import gr.grnet.aquarium.message.avro.AvroHelpers
 
 /**
  *
@@ -57,6 +60,13 @@ case class GetUserBillResponse(
     case Right(data) â‡’
       data.userID
   }
+
+  override def responseToJsonString = {
+    response.fold(
+      _    â‡’ "", // No JSON response on error
+      data â‡’ AvroHelpers.jsonStringOfSpecificRecord(data)
+    )
+  }
 }
 
-case class GetUserBillResponseData(userID: String, billEntry: AbstractBillEntry)
\ No newline at end of file
+case class GetUserBillResponseData(userID: String, billEntry: BillEntryMsg)
\ No newline at end of file
index e84402b..aae64e1 100644 (file)
@@ -51,7 +51,7 @@ import gr.grnet.aquarium.actor.message.GetUserWalletResponse
 import gr.grnet.aquarium.actor.message.GetUserWalletResponseData
 import gr.grnet.aquarium.actor.message.config.AquariumPropertiesLoaded
 import gr.grnet.aquarium.actor.message.config.InitializeUserActorState
-import gr.grnet.aquarium.charging.bill.AbstractBillEntry
+import gr.grnet.aquarium.charging.bill.{BillEntry, AbstractBillEntry}
 import gr.grnet.aquarium.charging.state.{UserStateModel, UserAgreementHistoryModel, UserStateBootstrap}
 import gr.grnet.aquarium.computation.BillingMonthInfo
 import gr.grnet.aquarium.message.avro.gen.{IMEventMsg, ResourceEventMsg, UserStateMsg}
@@ -401,8 +401,10 @@ class UserActor extends ReflectiveRoleableActor {
           case Some(policy:PolicyModel) => policy.resourceTypesMap
       }
       val state= if(haveUserState) Some(this._userState.msg) else None
-      val billEntry = AbstractBillEntry.fromWorkingUserState(timeslot,this._userID,state,resourceTypes)
-      val billData = GetUserBillResponseData(this._userID,billEntry)
+      val billEntryMsg = BillEntry.fromWorkingUserState(timeslot,this._userID,state,resourceTypes)
+      //val billEntryMsg = MessageFactory.createBillEntryMsg(billEntry)
+      //logger.debug("BILL ENTRY MSG: " + billEntryMsg.toString)
+      val billData = GetUserBillResponseData(this._userID,billEntryMsg)
       sender ! GetUserBillResponse(Right(billData))
     } catch {
       case e:Exception =>
index dfe2110..020523c 100644 (file)
@@ -37,18 +37,19 @@ package gr.grnet.aquarium.charging.bill
 
 import com.ckkloverdos.props.Props
 import com.ckkloverdos.resource.FileStreamResource
-import gr.grnet.aquarium.converter.{CompactJsonTextFormat, StdConverters}
+import gr.grnet.aquarium.converter.StdConverters
 import gr.grnet.aquarium.logic.accounting.dsl.Timeslot
 import gr.grnet.aquarium.message.avro.{AvroHelpers, MessageHelpers}
-import gr.grnet.aquarium.message.avro.gen.{ChargeslotMsg, WalletEntryMsg, UserStateMsg}
-import gr.grnet.aquarium.store.memory.MemStoreProvider
+import gr.grnet.aquarium.message.avro.gen._
 import gr.grnet.aquarium.util.json.JsonSupport
 import gr.grnet.aquarium.{Aquarium, ResourceLocator, AquariumBuilder}
 import java.io.File
 import java.util.concurrent.atomic.AtomicLong
 import scala.collection.immutable.TreeMap
 import scala.collection.mutable.ListBuffer
+import scala.Some
 import gr.grnet.aquarium.policy.ResourceType
+import java.util
 
 
 /*
@@ -71,15 +72,15 @@ class EventEntry(val eventType : String,
 
 
 case class ResourceEntry(val resourceName : String,
-                         //val resourceType : String,
-                         //val unitName : String,
+                         val resourceType : String,
+                         val unitName : String,
                          val totalCredits : String,
                          val totalElapsedTime : String,
                          val totalUnits : String,
                          val details : List[EventEntry])
 extends JsonSupport {
-   var unitName = "EMPTY_UNIT_NAME"
-   var resourceType = "EMPTY_RESOURCE_TYPE"
+   //var unitName = "EMPTY_UNIT_NAME"
+   //var resourceType = "EMPTY_RESOURCE_TYPE"
 }
 
 case class ServiceEntry(val serviceName: String,
@@ -91,8 +92,6 @@ case class ServiceEntry(val serviceName: String,
                        )
 extends JsonSupport {}
 
-abstract class AbstractBillEntry
- extends JsonSupport {}
 
 class BillEntry(val id:String,
                 val userID : String,
@@ -103,10 +102,10 @@ class BillEntry(val id:String,
                 val endTime:String,
                 val bill:List[ServiceEntry]
               )
- extends AbstractBillEntry {}
+ extends JsonSupport {}
 
 
-object AbstractBillEntry {
+object BillEntry {
 
   private[this] val counter = new AtomicLong(0L)
   private[this] def nextUIDObject() = counter.getAndIncrement
@@ -120,25 +119,117 @@ object AbstractBillEntry {
     val dend = cal.getTime
    Timeslot(dstart,dend)
   } */
+  private [this] def newChargeEntry(id:String,
+                                    unitPrice:String,
+                                    startTime:String,
+                                    endTime:String,
+                                    elapsedTime:String,
+                                    units:String,
+                                    credits:String) : ChargeEntryMsg = {
+    val msg = new ChargeEntryMsg
+    msg.setId(id)
+    msg.setUnitPrice(unitPrice)
+    msg.setStartTime(startTime)
+    msg.setEndTime(endTime)
+    msg.setElapsedTime(elapsedTime)
+    msg.setUnits(units)
+    msg.setCredits(credits)
+    msg
+  }
+  
+  private[this] def newEventEntry(eventType : String,
+                                  details   : java.util.List[ChargeEntryMsg]) : EventEntryMsg = {
+
+    val msg = new EventEntryMsg
+    msg.setEventType(eventType)
+    msg.setDetails(details)
+    msg
+  }
+  
+  private [this] def newResourceEntry( resourceName : String,
+                            resourceType : String,
+                            unitName : String,
+                            totalCredits : String,
+                            totalElapsedTime : String,
+                            totalUnits : String,
+                            details : java.util.List[EventEntryMsg]) : ResourceEntryMsg = {
+    val msg = new ResourceEntryMsg
+    msg.setResourceName(resourceName)
+    msg.setResourceType(resourceType)
+    msg.setUnitName(unitName)
+    msg.setTotalCredits(totalCredits)
+    msg.setTotalElapsedTime(totalElapsedTime)
+    msg.setTotalUnits(totalUnits)
+    msg.setDetails(details)
+    msg
+  }
 
-  private[this] def toChargeEntry(c:ChargeslotMsg) : (ChargeEntry,Long,Double) = {
+  private[this] def newServiceEntry( serviceName: String,
+                           totalCredits : String,
+                           totalElapsedTime : String,
+                           totalUnits:String,
+                           unitName:String,
+                           details: java.util.List[ResourceEntryMsg]
+                           ) : ServiceEntryMsg =  {
+    val msg = new ServiceEntryMsg
+    msg.setServiceName(serviceName)
+    msg.setTotalCredits(totalCredits)
+    msg.setTotalElapsedTime(totalElapsedTime)
+    msg.setTotalUnits(totalUnits)
+    msg.setUnitName(unitName)
+    msg.setDetails(details)
+    msg
+ }
+
+
+  private[this] def newBillEntry( id:String,
+                   userID : String,
+                   status : String,
+                   remainingCredits:String,
+                   deductedCredits:String,
+                   startTime:String,
+                   endTime:String,
+                   bill: java.util.List[ServiceEntryMsg]
+                   ) : BillEntryMsg =  {
+    val msg = new BillEntryMsg
+    msg.setId(id)
+    msg.setUserID(userID)
+    msg.setStatus(status)
+    msg.setRemainingCredits(remainingCredits)
+    msg.setDeductedCredits(deductedCredits)
+    msg.setStartTime(startTime)
+    msg.setEndTime(endTime)
+    msg.setBill(bill)
+    msg
+  }
+
+  private[this] def javaList[A](l:A*) : java.util.List[A] = {
+    val al = new java.util.ArrayList[A]()
+    l.foreach(al.add(_))
+    al
+  }
+
+
+  private[this] def toChargeEntry(c:ChargeslotMsg) : (ChargeEntryMsg,Long,Double) = {
     val unitPrice = c.getUnitPrice.toString
     val startTime = c.getStartMillis.toString
     val endTime   = c.getStopMillis.toString
     val difTime   = (c.getStopMillis - c.getStartMillis).toLong
     val unitsD     = (c.getCreditsToSubtract/c.getUnitPrice)
     val credits   = c.getCreditsToSubtract.toString
-    (new ChargeEntry(counter.getAndIncrement.toString,unitPrice,
+    (newChargeEntry(counter.getAndIncrement.toString,unitPrice,
                     startTime,endTime,difTime.toString,unitsD.toString,credits),difTime,unitsD)
   }
 
-  private[this] def toEventEntry(eventType:String,c:ChargeslotMsg) : (EventEntry,Long,Double) = {
+
+
+  private[this] def toEventEntry(eventType:String,c:ChargeslotMsg) : (EventEntryMsg,Long,Double) = {
     val (c1,l1,d1) = toChargeEntry(c)
-    (new EventEntry(eventType,List(c1)),l1,d1)
+    (newEventEntry(eventType,javaList(c1)),l1,d1)
   }
 
 
-  private[this] def toResourceEntry(w:WalletEntryMsg) : ResourceEntry = {
+  private[this] def toResourceEntry(w:WalletEntryMsg) : ResourceEntryMsg = {
     assert(w.getSumOfCreditsToSubtract==0.0 || MessageHelpers.chargeslotCountOf(w) > 0)
     val rcType =  w.getResourceType.getName
     val rcName = rcType match {
@@ -148,7 +239,6 @@ object AbstractBillEntry {
               MessageHelpers.currentResourceEventOf(w).getInstanceID
         }
     val rcUnitName = w.getResourceType.getUnit
-    val eventEntry = new ListBuffer[EventEntry]
     val credits = w.getSumOfCreditsToSubtract
     val eventType = //TODO: This is hardcoded; find a better solution
         rcType match {
@@ -177,25 +267,25 @@ object AbstractBillEntry {
    //c.getStopMillis - c.getStartMillis
     var totalElapsedTime = 0L
     var totalUnits = 0.0D
+    val eventEntry = new java.util.ArrayList[EventEntryMsg]() //new ListBuffer[EventEntry]
       for { c <- w.getChargeslots.asScala }{
         if(c.getCreditsToSubtract != 0.0) {
           //Console.err.println("c.creditsToSubtract : " + c.creditsToSubtract)
           val (e,l,u) = toEventEntry(eventType.toString,c)
-          eventEntry +=  e
+          eventEntry.add(e) //eventEntry +=  e
           totalElapsedTime += l
           totalUnits += u
         }
       }
     //Console.err.println("TOTAL resource event credits: " + credits)
-    val re = new ResourceEntry(rcName,/*rcType,rcUnitName,*/credits.toString,totalElapsedTime.toString,
-                       totalUnits.toString,eventEntry.toList)
-    re.unitName = rcUnitName
-    re.resourceType = rcType
-    re
+    /*val re =*/ newResourceEntry(rcName,rcType,rcUnitName,credits.toString,totalElapsedTime.toString,
+                       totalUnits.toString,eventEntry)
+    //re.unitName = rcUnitName
+    //re.resourceType = rcType
+    //re
   }
 
-  private[this] def resourceEntriesAt(t:Timeslot,w:UserStateMsg) : (List[ResourceEntry],Double) = {
-    val ret = new ListBuffer[ResourceEntry]
+  private[this] def resourceEntriesAt(t:Timeslot,w:UserStateMsg) : (java.util.List[ResourceEntryMsg],Double) = {
     var sum = 0.0
     //Console.err.println("Wallet entries: " + w.walletEntries)
     import scala.collection.JavaConverters.asScalaBufferConverter
@@ -204,75 +294,95 @@ object AbstractBillEntry {
     for { i <- walletEntries }
       Console.err.println("WALLET ENTRY\n%s\nEND WALLET ENTRY".format(i.toJsonString))
     Console.err.println("End wallet entries")*/
+    val ret = new java.util.ArrayList[ResourceEntryMsg]()//new ListBuffer[ResourceEntry]
     for { i <- walletEntries} {
       val referenceTimeslot = MessageHelpers.referenceTimeslotOf(i)
       if(t.contains(referenceTimeslot) && i.getSumOfCreditsToSubtract.toDouble != 0.0){
         /*Console.err.println("i.sumOfCreditsToSubtract : " + i.sumOfCreditsToSubtract)*/
         if(i.getSumOfCreditsToSubtract.toDouble > 0.0D)
           sum += i.getSumOfCreditsToSubtract.toDouble
-        ret += toResourceEntry(i)
+          ret.add(toResourceEntry(i)) //ret += toResourceEntry(i)
       } else {
         val ijson = AvroHelpers.jsonStringOfSpecificRecord(i)
         val itimeslot = MessageHelpers.referenceTimeslotOf(i)
-        Console.err.println("IGNORING WALLET ENTRY : " + ijson + "\n" +
-                     t + "  does not contain " +  itimeslot + "  !!!!")
+       // Console.err.println("IGNORING WALLET ENTRY : " + ijson + "\n" +
+       //              t + "  does not contain " +  itimeslot + "  !!!!")
       }
     }
-    (ret.toList,sum)
+    (ret,sum)
   }
 
-  private[this] def aggregateResourceEntries(re:List[ResourceEntry]) : List[ServiceEntry] = {
-    def addResourceEntries(a:ResourceEntry,b:ResourceEntry) : ResourceEntry = {
-      assert(a.resourceName == b.resourceName)
-      val totalCredits = (a.totalCredits.toDouble+b.totalCredits.toDouble).toString
-      val totalElapsedTime =  (a.totalElapsedTime.toLong+b.totalElapsedTime.toLong).toString
-      val totalUnits =  (a.totalUnits.toDouble+b.totalUnits.toDouble).toString
-      val ab = a.copy(a.resourceName/*,a.resourceType,a.unitName*/,totalCredits,totalElapsedTime,totalUnits,
-             a.details ::: b.details)
-      ab.unitName = a.unitName
-      ab.resourceType = a.resourceType
-      ab
+  private[this] def aggregateResourceEntries(re:java.util.List[ResourceEntryMsg]) : java.util.List[ServiceEntryMsg] = {
+    def addResourceEntries(a:ResourceEntryMsg,b:ResourceEntryMsg) : ResourceEntryMsg = {
+      assert(a.getResourceName == b.getResourceName)
+      val totalCredits = (a.getTotalCredits.toDouble+b.getTotalCredits.toDouble).toString
+      val totalElapsedTime =  (a.getTotalElapsedTime.toLong+b.getTotalElapsedTime.toLong).toString
+      val totalUnits =  (a.getTotalUnits.toDouble+b.getTotalUnits.toDouble).toString
+      val msg = new ResourceEntryMsg
+
+      val details = new java.util.ArrayList[EventEntryMsg](a.getDetails)
+      details.addAll(b.getDetails)
+      msg.setResourceName(a.getResourceName)
+      msg.setResourceType(a.getResourceType)
+      msg.setUnitName(a.getUnitName)
+      msg.setTotalCredits(totalCredits)
+      msg.setTotalElapsedTime(totalElapsedTime)
+      msg.setTotalUnits(totalUnits)
+      msg.setDetails(details)
+      msg
+      /*/*val ab =*/ a.copy(a.getResourceName,a.getResourceType,a.getUnitName,totalCredits,totalElapsedTime,totalUnits,
+                    {a.getDetails.addAll(b.details); a})
+      //ab.unitName = a.unitName
+      //ab.resourceType = a.resourceType
+      //ab*/
     }
-    val map0 = re.foldLeft(TreeMap[String,ResourceEntry]()){ (map,r1) =>
-      map.get(r1.resourceName) match {
-        case None => map + ((r1.resourceName,r1))
-        case Some(r0) => (map - r0.resourceName) +
-                         ((r0.resourceName, addResourceEntries(r0,r1)))
+    import scala.collection.JavaConverters.asScalaBufferConverter
+    val map0 = re.asScala.foldLeft(TreeMap[String,ResourceEntryMsg]()){ (map,r1) =>
+      map.get(r1.getResourceName) match {
+        case None => map + ((r1.getResourceName,r1))
+        case Some(r0) => (map - r0.getResourceName) +
+                         ((r0.getResourceName, addResourceEntries(r0,r1)))
       }
     }
-    val map1 = map0.foldLeft(TreeMap[String,List[ResourceEntry]]()){ case (map,(_,r1)) =>
-      map.get(r1.resourceType) match {
-        case None =>  map + ((r1.resourceType,List(r1)))
-        case Some(rl) => (map - r1.resourceType) +  ((r1.resourceType,r1::rl))
+    val map1 = map0.foldLeft(TreeMap[String,List[ResourceEntryMsg]]()){ case (map,(_,r1)) =>
+      map.get(r1.getResourceType) match {
+        case None =>  map + ((r1.getResourceType,List(r1)))
+        case Some(rl) => (map - r1.getResourceType) +  ((r1.getResourceType,r1::rl))
       }
     }
-    map1.foldLeft(List[ServiceEntry]()){ case (ret,(serviceName,resList)) =>
+    import scala.collection.JavaConverters.seqAsJavaListConverter
+    map1.foldLeft(List[ServiceEntryMsg]()){ case (ret,(serviceName,resList)) =>
       val (totalCredits,totalElapsedTime,totalUnits) =
         resList.foldLeft((0.0D,0L,0.0D)){ case ((a,b,c),r) =>
-            (a+r.totalCredits.toDouble,
-             b+r.totalElapsedTime.toLong,
-             c+r.totalUnits.toDouble
+            (a+r.getTotalCredits.toDouble,
+             b+r.getTotalElapsedTime.toLong,
+             c+r.getTotalUnits.toDouble
             )}
-      new ServiceEntry(serviceName,totalCredits.toString,
+      newServiceEntry(serviceName,totalCredits.toString,
                        totalElapsedTime.toString,totalUnits.toString,
-                       resList.head.unitName,resList) :: ret
-    }
+                       resList.head.getUnitName,resList.asJava) :: ret
+    }.asJava
   }
 
-  def addMissingServices(se:List[ServiceEntry],re:Map[String,ResourceType]) : List[ServiceEntry]=
-    se:::(re -- se.map(_.serviceName).toSet).foldLeft(List[ServiceEntry]()) { case (ret,(name,typ:ResourceType)) =>
-      new ServiceEntry(name,"0.0","0","0.0",typ.unit,List[ResourceEntry]()) :: ret
-    }
+  def addMissingServices(se0:java.util.List[ServiceEntryMsg],re:Map[String,ResourceType]) :
+   java.util.List[ServiceEntryMsg]= {
+    import scala.collection.JavaConverters.asScalaBufferConverter
+    val se = se0.asScala.toList
+    import scala.collection.JavaConverters.seqAsJavaListConverter
+    (se :::(re -- se.map(_.getServiceName).toSet).foldLeft(List[ServiceEntryMsg]()) { case (ret,(name,typ:ResourceType)) =>
+      newServiceEntry(name,"0.0","0","0.0",typ.unit,new java.util.ArrayList[ResourceEntryMsg]()) :: ret
+    }).asJava
+  }
 
   def fromWorkingUserState(t0:Timeslot,userID:String,w:Option[UserStateMsg],
-                           resourceTypes:Map[String,ResourceType]) : AbstractBillEntry = {
+                           resourceTypes:Map[String,ResourceType]) : BillEntryMsg = {
     val t = t0.roundMilliseconds /* we do not care about milliseconds */
     //Console.err.println("Timeslot: " + t0)
     //Console.err.println("After rounding timeslot: " + t)
     val ret = w match {
       case None =>
-          val allMissing = addMissingServices(Nil,resourceTypes)
-          new BillEntry(counter.getAndIncrement.toString,
+          val allMissing = addMissingServices(new util.ArrayList[ServiceEntryMsg](),resourceTypes)
+          newBillEntry(counter.getAndIncrement.toString,
                         userID,"processing",
                         "0.0",
                         "0.0",
@@ -280,11 +390,11 @@ object AbstractBillEntry {
                         allMissing)
       case Some(w) =>
         val wjson = AvroHelpers.jsonStringOfSpecificRecord(w)
-        Console.err.println("Working user state: %s".format(wjson))
+        //Console.err.println("Working user state: %s".format(wjson))
         val (rcEntries,rcEntriesCredits) = resourceEntriesAt(t,w)
         val resList0 = aggregateResourceEntries(rcEntries)
         val resList1 = addMissingServices(resList0,resourceTypes)
-        new BillEntry(counter.getAndIncrement.toString,
+        newBillEntry(counter.getAndIncrement.toString,
                       userID,"ok",
                       w.getTotalCredits.toString,
                       rcEntriesCredits.toString,
@@ -292,7 +402,7 @@ object AbstractBillEntry {
                       t.to.getTime.toString,
                       resList1)
     }
-    //Console.err.println("JSON: " +  ret.toJsonString)
+    //Console.err.println("JSON: " +  AvroHelpers.jsonStringOfSpecificRecord(ret))
     ret
   }
 
index 921662a..90f196e 100644 (file)
@@ -47,6 +47,12 @@ import scala.collection.JavaConverters.mapAsJavaMapConverter
 import scala.collection.JavaConverters.seqAsJavaListConverter
 import scala.Predef.Map
 import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.charging.bill._
+import gr.grnet.aquarium.charging.bill.ChargeEntry
+import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.charging.state.UserStateBootstrap
+import gr.grnet.aquarium.charging.bill.ResourceEntry
+import gr.grnet.aquarium.charging.bill.ServiceEntry
 
 /**
  * Provides helper methods that construct avro messages.
@@ -353,4 +359,63 @@ object MessageFactory {
     msg
   }
 
+  def toJavaList[A](l:List[A]) : java.util.List[A] = {
+    val al = new java.util.ArrayList[A]()
+    l.foreach(al.add(_))
+    al
+  }
+
+  def chargeEntryMsg(chargeEntry:ChargeEntry) : ChargeEntryMsg = {
+    val msg = new ChargeEntryMsg
+    msg.setId(chargeEntry.id)
+    msg.setUnitPrice(chargeEntry.unitPrice)
+    msg.setStartTime(chargeEntry.startTime)
+    msg.setEndTime(chargeEntry.endTime)
+    msg.setElapsedTime(chargeEntry.elapsedTime)
+    msg.setUnits(chargeEntry.units)
+    msg.setCredits(chargeEntry.credits)
+    msg
+  }
+
+  def eventEntryMsg(eventEntry:EventEntry) : EventEntryMsg = {
+    val msg = new EventEntryMsg
+    msg.setEventType(eventEntry.eventType)
+    msg.setDetails(toJavaList(eventEntry.details.map(chargeEntryMsg(_))))
+    msg
+  }
+
+  def resourceEntryMsg(resourceEntry:ResourceEntry) : ResourceEntryMsg = {
+    val msg = new ResourceEntryMsg
+    msg.setResourceName(resourceEntry.resourceName)
+    msg.setResourceType(resourceEntry.resourceType)
+    msg.setUnitName(resourceEntry.unitName)
+    msg.setTotalCredits(resourceEntry.totalCredits)
+    msg.setTotalElapsedTime(resourceEntry.totalElapsedTime)
+    msg.setTotalUnits(resourceEntry.totalUnits)
+    msg.setDetails(toJavaList(resourceEntry.details.map(eventEntryMsg(_))))
+    msg
+  }
+
+  def createServiceEntryMsg(serviceEntry:ServiceEntry) : ServiceEntryMsg = {
+    val msg = new ServiceEntryMsg
+    msg.setServiceName(serviceEntry.serviceName)
+    msg.setTotalCredits(serviceEntry.totalCredits)
+    msg.setTotalElapsedTime(serviceEntry.totalElapsedTime)
+    msg.setTotalUnits(serviceEntry.totalUnits)
+    msg.setUnitName(serviceEntry.unitName)
+    msg.setDetails(toJavaList(serviceEntry.details.map(resourceEntryMsg(_))))
+    msg
+  }
+  def createBillEntryMsg(billEntry:BillEntry) : BillEntryMsg = {
+    val msg = new BillEntryMsg
+    msg.setId(billEntry.id)
+    msg.setUserID(billEntry.userID)
+    msg.setStatus(billEntry.status)
+    msg.setRemainingCredits(billEntry.remainingCredits)
+    msg.setDeductedCredits(billEntry.deductedCredits)
+    msg.setStartTime(billEntry.startTime)
+    msg.setEndTime(billEntry.endTime)
+    msg.setBill(toJavaList(billEntry.bill.map(createServiceEntryMsg(_))))
+    msg
+  }
 }
index 1fcff71..e1f8b9f 100644 (file)
@@ -49,6 +49,8 @@ import gr.grnet.aquarium.logic.accounting.dsl.Timeslot
 import gr.grnet.aquarium.policy.CronSpec
 import gr.grnet.aquarium.message.avro.gen.{BillEntryMsg, IMEventMsg, ResourceEventMsg}
 import org.apache.avro.specific.SpecificRecord
+import util.json.JsonSupport
+import actors.Future
 
 
 /*
@@ -112,19 +114,17 @@ object AquariumInstance {
       update(Aquarium.EnvKeys.eventsStoreFolder,Some(new File(".."))).
       build()
   }
-  def run(billWait:Int, stop:Int)(f : => String) : String = {
-    var _ret = ""
+  def run(billWait:Int, stop:Int)(f : => Unit) = {
     aquarium.start
     Thread.sleep(billWait)
     try{
-      _ret = f
+      f
     } finally {
       Console.err.println("Stopping aquarium")
+      aquarium.stop
       Thread.sleep(stop)
       Console.err.println("Stopping aquarium --- DONE")
-      aquarium.stop
     }
-    _ret
   }
 }
 
@@ -141,10 +141,8 @@ object JsonLog {
 } */
 
 object MessageService {
-  val rabbitMQEnabled = false
-  val debugEnabled = false
 
-  def send(event:SpecificRecord) = {
+  def send(event:SpecificRecord, rabbitMQEnabled : Boolean = false, debugEnabled:Boolean =false) = {
     val json = AvroHelpers.jsonStringOfSpecificRecord(event)
     if(rabbitMQEnabled){
       val (exchangeName,routingKey) = event match {
@@ -276,7 +274,9 @@ abstract class Message {
       case Some(millis) =>
         updateMap(map)
         val event = makeEvent(millis,_map)
-        MessageService.send(event)
+        val ren = _map.getOrElse("rabbitMQEnabled","false").toBoolean
+        val rdb = _map.getOrElse("debugEnabled","false").toBoolean
+        MessageService.send(event,ren,rdb)
         _messagesSent += 1
         true
       case None =>
@@ -447,14 +447,15 @@ object Message {
   def apply(typ:String,args:Tuple2[String,String]*) : Message =
     apply(typ,args.foldLeft(Map[String,String]())({(map,arg)=> map + arg}))
 
+  val msgMap = Map[String,()=>Message](
+    "vm"      -> (() => new VMMessage),
+    "disk"    -> (() => new DiskMessage),
+    "create"  -> (() => new CreationMessage),
+    "credits" -> (() => new AddCreditsMessage)
+  )
+
   def apply(typ:String,map:Map[String,String]) : Message = {
-    val msg =  typ match {
-      case "vm" => new VMMessage
-      case "disk" =>   new DiskMessage
-      case "create" => new CreationMessage
-      case "credits" => new AddCreditsMessage
-      case _ => throw new Exception("unknown type")
-    }
+    val msg = msgMap.getOrElse(typ,throw new Exception("Invalid type : "+typ))()
     msg.updateMap(map)
     msg
   }
@@ -465,8 +466,24 @@ class User(serverAndPort:String,month:Int) {
   val uid = "user%d@grnet.gr".format(UID.next)
   val _creationMessage  : Message = Message("create","uid"->uid,"month"->month.toString,"spec"->"")
   var _resources : List[Message] = Nil
+  var _billEntryMsg :Option[BillEntryMsg] = None
 
+  override def toString() = uid
 
+  def validateResults() : Boolean = {
+    throw new Exception("Not implemented !!!!")
+  }
+
+  def printResults() = {
+    Console.err.println("Messages sent:")
+    for { m <- JsonLog.get}
+      Console.err.println("%s".format(m)) //"\n==============\n%s\n==============="
+    Console.err.println("\n=========================\n")
+    Console.err.println("Response:\n" + (_billEntryMsg match {
+      case None => "NONE!!!!"
+      case Some(r) => AvroHelpers.jsonStringOfSpecificRecord(r)
+    }))
+  }
 
   def add(no:Int,typ:String,args:Tuple2[String,String]*) : User =
     add(no,typ,args.foldLeft(Map[String,String]())({(map,arg)=> map + arg}))
@@ -482,29 +499,31 @@ class User(serverAndPort:String,month:Int) {
     this
   }
 
-  def addVMs(no:Int,status:String,cronSpec:String) : User =
+  def addVMs(no:Int,cronSpec:String) : User =
     add(no,"vm",{i =>
          Map("instanceID"->"cyclades.vm.%d".format(i),
          "vmName"  -> "Virtual Machine #%d".format(i),
-         "status"  -> status,
+         "status"  -> "on", // initially "on" msg
          "spec"    -> cronSpec)})
 
-  def addFiles(no:Int,action:String,value:Int,minVal:Int,maxVal:Int,spec:String) : User =
+  def addFiles(no:Int,action:String/*,value:Int,minVal:Int,maxVal:Int*/,spec:String) : User =
     add(no,"disk",{i =>
        Map("action" -> action,
            "path"->"/Papers/file_%d.PDF".format(i),
-           "value"->UID.random(minVal,maxVal).toString,
+           //"value"->UID.random(minVal,maxVal).toString,
            "spec" -> spec
           )
     })
 
-  def addCredits(amount:Int,spec:String) : User = {
-    add(1,"credits","month"->month.toString,"uid"->uid,"spec"->spec,"amount"->amount.toString)
+  def addCredits(no:Int,spec:String) : User = {
+    add(no,"credits",/*"month"->month.toString,"uid"->uid,*/"spec"->spec/*,"amount"->amount.toString*/)
   }
 
-  def run(ordered:Boolean,wait:Int,minFile:Int,maxFile:Int,minAmount:Int,maxAmount:Int,maxJSONRetry:Int=10) : String =  {
+  def run(ordered:Boolean,wait:Int,minFile:Int,maxFile:Int,minAmount:Int,maxAmount:Int,maxJSONRetry :Int,
+          sendViaRabbitMQ:Boolean, sendDebugEnabled : Boolean)  =  {
+    var _messagesSent : List[Message] = Nil
     _creationMessage.send("month"->month.toString,"uid"->uid,"spec"->"0 0 * %d ?".format(month)) // send once!
-    Thread.sleep(4000)
+    //Thread.sleep(2000)
     var iter = _resources.toList
     while(!iter.isEmpty)
       iter = (if(!ordered) iter
@@ -513,16 +532,19 @@ class User(serverAndPort:String,month:Int) {
         case (None,None) => true
         case (None,Some(l)) => true
         case (Some(l),None) => false
-      }}).filter(_.send("value"->UID.random(minFile,maxFile).toString,
-          "amount"->UID.random(minAmount,maxAmount).toString //,
-          //"status" -> UID.random(List("off","on"))
-        ))
-
+      }}).filter({m =>
+        _messagesSent = _messagesSent ::: List(m)
+        m.send("value"->UID.random(minFile,maxFile).toString,
+               "amount"->UID.random(minAmount,maxAmount).toString,
+               "rabbitMQEnabled" -> sendViaRabbitMQ.toString,
+               "debugEnabled" -> sendDebugEnabled.toString
+                //"status" -> UID.random(List("off","on"))
+        )})
     Thread.sleep(wait)
-    getJSON(maxJSONRetry)
+    _billEntryMsg = getBillResponse(maxJSONRetry)
   }
 
-  def getJSON(max:Int=10) : String = {
+  private[this] def getBillResponse(max:Int) : Option[BillEntryMsg] = {
     def get () : String = {
       val fromMillis = _creationMessage._range.from.getTime
       val toMillis   = _creationMessage._range.to.getTime
@@ -545,37 +567,176 @@ class User(serverAndPort:String,month:Int) {
     }
     var resp = ""
     var count = 0
+    var ret : Option[BillEntryMsg] = None
     while(resp.isEmpty && count < max){
       if(count > 0) Console.err.println("Retrying for bill request.")
       resp = get()
       if(resp.isEmpty) Thread.sleep(1000)
-      //val b = AvroHelpers.specificRecordOfJsonString(resp, new BillEntryMsg)
-      if(resp.indexOf("processing") > -1){
-        Thread.sleep(1000)
-        resp = ""
+      else {
+        try{
+          var b = AvroHelpers.specificRecordOfJsonString(resp, new BillEntryMsg)
+          ret = Some(b)
+          if(b.getStatus().equals("processing")){
+            Thread.sleep(1000)
+            resp = ""
+          }
+        }  catch {
+          case e:Exception =>
+              e.printStackTrace
+              resp = ""
+        }
       }
       //sleep(1000L)
       count += 1
     }
-    resp
+    ret
+  }
+}
+
+class Resource(
+   val resType  : String, // Message.msgMap.keys
+   val instances: Long,
+   val cronSpec : String
+ )
+extends JsonSupport {}
+
+class Scenario(
+  val ignoreScenario : Boolean,
+  val host : String,
+  val port : Long,
+  val sendOrdered : Boolean,
+  val sendViaRabbitMQ : Boolean,
+  val sendDebugEnabled : Boolean,
+  val validationEnabled : Boolean,
+  val billingMonth: Long,
+  val aquariumStartWaitMillis : Long,
+  val aquariumStopWaitMillis : Long,
+  val billResponseWaitMillis : Long,
+  val numberOfUsers  : Long,
+  val numberOfResponseRetries : Long,
+  val minFileCredits : Long,
+  val maxFileCredits : Long,
+  val minUserCredits : Long,
+  val maxUserCredits : Long,
+  val resources : List[Resource]
+)
+extends JsonSupport {}
+
+class Scenarios(
+   val scenarios : List[Scenario] )
+extends JsonSupport {}
+
+object ScenarioRunner {
+  val aquarium  = AquariumInstance.aquarium
+
+  def parseScenario(txt:String) : Scenario =
+    StdConverters.AllConverters.convertEx[Scenario](txt)
+
+  def parseScenarios(txt:String) : Scenarios =
+    StdConverters.AllConverters.convertEx[Scenarios](txt)
+
+  def runScenario(txt:String) : Unit = runScenario(parseScenario(txt))
+
+  private[this] def runUser(s:Scenario) : User = {
+    val user = new User("%s:%d".format(s.host,s.port),s.billingMonth.toInt)
+    val (minFileCredits,maxFileCredits) = (s.minFileCredits,s.maxFileCredits)
+    val (minUserCredits,maxUserCredits) = (s.maxUserCredits,s.maxUserCredits)
+    //Cron spec  minutes hours day-of-month Month Day-of-Week (we do not specify seconds)
+    AquariumInstance.run(s.aquariumStartWaitMillis.toInt,s.aquariumStopWaitMillis.toInt) {
+      for{ r <- s.resources}  // create messages
+        r.resType match {
+          case "vm" =>
+            user.addVMs(r.instances.toInt,r.cronSpec)
+          case "disk" =>
+            user.addFiles(r.instances.toInt,"update",r.cronSpec)
+          case "credits" =>
+            user.addCredits(r.instances.toInt,r.cronSpec)
+        }
+      // run scenario
+      user.run(s.sendOrdered,s.billResponseWaitMillis.toInt,s.minFileCredits.toInt,
+               s.maxFileCredits.toInt,s.minUserCredits.toInt,s.maxUserCredits.toInt,
+               s.numberOfResponseRetries.toInt,s.sendViaRabbitMQ,s.sendDebugEnabled)
+    }
+    user
+  }
+
+  def runScenario(s:Scenario): Unit = {
+    if(s.ignoreScenario == false) {
+      Console.err.println("=================\nRunning scenario:\n %s\n=======================\n".format(s.toJsonString))
+      val tasks = for { u <- 1 to s.numberOfUsers.toInt}
+                  yield scala.actors.Futures.future(runUser(s))
+      val users = for { u <- tasks}  yield u()
+      users.foreach {u =>
+         u.printResults()
+         if(s.validationEnabled && u.validateResults() == false)
+           Console.err.println("Validation FAILED for user " + u)
+      }
+      Console.err.println("\n=========================\nStopping scenario\n=======================")
+    }
+  }
+
+  def runScenarios(txt:String) : Unit = runScenarios(parseScenarios(txt))
+
+  def runScenarios(ss:Scenarios) = {
+    Console.err.println("=================\nScenarios:\n %s\n=======================\n".format(ss.toJsonString))
+    ss.scenarios.foreach(runScenario(_))
   }
+
 }
 
 object UserTest extends Loggable {
 
- val aquarium  = AquariumInstance.aquarium
+   //vm,disk,credits
+  //add(1,"credits","month"->month.toString,"uid"->uid,"spec"->spec,"amount"->amount.toString)
+  /*
+    val host : String,
+  val port : Long,
+  val sendOrdered : Boolean,
+  val sendViaRabbitMQ : Boolean,
+  val sendDebugEnabled : Boolean,
+  val validationEnabled : Boolean,
+  val billingMonth: Long,
+  val aquariumStartWaitMillis : Long,
+  val aquariumStopWaitMillis : Long,
+  val billResponseWaitMillis : Long,
+  val numberOfUsers  : Long,
+  val numberOfResponseRetries : Long,
+  val minFileCredits : Long,
+  val maxFileCredits : Long,
+  val minUserCredits : Long,
+  val maxUserCredits : Long,
+  val resources : List[Resource]
+
+   */
+ val basic = new Scenario(false,"localhost",8888,true,false,false,false,9,2000,2000,2000,
+                          1,10,2000,5000,10000,50000,List[Resource](
+                          new Resource("credits",1, "00 00 10,12 9 ?"),
+                          new Resource("disk",1,"00 18 15,20,29,30 9 ?"),
+                          new Resource("vm",1,"00 18 14,17,19,20 9 ?")
+                        ))
 
  def main(args: Array[String]) = {
-    val user = new User("localhost:8888",9)
+
+   try{
+     val lines = scala.io.Source.fromFile(args.head).mkString
+     ScenarioRunner.runScenarios(new Scenarios(List(basic)))
+   } catch {
+     case e:Exception =>
+       e.printStackTrace()
+       ScenarioRunner.runScenarios(new Scenarios(List(basic)))
+   }
+
+
+/*    val user = new User("localhost:8888",9)
     val (minFileCredits,maxFileCredits) = (2000,5000)
     val (minUserCredits,maxUserCredits) = (10000,10000)
     //Cron spec  minutes hours day-of-month Month Day-of-Week (we do not specify seconds)
 
    val json =AquariumInstance.run(2000,2000) {
           user.
-                  addCredits(100000,"00 00 10,12 9 ?").
+                  addCredits(1,"00 00 10,12 9 ?").
                   addFiles(1,"update",2000,1000,3000,"00 18 15,20,29,30 9 ?").
-                  addVMs(1,"on","00 18 14,17,19,20 9 ?").
+                  addVMs(1,"00 18 14,17,19,20 9 ?").
                   //addVMs(5,"on","00 18 ? 9 Tue")
                  run(true,2000,minFileCredits,maxFileCredits,minUserCredits,maxUserCredits)
    }
@@ -584,13 +745,13 @@ object UserTest extends Loggable {
    for { m <- JsonLog.get}
      Console.err.println("%s".format(m)) //"\n==============\n%s\n==============="
    Console.err.println("\n=========================\n")
-   Console.err.println("Response:\n" + json)
+   Console.err.println("Response:\n" + json)*/
  }
 
 }
 
 
-
+/*
 object BillTest extends Loggable {
 
   type JSON = String
@@ -838,3 +999,4 @@ object BillTest extends Loggable {
     runTestCase(testCase1)
   }
 }
+*/