You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by mi...@apache.org on 2015/10/31 08:02:42 UTC

olingo-odata2 git commit: [OLINGO-807] Added method for get delta link

Repository: olingo-odata2
Updated Branches:
  refs/heads/OLINGO-807_JPA-Tombstone [created] 0cfe38c0e


[OLINGO-807] Added method for get delta link


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

Branch: refs/heads/OLINGO-807_JPA-Tombstone
Commit: 0cfe38c0e5916c52bf7c4eac2f20600b5ebb1287
Parents: d691177
Author: mibo <mi...@mirb.de>
Authored: Sat Oct 31 07:37:48 2015 +0100
Committer: mibo <mi...@mirb.de>
Committed: Sat Oct 31 07:54:27 2015 +0100

----------------------------------------------------------------------
 .../ODataJPAQueryExtensionEntityListener.java   |  7 -----
 .../processor/api/ODataJPATombstoneContext.java |  9 ++++++
 .../api/ODataJPATombstoneEntityListener.java    | 26 +++++++++++++----
 .../core/ODataJPAResponseBuilderDefault.java    | 22 +++++++++++---
 .../core/access/data/JPAProcessorImpl.java      | 13 +++++----
 .../listeners/SalesOrderTombstoneListener.java  | 30 ++++++++++++--------
 6 files changed, 72 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAQueryExtensionEntityListener.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAQueryExtensionEntityListener.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAQueryExtensionEntityListener.java
index 0ad3ac4..cc3e1b6 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAQueryExtensionEntityListener.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPAQueryExtensionEntityListener.java
@@ -18,8 +18,6 @@
  ******************************************************************************/
 package org.apache.olingo.odata2.jpa.processor.api;
 
-import java.util.List;
-
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
 
@@ -99,11 +97,6 @@ public abstract class ODataJPAQueryExtensionEntityListener extends ODataJPATombs
     return null;
   }
 
-  @Override
-  public String generateDeltaToken(List<Object> deltas, Query query) {
-    return null;
-  }
-
   /**
    * Implement this method to indicate whether the extended class can handle OData Tombstone feature as well
    * @return false by default

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneContext.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneContext.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneContext.java
index 7229d14..bd2a4a2 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneContext.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneContext.java
@@ -29,10 +29,19 @@ import java.util.List;
 public final class ODataJPATombstoneContext {
 
   private static final ThreadLocal<String> deltaToken = new ThreadLocal<String>();
+  private static final ThreadLocal<String> deltaLink = new ThreadLocal<String>();
   private static final ThreadLocal<Long> deltaTokenUTCTimeStamp = new ThreadLocal<Long>();
   private static final ThreadLocal<HashMap<String, List<Object>>> deltas =
       new ThreadLocal<HashMap<String, List<Object>>>();
 
+  public static String getDeltaLink() {
+    return deltaLink.get();
+  }
+
+  public static void setDeltaLink(final String link) {
+    deltaLink.set(link);
+  }
+
   public static String getDeltaToken() {
     return deltaToken.get();
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneEntityListener.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneEntityListener.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneEntityListener.java
index ff85653..80b7579 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneEntityListener.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/ODataJPATombstoneEntityListener.java
@@ -40,9 +40,9 @@ public abstract class ODataJPATombstoneEntityListener {
 
   /**
    * Implement this method to create a {@link javax.persistence.Query} object. The Query object can be created from
-   * OData requests. The query instance thus created can be used for handling delta JPA entities. The delta token passed
-   * from OData request can
-   * be accessed from {@link com.sap.core.odata.processor.api.jpa.ODataJPATombstoneContext}.
+   * OData requests. The query instance thus created can be used for handling delta JPA entities.
+   * The delta token passed from OData request can
+   * be accessed from {@link org.apache.olingo.odata2.jpa.processor.api.ODataJPATombstoneContext}.
    * @param resultsView is a reference to OData request
    * @param em is a reference to {@link javax.persistence.EntityManager}
    * @return an instance of type {@link javax.persistence.Query}
@@ -50,12 +50,26 @@ public abstract class ODataJPATombstoneEntityListener {
   public abstract Query getQuery(GetEntitySetUriInfo resultsView, EntityManager em);
 
   /**
-   * Implement this method to create a delta token.
+   * Implement this method to generate a delta token (which is added as
+   * <code>!deltatoken=<result of this method></code>).
    * @param deltas is list of delta JPA Entities
-   * @param query is an instance of type {@link javax.persistence.Query} that was used for handling delta entites
+   * @param query is an instance of type {@link javax.persistence.Query} that was used for handling delta entities
    * @return a delta token of type String
    */
