You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/06/08 16:01:57 UTC

git commit: [OLINGO-224] Update reference scenario to showcase Delta Token Implementation

Repository: olingo-odata2
Updated Branches:
  refs/heads/master 01db5f1ed -> 14e79efc6


[OLINGO-224] Update reference scenario to showcase Delta Token
Implementation

Signed-off-by: Chandan V A <ch...@sap.com>


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/14e79efc
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/14e79efc
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/14e79efc

Branch: refs/heads/master
Commit: 14e79efc6eb41d71271002416a1e1acea4fcb867
Parents: 01db5f1
Author: Chandan V A <ch...@sap.com>
Authored: Sun Jun 8 19:30:38 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Sun Jun 8 19:30:38 2014 +0530

----------------------------------------------------------------------
 .../SalesOrderItemTombstoneListener.java        | 77 ++++++++++++++++++++
 .../listeners/SalesOrderTombstoneListener.java  | 39 ++++++++++
 .../processor/ref/model/SalesOrderHeader.java   | 23 ++----
 .../jpa/processor/ref/model/SalesOrderItem.java |  2 +
 4 files changed, 125 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14e79efc/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderItemTombstoneListener.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderItemTombstoneListener.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderItemTombstoneListener.java
new file mode 100644
index 0000000..c44bc62
--- /dev/null
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderItemTombstoneListener.java
@@ -0,0 +1,77 @@
+package org.apache.olingo.odata2.jpa.processor.ref.listeners;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneContext;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneEntityListener;
+import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
+import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
+import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContext;
+import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLContextType;
+import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLStatement;
+
+public class SalesOrderItemTombstoneListener extends ODataJPATombstoneEntityListener {
+
+  @Override
+  public Query getQuery(final GetEntitySetUriInfo resultsView, final EntityManager em) {
+    JPQLContextType contextType = null;
+
+    try {
+      if (!resultsView.getStartEntitySet().getName().equals(resultsView.getTargetEntitySet().getName())) {
+        contextType = JPQLContextType.JOIN;
+      } else {
+        contextType = JPQLContextType.SELECT;
+      }
+
+      JPQLContext jpqlContext = JPQLContext.createBuilder(contextType, resultsView).build();
+      JPQLStatement jpqlStatement = JPQLStatement.createBuilder(jpqlContext).build();
+      String deltaToken = ODataJPATombstoneContext.getDeltaToken();
+
+      Query query = null;
+      if (deltaToken != null) {
+        String statement = jpqlStatement.toString();
+        String[] statementParts = statement.split(JPQLStatement.KEYWORD.WHERE);
+        String deltaCondition = jpqlContext.getJPAEntityAlias() + ".creationDate >= {ts '" + deltaToken + "'}";
+        if (statementParts.length > 1) {
+          statement =
+              statementParts[0] + JPQLStatement.DELIMITER.SPACE + JPQLStatement.KEYWORD.WHERE
+                  + JPQLStatement.DELIMITER.SPACE + deltaCondition + JPQLStatement.DELIMITER.SPACE
+                  + JPQLStatement.Operator.AND + statementParts[1];
+        } else {
+          statement =
+              statementParts[0] + JPQLStatement.DELIMITER.SPACE + JPQLStatement.KEYWORD.WHERE
+                  + JPQLStatement.DELIMITER.SPACE + deltaCondition;
+        }
+
+        query = em.createQuery(statement);
+      } else {
+        query = em.createQuery(jpqlStatement.toString());
+      }
+
+      return query;
+    } catch (EdmException e) {
+      return null;
+    } catch (ODataJPAModelException e) {
+      return null;
+    } catch (ODataJPARuntimeException e) {
+      return null;
+    }
+  }
+
+  @Override
+  public String generateDeltaToken(final List<Object> deltas, final Query query) {
+    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.000");
+
+    Date date = new Date(System.currentTimeMillis());
+    dateFormat.format(date);
+    return dateFormat.format(date);
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14e79efc/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderTombstoneListener.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderTombstoneListener.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderTombstoneListener.java
new file mode 100644
index 0000000..ae80c53
--- /dev/null
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/listeners/SalesOrderTombstoneListener.java
@@ -0,0 +1,39 @@
+package org.apache.olingo.odata2.jpa.processor.ref.listeners;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PostLoad;
+import javax.persistence.Query;
+
+import org.apache.olingo.odata2.api.uri.info.GetEntitySetUriInfo;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneContext;
+import org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneEntityListener;
+import org.apache.olingo.odata2.jpa.processor.ref.model.SalesOrderHeader;
+
+public class SalesOrderTombstoneListener extends ODataJPATombstoneEntityListener {
+
+  public static String ENTITY_NAME = "SalesOrderHeader";
+
+  @PostLoad
+  public void handleDelta(final Object entity) {
+    SalesOrderHeader so = (SalesOrderHeader) entity;
+
+    if (so.getCreationDate().getTime().getTime() < ODataJPATombstoneContext.getDeltaTokenUTCTimeStamp()) {
+      return;
+    } else {
+      addToDelta(entity, ENTITY_NAME);
+    }
+  }
+
+  @Override
+  public String generateDeltaToken(final List<Object> deltas, final Query query) {
+    return String.valueOf(System.currentTimeMillis());
+  }
+
+  @Override
+  public Query getQuery(final GetEntitySetUriInfo resultsView, final EntityManager em) {
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14e79efc/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
index 74a39c8..f54bbe7 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderHeader.java
@@ -20,15 +20,14 @@ package org.apache.olingo.odata2.jpa.processor.ref.model;
 
 import java.util.ArrayList;
 import java.util.Calendar;
-import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.TimeZone;
 
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
@@ -40,6 +39,7 @@ import javax.persistence.TemporalType;
 
 @Entity
 @Table(name = "T_SALESORDERHEADER")
+@EntityListeners(org.apache.olingo.odata2.jpa.processor.ref.listeners.SalesOrderTombstoneListener.class)
 public class SalesOrderHeader {
 
   public SalesOrderHeader() {}
@@ -116,26 +116,17 @@ public class SalesOrderHeader {
     this.soId = soId;
   }
 
-  public Date getCreationDate() {
+  public Calendar getCreationDate() {
     if (creationDate == null) {
       return null;
     }
-    long dbTime = creationDate.getTime().getTime();
-    Date originalDate = new Date(dbTime + TimeZone.getDefault().getOffset(dbTime));
-    return originalDate;
+
+    return creationDate;
   }
 
   public void setCreationDate(final Calendar creationDate) {
-    long originalTime;
-    if (creationDate != null) {
-      originalTime = creationDate.getTime().getTime();
-    } else {
-      originalTime = Calendar.getInstance(TimeZone.getDefault()).getTime().getTime();
-    }
-    Date newDate = new Date(originalTime - TimeZone.getDefault().getOffset(originalTime));
-    Calendar newCalendar = Calendar.getInstance();
-    newCalendar.setTime(newDate);
-    this.creationDate = newCalendar;
+
+    this.creationDate = creationDate;
   }
 
   public String getCurrencyCode() {

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/14e79efc/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
index 412287b..44bf6c2 100644
--- a/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
+++ b/odata2-jpa-processor/jpa-ref/src/main/java/org/apache/olingo/odata2/jpa/processor/ref/model/SalesOrderItem.java
@@ -21,6 +21,7 @@ package org.apache.olingo.odata2.jpa.processor.ref.model;
 import javax.persistence.Column;
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;
@@ -28,6 +29,7 @@ import javax.persistence.Transient;
 
 @Entity
 @Table(name = "T_SALESORDERITEM")
+@EntityListeners(org.apache.olingo.odata2.jpa.processor.ref.listeners.SalesOrderItemTombstoneListener.class)
 public class SalesOrderItem {
 
   public SalesOrderItem() {}