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;
}
-
}