package com.temenos.interaction.sdk.adapter.edmx; /* * #%L * interaction-sdk * %% * 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.*; import static org.mockito.Mockito.mock; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.junit.Test; import org.odata4j.edm.EdmAssociation; import org.odata4j.edm.EdmAssociationEnd; import org.odata4j.edm.EdmEntityType; import org.odata4j.edm.EdmMultiplicity; import org.odata4j.edm.EdmNavigationProperty; import org.odata4j.edm.EdmProperty; import org.odata4j.edm.EdmSimpleType; import org.odata4j.edm.EdmType; import com.temenos.interaction.sdk.EntityInfo; import com.temenos.interaction.sdk.FieldInfo; import com.temenos.interaction.sdk.JoinInfo; public class TestEDMXAdapter { @Test public void testCreateJPAEntitySupportedType() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); EdmType t = mock(EdmType.class); assertNull(adapter.createEntityInfoFromEdmEntityType(t, new HashMap<String, String>())); } @Test public void testEntityInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); List<String> keys = new ArrayList<String>(); keys.add("ID"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); properties.add(EdmProperty.newBuilder("ID").setType(EdmSimpleType.INT64)); EdmEntityType.Builder entityTypeBuilder = EdmEntityType.newBuilder(); entityTypeBuilder.setNamespace("AirlineModel"); entityTypeBuilder.setName("Flight"); entityTypeBuilder.addKeys(keys); entityTypeBuilder.addProperties(properties); EdmEntityType t = entityTypeBuilder.build(); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(t, new HashMap<String, String>()); assertEquals("Flight", p.getClazz()); assertEquals("AirlineModel", p.getPackage()); assertEquals("AirlineModel.Flight", p.getFQTypeName()); } @Test public void testJPAEntityKeyInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); List<String> keys = new ArrayList<String>(); keys.add("flightID"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); properties.add(EdmProperty.newBuilder("flightID").setType(EdmSimpleType.INT64)); EdmEntityType.Builder entityTypeBuilder = EdmEntityType.newBuilder(); entityTypeBuilder.setNamespace("AirlineModel"); entityTypeBuilder.setName("Flight"); entityTypeBuilder.addKeys(keys); entityTypeBuilder.addProperties(properties); EdmEntityType t = entityTypeBuilder.build(); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(t, new HashMap<String, String>()); assertEquals("flightID", p.getKeyInfo().getName()); assertEquals("Long", p.getKeyInfo().getType()); assertEquals(0, p.getFieldInfos().size()); } @Test public void testJPAEntityFieldInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); List<String> keys = new ArrayList<String>(); keys.add("ID"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); properties.add(EdmProperty.newBuilder("ID").setType(EdmSimpleType.INT64)); properties.add(EdmProperty.newBuilder("flightID").setType(EdmSimpleType.INT64)); properties.add(EdmProperty.newBuilder("number").setType(EdmSimpleType.STRING)); properties.add(EdmProperty.newBuilder("fitHostiesName").setType(EdmSimpleType.STRING).setNullable(true)); properties.add(EdmProperty.newBuilder("runway").setType(EdmSimpleType.STRING)); properties.add(EdmProperty.newBuilder("passengers").setType(EdmSimpleType.INT32)); properties.add(EdmProperty.newBuilder("departureDT").setType(EdmSimpleType.DATETIME)); properties.add(EdmProperty.newBuilder("dinnerServed").setType(EdmSimpleType.TIME)); EdmEntityType.Builder entityTypeBuilder = EdmEntityType.newBuilder(); entityTypeBuilder.setNamespace("AirlineModel"); entityTypeBuilder.setName("Flight"); entityTypeBuilder.addKeys(keys); entityTypeBuilder.addProperties(properties); EdmEntityType t = entityTypeBuilder.build(); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(t, new HashMap<String, String>()); assertEquals(7, p.getFieldInfos().size()); assertTrue(p.getFieldInfos().contains(new FieldInfo("flightID", "Long", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("number", "String", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("fitHostiesName", "String", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("runway", "String", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("passengers", "Integer", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("departureDT", "java.util.Date", null))); assertTrue(p.getFieldInfos().contains(new FieldInfo("dinnerServed", "java.util.Date", null))); } @Test public void testJPAEntityOneToManyJoinInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); String namespace = "AirlineModel"; // Airport entity EdmEntityType.Builder bAirportEntityType = createAirportEntity(namespace); // Flight entity EdmEntityType.Builder bFlightEntityType = createFlightEntity(namespace); // add the flights relationship from Airport to Flight String afRelationName = "Airport_Flight"; EdmAssociationEnd.Builder afSourceRole = EdmAssociationEnd.newBuilder() .setRole(afRelationName + "_Source") .setType(bAirportEntityType) .setMultiplicity(EdmMultiplicity.ONE); EdmAssociationEnd.Builder afTargetRole = EdmAssociationEnd.newBuilder() .setRole(afRelationName + "_Target") .setType(bFlightEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder bAssociation = EdmAssociation.newBuilder() .setNamespace(namespace) .setName(afRelationName) .setEnds(afSourceRole, afTargetRole); List<EdmNavigationProperty.Builder> airportNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); airportNavProperties.add(EdmNavigationProperty .newBuilder("flights") .setFromTo(afSourceRole, afTargetRole) .setRelationship(bAssociation)); bAirportEntityType.addNavigationProperties(airportNavProperties); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(bAirportEntityType.build(), new HashMap<String, String>()); assertEquals(1, p.getFieldInfos().size()); assertTrue(p.getFieldInfos().contains(new FieldInfo("name", "String", null))); assertEquals(1, p.getJoinInfos().size()); JoinInfo join = p.getJoinInfos().get(0); assertEquals(join, new JoinInfo("flights", "Flight", null)); assertEquals("@OneToMany", join.getAnnotations().get(0)); } @Test public void testJPAEntityOneToManyBidirectionalJoinInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); String namespace = "AirlineModel"; // Airport entity EdmEntityType.Builder bAirportEntityType = createAirportEntity(namespace); // Flight entity EdmEntityType.Builder bFlightEntityType = createFlightEntity(namespace); // add the flights relationship from Airport to Flight String afRelationName = "Airport_Flight"; EdmAssociationEnd.Builder afSourceRole = EdmAssociationEnd.newBuilder() .setRole(afRelationName + "_Source") .setType(bAirportEntityType) .setMultiplicity(EdmMultiplicity.ONE); EdmAssociationEnd.Builder afTargetRole = EdmAssociationEnd.newBuilder() .setRole(afRelationName + "_Target") .setType(bFlightEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder bAssociation = EdmAssociation.newBuilder() .setNamespace(namespace) .setName(afRelationName) .setEnds(afSourceRole, afTargetRole); // join to the many flights that have left this airport List<EdmNavigationProperty.Builder> airportNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); airportNavProperties.add(EdmNavigationProperty .newBuilder("flights") .setFromTo(afSourceRole, afTargetRole) .setRelationship(bAssociation)); bAirportEntityType.addNavigationProperties(airportNavProperties); // join back to the airport that this flight departed from List<EdmNavigationProperty.Builder> flightNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); flightNavProperties.add(EdmNavigationProperty .newBuilder("airport") .setFromTo(afTargetRole, afSourceRole) .setRelationship(bAssociation)); bFlightEntityType.addNavigationProperties(flightNavProperties); Map<String, String> linkPropertyMap = new HashMap<String, String>(); linkPropertyMap.put("Airport_Flight", "airport"); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(bAirportEntityType.build(), linkPropertyMap); assertEquals(1, p.getFieldInfos().size()); assertTrue(p.getFieldInfos().contains(new FieldInfo("name", "String", null))); assertEquals(1, p.getJoinInfos().size()); JoinInfo join = p.getJoinInfos().get(0); assertEquals(join, new JoinInfo("flights", "Flight", null)); assertEquals("@OneToMany(mappedBy=\"airport\")", join.getAnnotations().get(0)); } @Test public void testJPAEntityManyToManyJoinInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); String namespace = "AirlineModel"; // Flight entity EdmEntityType.Builder bFlightEntityType = createFlightEntity(namespace); // Person entity EdmEntityType.Builder bPersonEntityType = createPersonEntity(namespace); // add the passengers relationship from Flight to Person String relationName = "Flight_Person"; EdmAssociationEnd.Builder fpSourceRole = EdmAssociationEnd.newBuilder() .setRole(relationName + "_Source") .setType(bFlightEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociationEnd.Builder fpTargetRole = EdmAssociationEnd.newBuilder() .setRole(relationName + "_Target") .setType(bPersonEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder bAssociation = EdmAssociation.newBuilder() .setNamespace(namespace) .setName(relationName) .setEnds(fpSourceRole, fpTargetRole); List<EdmNavigationProperty.Builder> flightNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); flightNavProperties.add(EdmNavigationProperty .newBuilder("passengers") .setFromTo(fpSourceRole, fpTargetRole) .setRelationship(bAssociation)); bFlightEntityType.addNavigationProperties(flightNavProperties); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(bFlightEntityType.build(), new HashMap<String, String>()); assertEquals(1, p.getFieldInfos().size()); assertTrue(p.getFieldInfos().contains(new FieldInfo("departureDT", "java.util.Date", null))); assertEquals(1, p.getJoinInfos().size()); JoinInfo join = p.getJoinInfos().get(0); assertEquals(join, new JoinInfo("passengers", "Person", null)); assertEquals("@ManyToMany", join.getAnnotations().get(0)); } @Test public void testJPAEntityManyToManyBidirectionalJoinInfoEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); String namespace = "AirlineModel"; // Flight entity EdmEntityType.Builder bFlightEntityType = createFlightEntity(namespace); // Person entity EdmEntityType.Builder bPersonEntityType = createPersonEntity(namespace); // add the passengers relationship from Flight to Person String relationName = "Flight_Person"; EdmAssociationEnd.Builder fpSourceRole = EdmAssociationEnd.newBuilder() .setRole(relationName + "_Source") .setType(bFlightEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociationEnd.Builder fpTargetRole = EdmAssociationEnd.newBuilder() .setRole(relationName + "_Target") .setType(bPersonEntityType) .setMultiplicity(EdmMultiplicity.MANY); EdmAssociation.Builder bAssociation = EdmAssociation.newBuilder() .setNamespace(namespace) .setName(relationName) .setEnds(fpSourceRole, fpTargetRole); List<EdmNavigationProperty.Builder> flightNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); flightNavProperties.add(EdmNavigationProperty .newBuilder("passengers") .setFromTo(fpSourceRole, fpTargetRole) .setRelationship(bAssociation)); bFlightEntityType.addNavigationProperties(flightNavProperties); List<EdmNavigationProperty.Builder> personNavProperties = new ArrayList<EdmNavigationProperty.Builder>(); personNavProperties.add(EdmNavigationProperty .newBuilder("flights") .setFromTo(fpTargetRole, fpSourceRole) .setRelationship(bAssociation)); bPersonEntityType.addNavigationProperties(personNavProperties); Map<String, String> linkPropertyMap = new HashMap<String, String>(); linkPropertyMap.put("Flight_Person", "flight"); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(bFlightEntityType.build(), linkPropertyMap); assertEquals(1, p.getFieldInfos().size()); assertTrue(p.getFieldInfos().contains(new FieldInfo("departureDT", "java.util.Date", null))); assertEquals(1, p.getJoinInfos().size()); JoinInfo join = p.getJoinInfos().get(0); assertEquals(join, new JoinInfo("passengers", "Person", null)); assertEquals("@ManyToMany(mappedBy=\"flight\")", join.getAnnotations().get(0)); } private EdmEntityType.Builder createAirportEntity(String namespace) { EdmEntityType.Builder bAirportEntityType = EdmEntityType.newBuilder(); bAirportEntityType.setNamespace(namespace); bAirportEntityType.setName("Airport"); List<String> aKeys = new ArrayList<String>(); aKeys.add("airportID"); bAirportEntityType.addKeys(aKeys); List<EdmProperty.Builder> aProperties = new ArrayList<EdmProperty.Builder>(); aProperties.add(EdmProperty.newBuilder("airportID").setType(EdmSimpleType.INT64)); aProperties.add(EdmProperty.newBuilder("name").setType(EdmSimpleType.STRING)); bAirportEntityType.addProperties(aProperties); return bAirportEntityType; } private EdmEntityType.Builder createFlightEntity(String namespace) { EdmEntityType.Builder bFlightEntityType = EdmEntityType.newBuilder(); bFlightEntityType.setNamespace(namespace); bFlightEntityType.setName("Flight"); List<String> keys = new ArrayList<String>(); keys.add("flightID"); bFlightEntityType.addKeys(keys); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); properties.add(EdmProperty.newBuilder("flightID").setType(EdmSimpleType.INT64)); properties.add(EdmProperty.newBuilder("departureDT").setType(EdmSimpleType.DATETIME)); bFlightEntityType.addProperties(properties); return bFlightEntityType; } private EdmEntityType.Builder createPersonEntity(String namespace) { EdmEntityType.Builder bPersonEntityType = EdmEntityType.newBuilder(); bPersonEntityType.setNamespace(namespace); bPersonEntityType.setName("Person"); List<String> pKeys = new ArrayList<String>(); pKeys.add("personId"); bPersonEntityType.addKeys(pKeys); List<EdmProperty.Builder> pProperties = new ArrayList<EdmProperty.Builder>(); pProperties.add(EdmProperty.newBuilder("personId").setType(EdmSimpleType.INT64)); pProperties.add(EdmProperty.newBuilder("name").setType(EdmSimpleType.STRING)); bPersonEntityType.addProperties(pProperties); return bPersonEntityType; } @Test public void testJPAEntityFieldInfoAnnotationsEdmx() throws IOException { EDMXAdapter adapter = new EDMXAdapter(mock(InputStream.class)); List<String> keys = new ArrayList<String>(); keys.add("ID"); List<EdmProperty.Builder> properties = new ArrayList<EdmProperty.Builder>(); properties.add(EdmProperty.newBuilder("ID").setType(EdmSimpleType.INT64)); properties.add(EdmProperty.newBuilder("departureDT").setType(EdmSimpleType.DATETIME)); properties.add(EdmProperty.newBuilder("departureTime").setType(EdmSimpleType.TIME)); EdmEntityType.Builder entityTypeBuilder = EdmEntityType.newBuilder(); entityTypeBuilder.setNamespace("AirlineModel"); entityTypeBuilder.setName("Flight"); entityTypeBuilder.addKeys(keys); entityTypeBuilder.addProperties(properties); EdmEntityType t = entityTypeBuilder.build(); EntityInfo p = adapter.createEntityInfoFromEdmEntityType(t, new HashMap<String, String>()); // Annotations FieldInfo dateFI = p.getFieldInfos().get(0); assertEquals(1, dateFI.getAnnotations().size()); assertEquals("@Temporal(TemporalType.TIMESTAMP)", dateFI.getAnnotations().get(0)); FieldInfo timeFI = p.getFieldInfos().get(1); assertEquals(1, timeFI.getAnnotations().size()); assertEquals("@Temporal(TemporalType.TIME)", timeFI.getAnnotations().get(0)); } }