You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by sk...@apache.org on 2014/05/13 13:47:57 UTC

[13/31] git commit: [OLINGO-260] provided create with back navigation link integration test on proxy

[OLINGO-260] provided create with back navigation link integration test on proxy


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/3af2c8ce
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/3af2c8ce
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/3af2c8ce

Branch: refs/heads/olingo-266-ref
Commit: 3af2c8ce4fdfadfe5a3bf180decc81204dd37f2c
Parents: 322a3ef
Author: fmartelli <fa...@gmail.com>
Authored: Mon May 12 17:03:30 2014 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Mon May 12 17:03:30 2014 +0200

----------------------------------------------------------------------
 .../olingo/ext/proxy/commons/ContainerImpl.java | 10 +--
 .../commons/EntityTypeInvocationHandler.java    | 30 ++++----
 .../org/apache/olingo/fit/AbstractServices.java | 55 ++++++++------
 .../org/apache/olingo/fit/utils/Commons.java    |  2 +-
 .../org/apache/olingo/fit/utils/FSManager.java  |  1 +
 .../fit/proxy/v3/EntityCreateTestITCase.java    |  3 +-
 .../apache/olingo/fit/v3/BatchTestITCase.java   | 79 +++++++++++++++++++-
 7 files changed, 130 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java
index e89c843..8959351 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/ContainerImpl.java
@@ -139,11 +139,11 @@ class ContainerImpl implements Container {
 
         if (handler != null) {
           if (res instanceof ODataEntityCreateResponse) {
-            LOG.debug("Upgrade created object '{}'", handler);
             handler.setEntity(((ODataEntityCreateResponse) res).getBody());
+            LOG.debug("Upgrade created object '{}'", handler);
           } else if (res instanceof ODataEntityUpdateResponse) {
-            LOG.debug("Upgrade updated object '{}'", handler);
             handler.setEntity(((ODataEntityUpdateResponse) res).getBody());
+            LOG.debug("Upgrade updated object '{}'", handler);
           }
         }
       }
