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 <[email protected]> Authored: Sat Oct 31 07:37:48 2015 +0100 Committer: mibo <[email protected]> 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; } - }
