package org.odata4j.format.xml; /* * #%L * interaction-odata4j-ext * %% * Copyright (C) 2012 - 2013 Temenos Holdings N.V. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.odata4j.core.OEntity; import org.odata4j.core.OEntityKey; import org.odata4j.core.OProperty; import org.odata4j.edm.EdmComplexType; import org.odata4j.edm.EdmDataServices; import org.odata4j.edm.EdmType; import org.odata4j.format.Entry; import org.odata4j.format.xml.AtomFeedFormatParser.AtomFeed; import org.odata4j.internal.FeedCustomizationMapping; import org.odata4j.stax2.XMLEventReader2; import org.odata4j.stax2.XMLFactoryProvider2; import com.temenos.interaction.core.entity.Metadata; import com.temenos.interaction.core.hypermedia.Action; import com.temenos.interaction.core.hypermedia.ResourceState; import com.temenos.interaction.core.hypermedia.ResourceStateMachine; import com.temenos.interaction.odataext.entity.MetadataOData4j; /** * This is to verify the extension written for Odata4j Issue https://code.google.com/p/odata4j/issues/detail?id=193 * The change has been contributed to the project. * * @author sjunejo * */ public class AtomFeedFormatParserExtTest { // Common private static EdmDataServices edmMetadata; private static final String entitySetName = "FtCommissionTypes"; private static final String entityKeyValue = "SCTRDEFAULT"; private static OEntityKey key; @BeforeClass public static void setup() { edmMetadata = getMetadata(); key = OEntityKey.create(entityKeyValue); } @AfterClass public static void tearDown() { edmMetadata = null; key = null; } @Test public void testParseNonServiceDocResource() throws Exception { ResourceState serviceRoot = new ResourceState("SD", "ServiceDocument", new ArrayList<Action>(), "/"); ResourceStateMachine hypermediaEngine = new ResourceStateMachine(serviceRoot); Metadata metadata = new Metadata("hothouse-models"); MetadataOData4j metadataOData4j = new MetadataOData4j(metadata, hypermediaEngine); FeedCustomizationMapping fcMapping = new FeedCustomizationMapping(); AtomFeedFormatParserExt parser = new AtomFeedFormatParserExt(metadataOData4j, "oentitys", OEntityKey.create(1), fcMapping); InputStream xml = getClass().getClassLoader().getResourceAsStream("data-oentity.xml"); AtomFeed feed = parser.parse(new InputStreamReader(xml)); xml.close(); for(Entry entry :feed.getEntries()) { OEntity entity = entry.getEntity(); assertNotNull(entity); assertEquals("Joe", entity.getProperty("FirstName").getValue()); assertEquals("Blogs", entity.getProperty("LastName").getValue()); OProperty address = entity.getProperty("Address"); assertNotNull(address); EdmType addressType = address.getType(); assertTrue(addressType instanceof EdmComplexType); assertTrue("hothouse-modelsModel.oentity_Address".equals(addressType.getFullyQualifiedTypeName())); List<OProperty> addressInfo = (List<OProperty>)address.getValue(); assertNotNull(addressInfo); for(OProperty property: addressInfo) { if("Number".equals(property.getName())) { assertEquals(10L, property.getValue()); } if("Road".equals(property.getName())) { assertEquals("Downing Street", property.getValue()); } if("Town".equals(property.getName())) { assertEquals("London", property.getValue()); } if("County".equals(property.getName())) { assertEquals("LONDON", property.getValue()); } } } } /** * Basic Bag(...) type support */ @Test public void testParsePropertiesWithBag() { InputStream xml = getClass().getClassLoader().getResourceAsStream("issue193_entry_with_Bag.xml"); FeedCustomizationMapping fcMapping = new FeedCustomizationMapping(); AtomFeed feed = new AtomFeedFormatParserExt(edmMetadata, entitySetName, key, fcMapping).parse(new InputStreamReader(xml)); assertNotNull(feed); Entry entry = feed.entries.iterator().next(); assertNotNull(entry); OEntity entity = entry.getEntity(); assertNotNull(entity); assertNotNull(entity.getLinks()); assertTrue(!entity.getLinks().isEmpty()); // We can add more asserts here to verify each OProperty } /** * This test will verify that we can parse Entry posted by Odata (.NET) Clients with Collection(...) */ @Test public void testParsePropertiesWithCollection() { InputStream xml = getClass().getClassLoader().getResourceAsStream("issue193_entry_with_Collection.xml"); FeedCustomizationMapping fcMapping = new FeedCustomizationMapping(); AtomFeed feed = new AtomFeedFormatParserExt(edmMetadata, entitySetName, key, fcMapping).parse(new InputStreamReader(xml)); assertNotNull(feed); Entry entry = feed.entries.iterator().next(); assertNotNull(entry); OEntity entity = entry.getEntity(); assertNotNull(entity); } // Load the metadata private static EdmDataServices getMetadata() { InputStream metadataStream = AtomFeedFormatParserExtTest.class.getClassLoader().getResourceAsStream("issue193_metadata.xml"); XMLEventReader2 reader = XMLFactoryProvider2.getInstance().newXMLInputFactory2().createXMLEventReader(new InputStreamReader(metadataStream)); return new EdmxFormatParser().parseMetadata(reader); } }