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 <[email protected]> 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 <[email protected]> Authored: Sun Jun 8 19:30:38 2014 +0530 Committer: Chandan V A <[email protected]> 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() {}
