package org.odata4j.test.unit.issues;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import junit.framework.Assert;
import org.core4j.Enumerable;
import org.junit.Test;
import org.odata4j.core.OPredicates;
import org.odata4j.core.OProperty;
import org.odata4j.edm.EdmComplexType;
import org.odata4j.edm.EdmDataServices;
import org.odata4j.edm.EdmEntityContainer;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.edm.EdmEntityType;
import org.odata4j.edm.EdmProperty;
import org.odata4j.edm.EdmSchema;
import org.odata4j.edm.EdmType;
import org.odata4j.format.Entry;
import org.odata4j.format.xml.AtomFeedFormatParser;
// http://code.google.com/p/odata4j/issues/detail?id=143
public class Issue143Test {
@Test
public void issue143() {
InputStream xml = getClass().getResourceAsStream("/META-INF/sap_no_property_type.xml");
EdmDataServices metadata = getMetadata();
AtomFeedFormatParser.AtomFeed feed = new AtomFeedFormatParser(metadata, "FlightCollection", null, null, null).parse(new InputStreamReader(xml));
Assert.assertNotNull(feed);
Entry entry = feed.getEntries().iterator().next();
OProperty<?> complexTypeProp = entry.getEntity().getProperty("flightDetails");
Assert.assertEquals("RMTSAMPLEFLIGHT.flightDetails", complexTypeProp.getType().getFullyQualifiedTypeName());
Assert.assertEquals("Edm.String", entry.getEntity().getProperty("carrid").getType().getFullyQualifiedTypeName());
List<OProperty<?>> props = (List<OProperty<?>>) complexTypeProp.getValue();
Assert.assertTrue(Enumerable.create(props).any(OPredicates.propertyNameEquals("distance")));
}
private static EdmDataServices getMetadata() {
EdmDataServices.Builder metadata = new EdmDataServices.Builder();
EdmSchema.Builder schema = new EdmSchema.Builder();
EdmEntityContainer.Builder container = new EdmEntityContainer.Builder();
EdmComplexType.Builder complexType = EdmComplexType.newBuilder()
.setName("flightDetails")
.setNamespace("RMTSAMPLEFLIGHT")
.addProperties(EdmProperty.newBuilder("countryFrom").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("countryTo").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("cityFrom").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("cityTo").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("airportFrom").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("airportTo").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("flightTime").setType(EdmType.getSimple("Edm.Int32")),
EdmProperty.newBuilder("departureTime").setType(EdmType.getSimple("Edm.Time")),
EdmProperty.newBuilder("arrivalTime").setType(EdmType.getSimple("Edm.Time")),
EdmProperty.newBuilder("distance").setType(EdmType.getSimple("Edm.Decimal")));
EdmEntityType.Builder entityType = new EdmEntityType.Builder()
.addKeys("Key1")
.setNamespace("RMTSAMPLEFLIGHT")
.setName("Flight")
.addProperties(EdmProperty.newBuilder("carrid").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("connid").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("fldate").setType(EdmType.getSimple("Edm.DateTime")),
EdmProperty.newBuilder("PLANETYPE").setType(EdmType.getSimple("Edm.String")),
EdmProperty.newBuilder("flightDetails").setType(complexType));
EdmEntitySet.Builder entitySet = new EdmEntitySet.Builder().setName("FlightCollection").setEntityType(entityType);
container.addEntitySets(entitySet);
schema.addEntityContainers(container);
schema.addEntityTypes(entityType);
schema.addComplexTypes(complexType);
metadata.addSchemas(schema);
return metadata.build();
}
}