@@ -308,8 +308,7 @@ class ContainerImpl implements Container {
     final CommonODataEntity entity = handler.getEntity();
     entity.getNavigationLinks().clear();
 
-    final AttachedEntityStatus currentStatus = EntityContainerFactory.getContext().entityContext().
-            getStatus(handler);
+    final AttachedEntityStatus currentStatus = EntityContainerFactory.getContext().entityContext().getStatus(handler);
 
     if (AttachedEntityStatus.DELETED != currentStatus) {
       entity.getProperties().clear();
@@ -335,8 +334,7 @@ class ContainerImpl implements Container {
 
         final URI editLink = target.getEntity().getEditLink();
 
-        if ((status == AttachedEntityStatus.ATTACHED || status == AttachedEntityStatus.LINKED)
-                && !target.isChanged()) {
+        if ((status == AttachedEntityStatus.ATTACHED || status == AttachedEntityStatus.LINKED) && !target.isChanged()) {
           entity.addLink(buildNavigationLink(
                   property.getKey().name(),
                   URIUtils.getURI(serviceRoot, editLink.toASCIIString()), type));

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java
----------------------------------------------------------------------
diff --git a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java
index 449a8d1..3a825e8 100644
--- a/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java
+++ b/ext/client-proxy/src/main/java/org/apache/olingo/ext/proxy/commons/EntityTypeInvocationHandler.java
@@ -56,8 +56,6 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
 
   private static final long serialVersionUID = 2629912294765040037L;
 
-  private CommonODataEntity entity;
-
   protected Map<String, Object> propertyChanges = new HashMap<String, Object>();
 
   protected Map<NavigationProperty, Object> linkChanges = new HashMap<NavigationProperty, Object>();
@@ -103,8 +101,8 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
 
     super(containerHandler.getClient(), typeRef, (ODataLinked) entity, containerHandler);
 
-    this.entity = entity;
-    this.entity.setMediaEntity(typeRef.getAnnotation(EntityType.class).hasStream());
+    this.internal = entity;
+    getEntity().setMediaEntity(typeRef.getAnnotation(EntityType.class).hasStream());
 
     this.uuid = new EntityUUID(
             containerHandler.getEntityContainerName(),
@@ -116,8 +114,8 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
   }
 
   public void setEntity(final CommonODataEntity entity) {
-    this.entity = entity;
-    this.entity.setMediaEntity(typeRef.getAnnotation(EntityType.class).hasStream());
+    this.internal = entity;
+    getEntity().setMediaEntity(typeRef.getAnnotation(EntityType.class).hasStream());
 
     this.uuid = new EntityUUID(
             getUUID().getContainerName(),
@@ -139,7 +137,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
 
   @Override
   public FullQualifiedName getName() {
-    return this.entity.getTypeName();
+    return getEntity().getTypeName();
   }
 
   public String getEntityContainerName() {
@@ -150,8 +148,8 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
     return uuid.getEntitySetName();
   }
 
-  public CommonODataEntity getEntity() {
-    return entity;
+  public final CommonODataEntity getEntity() {
+    return (CommonODataEntity) internal;
   }
 
   /**
@@ -160,7 +158,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
    * @return
    */
   public String getETag() {
-    return this.entity.getETag();
+    return getEntity().getETag();
   }
 
   /**
@@ -169,7 +167,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
    * @param eTag ETag.
    */
   public void setETag(final String eTag) {
-    this.entity.setETag(eTag);
+    getEntity().setETag(eTag);
   }
 
   public Map<String, Object> getPropertyChanges() {
@@ -196,7 +194,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
   protected Object getPropertyValue(final String name, final Type type) {
     try {
       final Object res;
-      final CommonODataProperty property = entity.getProperty(name);
+      final CommonODataProperty property = getEntity().getProperty(name);
 
       if (propertyChanges.containsKey(name)) {
         res = propertyChanges.get(name);
@@ -266,7 +264,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
       }
     }
 
-    for (CommonODataProperty property : entity.getProperties()) {
+    for (CommonODataProperty property : getEntity().getProperties()) {
       if (!propertyNames.contains(property.getName())) {
         res.add(property.getName());
       }
@@ -328,14 +326,14 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
 
   public InputStream getStream() {
 
-    final URI contentSource = entity.getMediaContentSource();
+    final URI contentSource = getEntity().getMediaContentSource();
 
     if (this.stream == null
             && typeRef.getAnnotation(EntityType.class).hasStream()
             && contentSource != null) {
 
       final String contentType =
-              StringUtils.isBlank(entity.getMediaContentType()) ? "*/*" : entity.getMediaContentType();
+              StringUtils.isBlank(getEntity().getMediaContentType()) ? "*/*" : getEntity().getMediaContentType();
 
       final ODataMediaRequest retrieveReq = client.getRetrieveRequestFactory().getMediaRequest(contentSource);
       retrieveReq.setFormat(ODataMediaFormat.fromFormat(contentType));
@@ -354,7 +352,7 @@ public class EntityTypeInvocationHandler<C extends CommonEdmEnabledODataClient<?
       if (res == null) {
         final URI link = URIUtils.getURI(
                 containerHandler.getFactory().getServiceRoot(),
-                CoreUtils.getEditMediaLink(property.name(), this.entity).toASCIIString());
+                CoreUtils.getEditMediaLink(property.name(), getEntity()).toASCIIString());
 
         final ODataMediaRequest req = client.getRetrieveRequestFactory().getMediaRequest(link);
         res = req.execute().getBody();

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
index bdaaf0e..948bcd9 100644
--- a/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
+++ b/fit/src/main/java/org/apache/olingo/fit/AbstractServices.java
@@ -117,6 +117,8 @@ public abstract class AbstractServices {
 
   private static final Pattern BATCH_REQUEST_REF_PATTERN = Pattern.compile("(.*) ([$].*) HTTP/.*");
 
+  private static final Pattern REF_PATTERN = Pattern.compile("([$]\\d+)");
+
   protected static final String BOUNDARY = "batch_243234_25424_ef_892u748";
 
   protected final ODataServiceVersion version;
@@ -231,41 +233,48 @@ public abstract class AbstractServices {
     }
 
     final Response res;
+    final String url;
+    final String method;
 
     if (matcher.find()) {
-      final String url = matcher.group(2);
+      url = matcher.group(2);
+      method = matcher.group(1);
+    } else if (matcherRef.find()) {
+      url = references.get(matcherRef.group(2));
+      method = matcherRef.group(1);
+    } else {
+      url = null;
+      method = null;
+    }
+
+    if (url == null) {
+      res = null;
+    } else {
       final WebClient client = WebClient.create(url);
       client.headers(headers);
 
-      final String method = matcher.group(1);
       if ("DELETE".equals(method)) {
         res = client.delete();
-      } else if ("PATCH".equals(method) || "MERGE".equals(method)) {
-        client.header("X-HTTP-METHOD", method);
-        res = client.invoke("POST", body.getDataHandler().getInputStream());
       } else {
-        res = client.invoke(method, body.getDataHandler().getInputStream());
-      }
+        final InputStream is = body.getDataHandler().getInputStream();
+        String content = IOUtils.toString(is);
+        IOUtils.closeQuietly(is);
 
-      client.close();
-    } else if (matcherRef.find()) {
-      final String url = matcherRef.group(2);
-      final WebClient client = WebClient.create(references.get(url));
-      client.headers(headers);
+        final Matcher refs = REF_PATTERN.matcher(content);
 
-      String method = matcherRef.group(1);
-      if ("DELETE".equals(method)) {
-        res = client.delete();
-      } else if ("PATCH".equals(method) || "MERGE".equals(method)) {
-        client.header("X-HTTP-METHOD", method);
-        res = client.invoke("POST", body.getDataHandler().getInputStream());
-      } else {
-        res = client.invoke(method, body.getDataHandler().getInputStream());
+        while (refs.find()) {
+          content = content.replace(refs.group(1), references.get(refs.group(1)));
+        }
+
+        if ("PATCH".equals(method) || "MERGE".equals(method)) {
+          client.header("X-HTTP-METHOD", method);
+          res = client.invoke("POST", IOUtils.toInputStream(content));
+        } else {
+          res = client.invoke(method, IOUtils.toInputStream(content));
+        }
       }
 
       client.close();
-    } else {
-      res = null;
     }
 
     return res;
@@ -621,7 +630,7 @@ public abstract class AbstractServices {
       writer.close();
 
       final InputStream serialization =
-              xml.addOrReplaceEntity(null, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
+              xml.addOrReplaceEntity(entityKey, entitySetName, new ByteArrayInputStream(content.toByteArray()), entry);
 
       ResWrap<AtomEntityImpl> result = atomDeserializer.read(serialization, AtomEntityImpl.class);
       result = new ResWrap<AtomEntityImpl>(

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
index 74c2284..262ab36 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/Commons.java
@@ -100,7 +100,7 @@ public abstract class Commons {
     SEQUENCE.put("People", 1000);
 
     MEDIA_CONTENT.put("CustomerInfo",
-            new ImmutablePair<String, EdmPrimitiveTypeKind>("CustomerinfoId", EdmPrimitiveTypeKind.Int32));
+            new ImmutablePair<String, EdmPrimitiveTypeKind>("CustomerInfoId", EdmPrimitiveTypeKind.Int32));
     MEDIA_CONTENT.put("Car",
             new ImmutablePair<String, EdmPrimitiveTypeKind>("VIN", EdmPrimitiveTypeKind.Int32));
     MEDIA_CONTENT.put("Car/Photo", null);

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
----------------------------------------------------------------------
diff --git a/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java b/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
index 4ad3871..2599b8f 100644
--- a/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
+++ b/fit/src/main/java/org/apache/olingo/fit/utils/FSManager.java
@@ -80,6 +80,7 @@ public class FSManager {
   }
 
   public FileObject putInMemory(final InputStream is, final String path) throws IOException {
+    LOG.info("Write in memory {}", path);
     final FileObject memObject = fsManager.resolveFile(MEM_PREFIX + path);
 
     if (memObject.exists()) {

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/fit/src/test/java/org/apache/olingo/fit/proxy/v3/EntityCreateTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/EntityCreateTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/EntityCreateTestITCase.java
index 4118706..a930100 100644
--- a/fit/src/test/java/org/apache/olingo/fit/proxy/v3/EntityCreateTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/proxy/v3/EntityCreateTestITCase.java
@@ -18,6 +18,8 @@
  */
 package org.apache.olingo.fit.proxy.v3;
 
+import java.lang.reflect.Proxy;
+import org.apache.olingo.ext.proxy.commons.EntityTypeInvocationHandler;
 import static org.apache.olingo.fit.proxy.v3.AbstractTest.container;
 import org.apache.olingo.fit.proxy.v3.staticservice.microsoft.test.odata.services.astoriadefaultservice.
         types.Customer;
@@ -129,7 +131,6 @@ public class EntityCreateTestITCase extends AbstractTest {
   }
 
   @Test
-  @Ignore
   public void createWithBackNavigation() {
     final String sampleName = "sample customer from proxy with back navigation";
     final Integer id = 102;

http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/3af2c8ce/fit/src/test/java/org/apache/olingo/fit/v3/BatchTestITCase.java
----------------------------------------------------------------------
diff --git a/fit/src/test/java/org/apache/olingo/fit/v3/BatchTestITCase.java b/fit/src/test/java/org/apache/olingo/fit/v3/BatchTestITCase.java
index 1ed6d22..3b73671 100644
--- a/fit/src/test/java/org/apache/olingo/fit/v3/BatchTestITCase.java
+++ b/fit/src/test/java/org/apache/olingo/fit/v3/BatchTestITCase.java
@@ -56,6 +56,7 @@ import org.apache.olingo.client.core.communication.request.retrieve.ODataEntityR
 import org.apache.olingo.client.core.uri.URIUtils;
 import org.apache.olingo.commons.api.domain.v3.ODataEntity;
 import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeException;
+import org.apache.olingo.commons.api.edm.FullQualifiedName;
 import org.apache.olingo.commons.api.format.ODataPubFormat;
 import static org.apache.olingo.fit.v3.AbstractTestITCase.client;
 import org.junit.Test;
@@ -230,6 +231,78 @@ public class BatchTestITCase extends AbstractTestITCase {
 
   @Test
   @SuppressWarnings("unchecked")
+  public void updateLinkWithReference() throws EdmPrimitiveTypeException {
+    // create your request
+    final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(testStaticServiceRootURL);
+    final BatchStreamManager streamManager = request.execute();
+
+    final ODataChangeset changeset = streamManager.addChangeset();
+
+    final ODataEntity info =
+            client.getObjectFactory().newEntity(
+            new FullQualifiedName("Microsoft.Test.OData.Services.AstoriaDefaultService.CustomerInfo"));
+
+    info.getProperties().add(client.getObjectFactory().newPrimitiveProperty("Information",
+            client.getObjectFactory().newPrimitiveValueBuilder().buildString("Sample information about customer 30")));
+
+    URIBuilder uriBuilder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("CustomerInfo");
+
+    ODataEntityCreateRequest<ODataEntity> createReq =
+            client.getCUDRequestFactory().getEntityCreateRequest(uriBuilder.build(), info);
+
+    changeset.addRequest(createReq);
+
+    // retrieve request reference
+    int createRequestRef = changeset.getLastContentId();
+
+    ODataEntity customer = getSampleCustomerProfile(30, "sample customer", false);
+    customer.getNavigationLinks().add(
+            client.getObjectFactory().newEntityNavigationLink("Info", URI.create("$" + createRequestRef)));
+
+    uriBuilder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Customer");
+
+    // add create request
+    createReq = client.getCUDRequestFactory().getEntityCreateRequest(uriBuilder.build(), customer);
+
+    changeset.addRequest(createReq);
+
+    final ODataBatchResponse response = streamManager.getResponse();
+    assertEquals(202, response.getStatusCode());
+    assertEquals("Accepted", response.getStatusMessage());
+
+    // verify response payload ...
+    final Iterator<ODataBatchResponseItem> iter = response.getBody();
+
+    final ODataBatchResponseItem item = iter.next();
+    assertTrue(item instanceof ODataChangesetResponseItem);
+
+    ODataChangesetResponseItem chgitem = (ODataChangesetResponseItem) item;
+
+    ODataResponse res = chgitem.next();
+    assertEquals(201, res.getStatusCode());
+    assertTrue(res instanceof ODataEntityCreateResponse);
+
+    final ODataEntity infoEntity = ((ODataEntityCreateResponse<ODataEntity>) res).getBody();
+
+    chgitem = (ODataChangesetResponseItem) item;
+
+    res = chgitem.next();
+    assertEquals(201, res.getStatusCode());
+    assertTrue(res instanceof ODataEntityCreateResponse);
+
+    uriBuilder = client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Customer").appendKeySegment(30);
+
+    final ODataEntityRequest<ODataEntity> req = client.getRetrieveRequestFactory().getEntityRequest(
+            URIUtils.getURI(testStaticServiceRootURL, uriBuilder.build() + "/Info"));
+    
+    final ODataEntity navigatedInfo = req.execute().getBody();
+    
+    assertEquals(infoEntity.getProperty("CustomerInfoId").getPrimitiveValue().toCastValue(Integer.class),
+            navigatedInfo.getProperty("CustomerInfoId").getPrimitiveValue().toCastValue(Integer.class));
+  }
+
+  @Test
+  @SuppressWarnings("unchecked")
   public void batchRequest() throws EdmPrimitiveTypeException {
     // create your request
     final ODataBatchRequest request = client.getBatchRequestFactory().getBatchRequest(testStaticServiceRootURL);
@@ -284,9 +357,9 @@ public class BatchTestITCase extends AbstractTestITCase {
             client.getCUDRequestFactory().getEntityCreateRequest(targetURI.build(), original);
     createReq.setFormat(ODataPubFormat.ATOM);
     changeset.addRequest(createReq);
-    
+
     // Delete customer created above
-    targetURI = 
+    targetURI =
             client.getURIBuilder(testStaticServiceRootURL).appendEntitySetSegment("Customer").appendKeySegment(1000);
     final ODataDeleteRequest deleteReq = client.getCUDRequestFactory().getDeleteRequest(targetURI.build());
     changeset.addRequest(deleteReq);
@@ -350,7 +423,7 @@ public class BatchTestITCase extends AbstractTestITCase {
     res = chgitem.next();
     assertTrue(res instanceof ODataDeleteResponse);
     assertEquals(204, res.getStatusCode());
-    
+
     // retrive the third item (ODataRetrieve)
     item = iter.next();
     assertTrue(item instanceof ODataRetrieveResponseItem);