-  public abstract String generateDeltaToken(List<Object> deltas, Query query);
+  public String generateDeltaToken(List<Object> deltas, Query query) {
+    return null;
+  }
+
+  /**
+   * Implement this method to return the whole delta link.
+   * This has to be encoded to given rules (e.g. HTTP URL encoding and/or XML content encoding).
+   * <code><link rel="delta" href="<result of this method>"/></code>
+   * @param entitySetUriInfo information about the related OData request
+   * @return the delta link
+   */
+  public String getDeltaLink(GetEntitySetUriInfo entitySetUriInfo) {
+    return null;
+  }
 
   /**
    * Implement this method to indicate whether the extended class can handle OData Tombstone feature as well

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java
index edec5fb..bbab1d8 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataJPAResponseBuilderDefault.java
@@ -44,6 +44,7 @@ import org.apache.olingo.odata2.api.ep.EntityProviderException;
 import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties;
 import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties.ODataEntityProviderPropertiesBuilder;
 import org.apache.olingo.odata2.api.ep.callback.TombstoneCallback;
+import org.apache.olingo.odata2.api.ep.callback.TombstoneCallbackResult;
 import org.apache.olingo.odata2.api.exception.ODataException;
 import org.apache.olingo.odata2.api.exception.ODataHttpException;
 import org.apache.olingo.odata2.api.exception.ODataNotFoundException;
@@ -519,10 +520,23 @@ public final class ODataJPAResponseBuilderDefault implements ODataJPAResponseBui
       Map<String, ODataCallback> callBackMap = new HashMap<String, ODataCallback>();
       callBackMap.putAll(expandCallBack);
 
-      String deltaToken = ODataJPATombstoneContext.getDeltaToken();
-      if (deltaToken != null) {
-        callBackMap.put(TombstoneCallback.CALLBACK_KEY_TOMBSTONE, new JPATombstoneCallBack(serviceRoot.toString(),
-            resultsView, deltaToken));
+      final String deltaLink = ODataJPATombstoneContext.getDeltaLink();
+      if(deltaLink != null) {
+        callBackMap.put(TombstoneCallback.CALLBACK_KEY_TOMBSTONE,
+            new TombstoneCallback() {
+              @Override
+              public TombstoneCallbackResult getTombstoneCallbackResult() {
+                final TombstoneCallbackResult result = new TombstoneCallbackResult();
+                result.setDeltaLink(deltaLink);
+                return result;
+              }
+            });
+      } else {
+        String deltaToken = ODataJPATombstoneContext.getDeltaToken();
+        if (deltaToken != null) {
+          callBackMap.put(TombstoneCallback.CALLBACK_KEY_TOMBSTONE, new JPATombstoneCallBack(serviceRoot.toString(),
+              resultsView, deltaToken));
+        }
       }
 
       entityFeedPropertiesBuilder.callbacks(callBackMap);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
index 195153b..f71e3a8 100644
--- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
+++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAProcessorImpl.java
@@ -129,9 +129,9 @@ public class JPAProcessorImpl implements JPAProcessor {
   public List<Object> process(final GetEntitySetUriInfo uriParserResultView)
       throws ODataJPAModelException, ODataJPARuntimeException {
 
-    List<Object> result = null;
+    List<Object> result;
     if (uriParserResultView.getFunctionImport() != null) {
-      return (List<Object>) process((GetFunctionImportUriInfo) uriParserResultView);
+      return process((GetFunctionImportUriInfo) uriParserResultView);
     }
 
     InlineCount inlineCount = uriParserResultView.getInlineCount();
@@ -158,14 +158,15 @@ public class JPAProcessorImpl implements JPAProcessor {
       }
       if (listener != null && (!queryInfo.isTombstoneQuery() && listener.isTombstoneSupported())) {
         query.getResultList();
-        List<Object> deltaResult =
-            (List<Object>) ODataJPATombstoneContext.getDeltaResult(((EdmMapping) mapping).getInternalName());
+        List<Object> deltaResult = ODataJPATombstoneContext
+            .getDeltaResult(((EdmMapping) mapping).getInternalName());
         result = handlePaging(deltaResult, uriParserResultView);
       } else {
         result = handlePaging(query, uriParserResultView);
       }
       if (listener != null && listener.isTombstoneSupported()) {
-        ODataJPATombstoneContext.setDeltaToken(listener.generateDeltaToken((List<Object>) result, query));
+        ODataJPATombstoneContext.setDeltaLink(listener.getDeltaLink(uriParserResultView));
+        ODataJPATombstoneContext.setDeltaToken(listener.generateDeltaToken(result, query));
       }
       return result == null ? new ArrayList<Object>() : result;
     } catch (EdmException e) {
@@ -182,7 +183,7 @@ public class JPAProcessorImpl implements JPAProcessor {
 
   /* Process Get Entity Request (Read) */
   @Override
-  public <T> Object process(GetEntityUriInfo uriParserResultView)
+  public Object process(GetEntityUriInfo uriParserResultView)
       throws ODataJPAModelException, ODataJPARuntimeException {
     return readEntity(new JPAQueryBuilder(oDataJPAContext).build(uriParserResultView));
   }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/0cfe38c0/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
index 55f2013..2ee9d2b 100644
--- 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
@@ -18,40 +18,46 @@
  ******************************************************************************/
 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.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.ref.model.SalesOrderHeader;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PostLoad;
+import javax.persistence.Query;
+
 public class SalesOrderTombstoneListener extends ODataJPATombstoneEntityListener {
 
   public static String ENTITY_NAME = "SalesOrderHeader";
+  private static final String DELTA_TOKEN_STRING = "?!deltatoken=";
 
   @PostLoad
   public void handleDelta(final Object entity) {
     SalesOrderHeader so = (SalesOrderHeader) entity;
 
-    if (so.getCreationDate().getTime().getTime() < ODataJPATombstoneContext.getDeltaTokenUTCTimeStamp()) {
-      return;
-    } else {
+    if (so.getCreationDate().getTime().getTime() >= ODataJPATombstoneContext.getDeltaTokenUTCTimeStamp()) {
       addToDelta(entity, ENTITY_NAME);
     }
   }
 
   @Override
-  public String generateDeltaToken(final List<Object> deltas, final Query query) {
-    return String.valueOf(System.currentTimeMillis());
+  public String getDeltaLink(GetEntitySetUriInfo entitySetUriInfo) {
+    StringBuilder sb = new StringBuilder();
+    try {
+      if (entitySetUriInfo != null) {
+        sb.append(entitySetUriInfo.getTargetEntitySet().getName());
+      }
+    } catch (EdmException e) {
+      // Nothing
+    }
+    sb.append(DELTA_TOKEN_STRING).append(System.currentTimeMillis());
+    return sb.toString();
   }
 
   @Override
   public Query getQuery(final GetEntitySetUriInfo resultsView, final EntityManager em) {
     return null;
   }
-
 }