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/28 15:39:44 UTC

git commit: [OLINGO-308] fix + test implemented

Repository: olingo-odata2
Updated Branches:
  refs/heads/master 14e9a0cb7 -> d8afd0183


[OLINGO-308] fix + test implemented


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

Branch: refs/heads/master
Commit: d8afd018323100534823d4974bf36f555653b8b9
Parents: 14e9a0c
Author: Stephan Klevenz <sk...@apache.org>
Authored: Wed May 28 15:39:37 2014 +0200
Committer: Stephan Klevenz <sk...@apache.org>
Committed: Wed May 28 15:39:37 2014 +0200

----------------------------------------------------------------------
 .../api/ep/EntityProviderWriteProperties.java   |  11 ++
 .../ep/producer/AtomEntryEntityProducer.java    | 131 +++++++++++--------
 .../core/ep/producer/AtomEntryProducerTest.java |  22 ++++
 3 files changed, 107 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d8afd018/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
index 822fc84..1fa674f 100644
--- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
+++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/EntityProviderWriteProperties.java
@@ -44,6 +44,7 @@ public class EntityProviderWriteProperties {
   private URI selfLink;
   private boolean includeSimplePropertyType;
   private Map<String, Map<String, Object>> additionalLinks;
+  private boolean ignoreKey = false;
 
   private EntityProviderWriteProperties() {}
 
@@ -239,6 +240,12 @@ public class EntityProviderWriteProperties {
       this.properties.selfLink = properties.getSelfLink();
       this.properties.includeSimplePropertyType = properties.includeSimplePropertyType;
       this.properties.additionalLinks = properties.additionalLinks;
+      this.properties.ignoreKey = properties.ignoreKey;
+      return this;
+    }
+
+    public ODataEntityProviderPropertiesBuilder ignoreKey(boolean ignoreKey) {
+      properties.ignoreKey = ignoreKey;
       return this;
     }
   }
@@ -248,4 +255,8 @@ public class EntityProviderWriteProperties {
         EntityProviderWriteProperties.serviceRoot(properties.getServiceRoot());
     return builder.fromProperties(properties);
   }
