| /******************************************************************************* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| ******************************************************************************/ |
| package org.apache.olingo.odata2.core.ep.producer; |
| |
| import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; |
| import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; |
| import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; |
| |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.olingo.odata2.api.ODataCallback; |
| import org.apache.olingo.odata2.api.edm.EdmEntitySet; |
| import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; |
| import org.apache.olingo.odata2.api.ep.EntityProvider; |
| import org.apache.olingo.odata2.api.ep.EntityProviderWriteProperties; |
| import org.apache.olingo.odata2.api.ep.callback.OnWriteEntryContent; |
| import org.apache.olingo.odata2.api.ep.callback.OnWriteFeedContent; |
| import org.apache.olingo.odata2.api.ep.callback.WriteEntryCallbackContext; |
| import org.apache.olingo.odata2.api.ep.callback.WriteEntryCallbackResult; |
| import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackContext; |
| import org.apache.olingo.odata2.api.ep.callback.WriteFeedCallbackResult; |
| import org.apache.olingo.odata2.api.exception.ODataApplicationException; |
| import org.apache.olingo.odata2.api.processor.ODataResponse; |
| import org.apache.olingo.odata2.api.uri.ExpandSelectTreeNode; |
| import org.apache.olingo.odata2.core.ep.AbstractProviderTest; |
| import org.apache.olingo.odata2.testutil.helper.StringHelper; |
| import org.apache.olingo.odata2.testutil.mock.MockFacade; |
| import org.junit.Test; |
| |
| public class ExpandSelectProducerWithBuilderTest extends AbstractProviderTest { |
| |
| public class LocalCallback implements OnWriteEntryContent { |
| |
| @Override |
| public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) |
| throws ODataApplicationException { |
| WriteEntryCallbackResult writeEntryCallbackResult = new WriteEntryCallbackResult(); |
| EntityProviderWriteProperties inlineProperties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).expandSelectTree( |
| context.getCurrentExpandSelectTreeNode()).build(); |
| writeEntryCallbackResult.setInlineProperties(inlineProperties); |
| Map<String, Object> buildingData = new HashMap<String, Object>(); |
| buildingData.put("Id", "1"); |
| buildingData.put("Name", "BuildingName"); |
| writeEntryCallbackResult.setEntryData(buildingData); |
| return writeEntryCallbackResult; |
| } |
| |
| } |
| |
| public ExpandSelectProducerWithBuilderTest(final StreamWriterImplType type) { |
| super(type); |
| } |
| |
| @Test |
| public void selectOnlyProperties() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> selectedProperties = new ArrayList<String>(roomData.keySet()); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).selectedProperties(selectedProperties).build(); |
| |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).expandSelectTree(expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties", xml); |
| assertXpathNotExists("/a:entry/a:link[@type]", xml); |
| } |
| |
| @Test |
| public void selectOnlyLinks() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> selectedNavigationProperties = new ArrayList<String>(); |
| selectedNavigationProperties.add("nr_Building"); |
| selectedNavigationProperties.add("nr_Employees"); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).selectedLinks(selectedNavigationProperties).build(); |
| |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).expandSelectTree(expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathNotExists("/a:entry/a:content/m:properties", xml); |
| assertXpathExists("/a:entry/a:link[@type]", xml); |
| } |
| |
| @Test |
| public void selectIdAndBuildingLink() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> selectedNavigationProperties = new ArrayList<String>(); |
| selectedNavigationProperties.add("nr_Building"); |
| |
| List<String> selectedProperties = new ArrayList<String>(); |
| selectedProperties.add("Id"); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).selectedProperties(selectedProperties).selectedLinks( |
| selectedNavigationProperties).build(); |
| |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).expandSelectTree(expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties", xml); |
| assertXpathExists("/a:entry/a:link[@type]", xml); |
| } |
| |
| @Test |
| public void expandBuilding() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> expandedNavigationProperties = new ArrayList<String>(); |
| expandedNavigationProperties.add("nr_Building"); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).expandedLinks(expandedNavigationProperties).build(); |
| |
| Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); |
| callbacks.put("nr_Building", new LocalCallback()); |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).callbacks(callbacks).expandSelectTree( |
| expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties", xml); |
| assertXpathExists("/a:entry/a:link[@type]/m:inline", xml); |
| } |
| |
| @Test |
| public void expandBuildingAndRooms() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> expandedNavigationProperties = new ArrayList<String>(); |
| expandedNavigationProperties.add("nr_Building"); |
| |
| final ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).expandedLinks(expandedNavigationProperties).build(); |
| |
| Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); |
| callbacks.put("nr_Building", new OnWriteEntryContent(){ |
| @Override |
| public WriteEntryCallbackResult retrieveEntryResult(final WriteEntryCallbackContext context) |
| throws ODataApplicationException { |
| WriteEntryCallbackResult writeEntryCallbackResult = new WriteEntryCallbackResult(); |
| |
| ExpandSelectTreeNode innerExpandSelectTree; |
| try { |
| EdmEntitySet buildingsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Buildings"); |
| innerExpandSelectTree = ExpandSelectTreeNode.entitySet(buildingsSet) |
| .expandedLinks(Arrays.asList("nb_Rooms")).build(); |
| } catch (Exception e) { |
| throw new RuntimeException(e); |
| } |
| |
| Map<String, ODataCallback> innerCallbacks = new HashMap<String, ODataCallback>(); |
| innerCallbacks.put("nb_Rooms", new OnWriteFeedContent(){ |
| @SuppressWarnings("unchecked") |
| @Override |
| public WriteFeedCallbackResult retrieveFeedResult(WriteFeedCallbackContext context) { |
| WriteFeedCallbackResult writeEntryCallbackResult = new WriteFeedCallbackResult(); |
| |
| ExpandSelectTreeNode innerExpandSelectTree = context.getCurrentExpandSelectTreeNode(); |
| EntityProviderWriteProperties inlineProperties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES) |
| .expandSelectTree(innerExpandSelectTree).build(); |
| writeEntryCallbackResult.setInlineProperties(inlineProperties); |
| Map<String, Object> roomsData = new HashMap<String, Object>(); |
| roomsData.put("Id", "1"); |
| roomsData.put("Name", "MyInnerRoom"); |
| writeEntryCallbackResult.setFeedData(Arrays.asList(roomsData)); |
| return writeEntryCallbackResult; |
| } |
| }); |
| |
| EntityProviderWriteProperties inlineProperties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES) |
| .callbacks(innerCallbacks) |
| .expandSelectTree(innerExpandSelectTree).build(); |
| writeEntryCallbackResult.setInlineProperties(inlineProperties); |
| Map<String, Object> buildingData = new HashMap<String, Object>(); |
| buildingData.put("Id", "1"); |
| buildingData.put("Name", "BuildingName"); |
| writeEntryCallbackResult.setEntryData(buildingData); |
| return writeEntryCallbackResult; |
| } |
| }); |
| |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).callbacks(callbacks).expandSelectTree( |
| expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties", xml); |
| assertXpathExists("/a:entry/a:link[@type]/m:inline", xml); |
| assertXpathEvaluatesTo("Buildings", "/a:entry/a:link[@type]/m:inline/a:entry/a:title", xml); |
| assertXpathEvaluatesTo("Rooms", |
| "/a:entry/a:link[@type]/m:inline/a:entry/a:link[@type]/m:inline/a:feed/a:title", xml); |
| assertXpathEvaluatesTo("http://host:80/service/Rooms('1')", |
| "/a:entry/a:link[@type]/m:inline/a:entry/a:link[@type]/m:inline/a:feed/a:entry/a:id", xml); |
| } |
| |
| @Test |
| public void expandBuildingAndSelectIdFromRoom() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| List<String> expandedNavigationProperties = new ArrayList<String>(); |
| expandedNavigationProperties.add("nr_Building"); |
| |
| List<String> selectedProperties = new ArrayList<String>(); |
| selectedProperties.add("Id"); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).selectedProperties(selectedProperties).expandedLinks( |
| expandedNavigationProperties).build(); |
| |
| Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); |
| callbacks.put("nr_Building", new LocalCallback()); |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).callbacks(callbacks).expandSelectTree( |
| expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties/d:Id", xml); |
| assertXpathNotExists("/a:entry/a:content/m:properties/d:Name", xml); |
| assertXpathExists("/a:entry/a:link[@type]/m:inline", xml); |
| } |
| |
| @Test |
| public void customExpandBuildingAndSelectIdFromCustomNode() throws Exception { |
| EdmEntitySet roomsSet = MockFacade.getMockEdm().getDefaultEntityContainer().getEntitySet("Rooms"); |
| |
| List<String> selectedPropertiesAtCustomProperties = new ArrayList<String>(); |
| selectedPropertiesAtCustomProperties.add("Id"); |
| EdmEntitySet buildingsSet = |
| roomsSet.getRelatedEntitySet((EdmNavigationProperty) roomsSet.getEntityType().getProperty("nr_Building")); |
| ExpandSelectTreeNode customNode = |
| ExpandSelectTreeNode.entitySet(buildingsSet).selectedProperties(selectedPropertiesAtCustomProperties).build(); |
| |
| ExpandSelectTreeNode expandSelectTree = |
| ExpandSelectTreeNode.entitySet(roomsSet).customExpandedLink("nr_Building", customNode).build(); |
| |
| Map<String, ODataCallback> callbacks = new HashMap<String, ODataCallback>(); |
| callbacks.put("nr_Building", new LocalCallback()); |
| EntityProviderWriteProperties properties = |
| EntityProviderWriteProperties.fromProperties(DEFAULT_PROPERTIES).callbacks(callbacks).expandSelectTree( |
| expandSelectTree).build(); |
| ODataResponse entry = EntityProvider.writeEntry("application/xml", roomsSet, roomData, properties); |
| |
| String xml = StringHelper.inputStreamToString((InputStream) entry.getEntity()); |
| assertXpathExists("/a:entry/a:content/m:properties", xml); |
| assertXpathExists("/a:entry/a:link[@type]/m:inline", xml); |
| assertXpathExists("/a:entry/a:link[@type]/m:inline/a:entry/a:content/m:properties/d:Id", xml); |
| assertXpathNotExists("/a:entry/a:link[@type]/m:inline/a:entry/a:content/m:properties/d:Name", xml); |
| } |
| |
| } |