Repository: olingo-odata2 Updated Branches: refs/heads/master 352a82c3c -> 843fba144
[OLINGO-822] Support skip facets in expand for XML producer Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/bdaec2fa Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/bdaec2fa Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/bdaec2fa Branch: refs/heads/master Commit: bdaec2fa9b8fb59c5b98fb8c2b099e9f0ef91e0a Parents: f8bbd74 Author: mibo <[email protected]> Authored: Sun Nov 15 20:49:53 2015 +0100 Committer: mibo <[email protected]> Committed: Sun Nov 15 20:49:53 2015 +0100 ---------------------------------------------------------------------- .../api/ep/callback/WriteCallbackContext.java | 21 +++++++ .../ep/producer/AtomEntryEntityProducer.java | 12 ++-- .../odata2/core/ep/producer/MyCallback.java | 13 +++-- .../core/ep/producer/XmlExpandProducerTest.java | 59 +++++++++++++++++++- 4 files changed, 92 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bdaec2fa/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/callback/WriteCallbackContext.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/callback/WriteCallbackContext.java b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/callback/WriteCallbackContext.java index 7659765..f4143bb 100644 --- a/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/callback/WriteCallbackContext.java +++ b/odata2-lib/odata-api/src/main/java/org/apache/olingo/odata2/api/ep/callback/WriteCallbackContext.java @@ -25,6 +25,7 @@ import org.apache.olingo.odata2.api.edm.EdmEntitySet; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; import org.apache.olingo.odata2.api.ep.EntityProviderException; +import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties; import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode; /** @@ -37,6 +38,7 @@ public abstract class WriteCallbackContext { private EdmNavigationProperty navigationProperty; private Map<String, Object> entryData; private ExpandSelectTreeNode currentNode; + private EntityProviderWriteProperties currentWriteProperties; /** * Current means the node pointing to the target entity set @@ -118,4 +120,23 @@ public abstract class WriteCallbackContext { } return key; } + + /** + * EntityProviderWriteProperties of outer producer. + * + * @param currentWriteProperties of outer producer. + */ + public void setCurrentWriteProperties(EntityProviderWriteProperties currentWriteProperties) { + this.currentWriteProperties = currentWriteProperties; + } + + /** + * EntityProviderWriteProperties which were set by outer producer or <code>null</code> + * if not supported. + * + * @return set by outer producer or <code>null</code> if not supported. + */ + public EntityProviderWriteProperties getCurrentWriteProperties() { + return currentWriteProperties; + } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bdaec2fa/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 c8da1d8..5e92500 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 @@ -262,6 +262,7 @@ public class AtomEntryEntityProducer { context.setSourceEntitySet(eia.getEntitySet()); context.setNavigationProperty(navProp); context.setEntryData(data); + context.setCurrentWriteProperties(properties); ExpandSelectTreeNode subNode = properties.getExpandSelectTree().getLinks().get(navigationPropertyName); context.setCurrentExpandSelectTreeNode(subNode); context.setSelfLink(new URI(self)); @@ -270,7 +271,7 @@ public class AtomEntryEntityProducer { if (callback == null) { throw new EntityProviderException(EntityProviderException.EXPANDNOTSUPPORTED); } - WriteFeedCallbackResult result = null; + WriteFeedCallbackResult result; try { result = ((OnWriteFeedContent) callback).retrieveFeedResult(context); } catch (ODataApplicationException e) { @@ -304,6 +305,7 @@ public class AtomEntryEntityProducer { EdmNavigationProperty navProp = (EdmNavigationProperty) eia.getEntityType().getProperty(navigationPropertyName); WriteEntryCallbackContext context = new WriteEntryCallbackContext(); context.setSourceEntitySet(eia.getEntitySet()); + context.setCurrentWriteProperties(properties); context.setNavigationProperty(navProp); context.setEntryData(data); ExpandSelectTreeNode subNode = properties.getExpandSelectTree().getLinks().get(navigationPropertyName); @@ -313,7 +315,7 @@ public class AtomEntryEntityProducer { if (callback == null) { throw new EntityProviderException(EntityProviderException.EXPANDNOTSUPPORTED); } - WriteEntryCallbackResult result = null; + WriteEntryCallbackResult result; try { result = ((OnWriteEntryContent) callback).retrieveEntryResult(context); } catch (ODataApplicationException e) { @@ -461,9 +463,7 @@ public class AtomEntryEntityProducer { if (updateDate == null) { updateDate = new Date(); } - String valueToString = - EdmDateTimeOffset.getInstance().valueToString(updateDate, EdmLiteralKind.DEFAULT, updateFacets); - return valueToString; + return EdmDateTimeOffset.getInstance().valueToString(updateDate, EdmLiteralKind.DEFAULT, updateFacets); } private String getTargetPathValue(final EntityInfoAggregator eia, final String targetPath, @@ -608,7 +608,7 @@ public class AtomEntryEntityProducer { private boolean isNotMappedViaCustomMapping(final EntityPropertyInfo propertyInfo) { EdmCustomizableFeedMappings customMapping = propertyInfo.getCustomMapping(); if (customMapping != null && customMapping.isFcKeepInContent() != null) { - return customMapping.isFcKeepInContent().booleanValue(); + return customMapping.isFcKeepInContent(); } return true; } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bdaec2fa/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/MyCallback.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/MyCallback.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/MyCallback.java index bdea75a..25770bf 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/MyCallback.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/MyCallback.java @@ -61,16 +61,21 @@ public class MyCallback implements OnWriteEntryContent, OnWriteFeedContent { callbacks.put(navPropName, this); } EntityProviderWriteProperties inlineProperties = - EntityProviderWriteProperties.serviceRoot(baseUri).callbacks(callbacks).expandSelectTree( - context.getCurrentExpandSelectTreeNode()).selfLink(context.getSelfLink()).build(); + EntityProviderWriteProperties.serviceRoot(baseUri).callbacks(callbacks) + .expandSelectTree(context.getCurrentExpandSelectTreeNode()) + .selfLink(context.getSelfLink()) + .validatingFacets(context.getCurrentWriteProperties().isValidatingFacets()) + .build(); result.setFeedData(dataProvider.getEmployeesData()); result.setInlineProperties(inlineProperties); } } else if ("Buildings".equals(context.getSourceEntitySet().getName())) { EntityProviderWriteProperties inlineProperties = - EntityProviderWriteProperties.serviceRoot(baseUri).expandSelectTree( - context.getCurrentExpandSelectTreeNode()).selfLink(context.getSelfLink()).build(); + EntityProviderWriteProperties.serviceRoot(baseUri) + .expandSelectTree(context.getCurrentExpandSelectTreeNode()) + .validatingFacets(context.getCurrentWriteProperties().isValidatingFacets()) + .selfLink(context.getSelfLink()).build(); List<Map<String, Object>> emptyData = new ArrayList<Map<String, Object>>(); result.setFeedData(emptyData); result.setInlineProperties(inlineProperties); http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/bdaec2fa/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java index c4ba63c..faab701 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/ep/producer/XmlExpandProducerTest.java @@ -22,6 +22,8 @@ import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.IOException; import java.io.InputStream; @@ -33,9 +35,7 @@ import java.util.List; import java.util.Map; import org.apache.olingo.odata2.api.ODataCallback; -import org.apache.olingo.odata2.api.edm.Edm; -import org.apache.olingo.odata2.api.edm.EdmEntitySet; -import org.apache.olingo.odata2.api.edm.EdmException; +import org.apache.olingo.odata2.api.edm.*; import org.apache.olingo.odata2.api.ep.EntityProviderException; import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties; import org.apache.olingo.odata2.api.ep.callback.OnWriteEntryContent; @@ -104,6 +104,59 @@ public class XmlExpandProducerTest extends AbstractProviderTest { verifyEmployees(employeeXPathString, xmlString); } + @Test(expected = EntityProviderException.class) + public void expandSelectedEmployeesWithFacets() throws Exception { + Edm edm = MockFacade.getMockEdm(); + EdmTyped imageUrlProperty = edm.getEntityType("RefScenario", "Employee").getProperty("ImageUrl"); + EdmFacets facets = mock(EdmFacets.class); + when(facets.getMaxLength()).thenReturn(1); + when(((EdmProperty) imageUrlProperty).getFacets()).thenReturn(facets); + + ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees"); + + HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms"); + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree) + .callbacks(callbacksRoom) + .build(); + AtomEntityProvider provider = createAtomEntityProvider(); + ODataResponse response = + provider.writeEntry(edm.getDefaultEntityContainer().getEntitySet("Rooms"), roomData, + properties); + + String xmlString = verifyResponse(response); + assertXpathNotExists("/a:entry/m:properties", xmlString); + assertXpathExists("/a:entry/a:link", xmlString); + verifyEmployees(employeeXPathString, xmlString); + } + + @Test + public void expandSelectedEmployeesIgnoreFacets() throws Exception { + Edm edm = MockFacade.getMockEdm(); + EdmTyped imageUrlProperty = edm.getEntityType("RefScenario", "Employee").getProperty("ImageUrl"); + EdmFacets facets = mock(EdmFacets.class); + when(facets.getMaxLength()).thenReturn(1); + when(((EdmProperty) imageUrlProperty).getFacets()).thenReturn(facets); + + ExpandSelectTreeNode selectTree = getSelectExpandTree("Rooms('1')", "nr_Employees", "nr_Employees"); + + HashMap<String, ODataCallback> callbacksRoom = createCallbacks("Rooms"); + EntityProviderWriteProperties properties = + EntityProviderWriteProperties.serviceRoot(BASE_URI).expandSelectTree(selectTree).callbacks(callbacksRoom) + .callbacks(callbacksRoom).validatingFacets(false) + .build(); + AtomEntityProvider provider = createAtomEntityProvider(); + ODataResponse response = + provider.writeEntry(edm.getDefaultEntityContainer().getEntitySet("Rooms"), roomData, + properties); + + String xmlString = verifyResponse(response); + assertXpathNotExists("/a:entry/m:properties", xmlString); + assertXpathExists("/a:entry/a:link", xmlString); + verifyEmployees(employeeXPathString, xmlString); + } + + @Test public void expandSelectedEmployeesWithBuilder() throws Exception { EdmEntitySet entitySet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms");