+
+  public boolean isIgnoreKey() {
+    return ignoreKey;
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d8afd018/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java
index 95702dd..4036df5 100644
--- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java
+++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryEntityProducer.java
@@ -95,7 +95,11 @@ public class AtomEntryEntityProducer {
       }
 
       // write all atom infos (mandatory and optional)
-      String selfLink = createSelfLink(eia, data, null);
+      String selfLink = null;
+      if (!properties.isIgnoreKey()) {
+        selfLink = createSelfLink(eia, data, null);
+      }
+
       appendAtomMandatoryParts(writer, eia, data, selfLink);
       appendAtomOptionalParts(writer, eia, data);
 
@@ -185,7 +189,9 @@ public class AtomEntryEntityProducer {
       final Map<String, Map<String, Object>> links = properties.getAdditionalLinks();
       final Map<String, Object> key = links == null ? null : links.get(name);
       if (key == null || key.isEmpty()) {
-        appendAtomNavigationLink(writer, createSelfLink(eia, data, name), name, isFeed, eia, data);
+        if (!properties.isIgnoreKey()) {
+          appendAtomNavigationLink(writer, createSelfLink(eia, data, name), name, isFeed, eia, data);
+        }
       } else {
         final EntityInfoAggregator targetEntityInfo = EntityInfoAggregator.create(
             eia.getEntitySet().getRelatedEntitySet((EdmNavigationProperty) eia.getEntityType().getProperty(name)));
@@ -306,11 +312,13 @@ public class AtomEntryEntityProducer {
   private void appendAtomEditLink(final XMLStreamWriter writer, final EntityInfoAggregator eia,
       final Map<String, Object> data, final String selfLink) throws EntityProviderException {
     try {
-      writer.writeStartElement(FormatXml.ATOM_LINK);
-      writer.writeAttribute(FormatXml.ATOM_HREF, selfLink);
-      writer.writeAttribute(FormatXml.ATOM_REL, Edm.LINK_REL_EDIT);
-      writer.writeAttribute(FormatXml.ATOM_TITLE, eia.getEntityType().getName());
-      writer.writeEndElement();
+      if (selfLink != null) {
+        writer.writeStartElement(FormatXml.ATOM_LINK);
+        writer.writeAttribute(FormatXml.ATOM_HREF, selfLink);
+        writer.writeAttribute(FormatXml.ATOM_REL, Edm.LINK_REL_EDIT);
+        writer.writeAttribute(FormatXml.ATOM_TITLE, eia.getEntityType().getName());
+        writer.writeEndElement();
+      }
     } catch (XMLStreamException e) {
       throw new EntityProviderException(EntityProviderException.COMMON, e);
     } catch (EdmException e) {
@@ -321,25 +329,27 @@ public class AtomEntryEntityProducer {
   private void appendAtomContentLink(final XMLStreamWriter writer, final EntityInfoAggregator eia,
       final Map<String, Object> data, final String selfLink) throws EntityProviderException, EdmException {
     try {
-      String mediaResourceMimeType = properties.getMediaResourceMimeType();
-      if (mediaResourceMimeType == null) {
-        EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
-        if (entityTypeMapping != null) {
-          String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey();
-          if (mediaResourceMimeTypeKey != null) {
-            mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
-          }
-        }
+      if (selfLink != null) {
+        String mediaResourceMimeType = properties.getMediaResourceMimeType();
         if (mediaResourceMimeType == null) {
-          mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString();
+          EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
+          if (entityTypeMapping != null) {
+            String mediaResourceMimeTypeKey = entityTypeMapping.getMediaResourceMimeTypeKey();
+            if (mediaResourceMimeTypeKey != null) {
+              mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
+            }
+          }
+          if (mediaResourceMimeType == null) {
+            mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString();
+          }
         }
-      }
 
-      writer.writeStartElement(FormatXml.ATOM_LINK);
-      writer.writeAttribute(FormatXml.ATOM_HREF, selfLink + "/$value");
-      writer.writeAttribute(FormatXml.ATOM_REL, Edm.LINK_REL_EDIT_MEDIA);
-      writer.writeAttribute(FormatXml.ATOM_TYPE, mediaResourceMimeType);
-      writer.writeEndElement();
+        writer.writeStartElement(FormatXml.ATOM_LINK);
+        writer.writeAttribute(FormatXml.ATOM_HREF, selfLink + "/$value");
+        writer.writeAttribute(FormatXml.ATOM_REL, Edm.LINK_REL_EDIT_MEDIA);
+        writer.writeAttribute(FormatXml.ATOM_TYPE, mediaResourceMimeType);
+        writer.writeEndElement();
+      }
     } catch (XMLStreamException e) {
       throw new EntityProviderException(EntityProviderException.COMMON, e);
     }
@@ -348,42 +358,44 @@ public class AtomEntryEntityProducer {
   private void appendAtomContentPart(final XMLStreamWriter writer, final EntityInfoAggregator eia,
       final Map<String, Object> data, final String selfLink) throws EntityProviderException, EdmException {
     try {
+      if (selfLink != null) {
+        // We have to support the media resource mime type at the properties till version 1.2 then this can be
+        // refactored
+        String mediaResourceMimeType = properties.getMediaResourceMimeType();
+        EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
+        String self = null;
 
-      // We have to support the media resource mime type at the properties till version 1.2 then this can be refactored
-      String mediaResourceMimeType = properties.getMediaResourceMimeType();
-      EdmMapping entityTypeMapping = eia.getEntityType().getMapping();
-      String self = null;
-
-      if (entityTypeMapping != null) {
-        String mediaResourceSourceKey = entityTypeMapping.getMediaResourceSourceKey();
-        if (mediaResourceSourceKey != null) {
-          self = (String) data.get(mediaResourceSourceKey);
-        }
-        if (self == null) {
-          self = selfLink + "/$value";
-        }
-        if (mediaResourceMimeType == null) {
-          String mediaResourceMimeTypeKey =
-              entityTypeMapping.getMimeType() != null ? entityTypeMapping.getMimeType()
-                  : entityTypeMapping.getMediaResourceMimeTypeKey();
-          if (mediaResourceMimeTypeKey != null) {
-            mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
+        if (entityTypeMapping != null) {
+          String mediaResourceSourceKey = entityTypeMapping.getMediaResourceSourceKey();
+          if (mediaResourceSourceKey != null) {
+            self = (String) data.get(mediaResourceSourceKey);
+          }
+          if (self == null) {
+            self = selfLink + "/$value";
           }
           if (mediaResourceMimeType == null) {
+            String mediaResourceMimeTypeKey =
+                entityTypeMapping.getMimeType() != null ? entityTypeMapping.getMimeType()
+                    : entityTypeMapping.getMediaResourceMimeTypeKey();
+            if (mediaResourceMimeTypeKey != null) {
+              mediaResourceMimeType = (String) data.get(mediaResourceMimeTypeKey);
+            }
+            if (mediaResourceMimeType == null) {
+              mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString();
+            }
+          }
+        } else {
+          self = selfLink + "/$value";
+          if (mediaResourceMimeType == null) {
             mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString();
           }
         }
-      } else {
-        self = selfLink + "/$value";
-        if (mediaResourceMimeType == null) {
-          mediaResourceMimeType = ContentType.APPLICATION_OCTET_STREAM.toString();
-        }
-      }
 
-      writer.writeStartElement(FormatXml.ATOM_CONTENT);
-      writer.writeAttribute(FormatXml.ATOM_TYPE, mediaResourceMimeType);
-      writer.writeAttribute(FormatXml.ATOM_SRC, self);
-      writer.writeEndElement();
+        writer.writeStartElement(FormatXml.ATOM_CONTENT);
+        writer.writeAttribute(FormatXml.ATOM_TYPE, mediaResourceMimeType);
+        writer.writeAttribute(FormatXml.ATOM_SRC, self);
+        writer.writeEndElement();
+      }
     } catch (XMLStreamException e) {
       throw new EntityProviderException(EntityProviderException.COMMON, e);
     }
@@ -392,10 +404,12 @@ public class AtomEntryEntityProducer {
   private void appendAtomMandatoryParts(final XMLStreamWriter writer, final EntityInfoAggregator eia,
       final Map<String, Object> data, final String selfLink) throws EntityProviderException {
     try {
-      writer.writeStartElement(FormatXml.ATOM_ID);
-      location = properties.getServiceRoot().toASCIIString() + selfLink;
-      writer.writeCharacters(location);
-      writer.writeEndElement();
+      if (selfLink != null) {
+        writer.writeStartElement(FormatXml.ATOM_ID);
+        location = properties.getServiceRoot().toASCIIString() + selfLink;
+        writer.writeCharacters(location);
+        writer.writeEndElement();
+      }
 
       writer.writeStartElement(FormatXml.ATOM_TITLE);
       writer.writeAttribute(FormatXml.ATOM_TYPE, FormatXml.ATOM_TEXT);
@@ -571,7 +585,10 @@ public class AtomEntryEntityProducer {
           if (isNotMappedViaCustomMapping(propertyInfo)) {
             Object value = data.get(propertyName);
             XmlPropertyEntityProducer aps = new XmlPropertyEntityProducer(properties.isIncludeSimplePropertyType());
-            aps.append(writer, propertyInfo.getName(), propertyInfo, value);
+
+            if (!(eia.getKeyPropertyInfos().contains(propertyInfo) && properties.isIgnoreKey())) {
+              aps.append(writer, propertyInfo.getName(), propertyInfo, value);
+            }
           }
         }
 

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/d8afd018/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java
----------------------------------------------------------------------
diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java
index a87698d..cd65a8c 100644
--- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java
+++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/AtomEntryProducerTest.java
@@ -56,6 +56,7 @@ import org.apache.olingo.odata2.api.processor.ODataResponse;
 import org.apache.olingo.odata2.core.commons.ContentType;
 import org.apache.olingo.odata2.core.ep.AbstractProviderTest;
 import org.apache.olingo.odata2.core.ep.AtomEntityProvider;
+import org.apache.olingo.odata2.core.ep.consumer.XmlEntityConsumer;
 import org.apache.olingo.odata2.testutil.helper.StringHelper;
 import org.apache.olingo.odata2.testutil.helper.XMLUnitHelper;
 import org.apache.olingo.odata2.testutil.mock.MockFacade;
@@ -862,4 +863,25 @@ public class AtomEntryProducerTest extends AbstractProviderTest {
   private void verifyTagOrdering(final String xmlString, final String... toCheckTags) {
     XMLUnitHelper.verifyTagOrdering(xmlString, toCheckTags);
   }
+
+  @Test
+  public void testPostEntryWithoutId() throws Exception {
+    roomData.remove("Id");
+
+    final EntityProviderWriteProperties properties =
+        EntityProviderWriteProperties.serviceRoot(BASE_URI).ignoreKey(true).build();
+    AtomEntityProvider ser = createAtomEntityProvider();
+    ODataResponse response =
+        ser.writeEntry(MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"), roomData, properties);
+
+    String xmlString = verifyResponse(response);
+
+    assertXpathExists("/a:entry", xmlString);
+    assertXpathEvaluatesTo(BASE_URI.toASCIIString(), "/a:entry/@xml:base", xmlString);
+
+    assertXpathExists("/a:entry/a:content", xmlString);
+    assertXpathEvaluatesTo(ContentType.APPLICATION_XML.toString(), "/a:entry/a:content/@type", xmlString);
+
+    assertXpathExists("/a:entry/a:content/m:properties", xmlString);
+  }
 }