/* * Copyright 2016 The Apache Software Foundation. * * Licensed 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.annotation.processor.core.edm; import org.apache.olingo.odata2.api.annotation.edm.EdmEntitySet; import org.apache.olingo.odata2.api.annotation.edm.EdmEntityType; import org.apache.olingo.odata2.api.annotation.edm.EdmKey; import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty; import org.apache.olingo.odata2.api.annotation.edm.EdmNavigationProperty.Multiplicity; import org.apache.olingo.odata2.api.annotation.edm.EdmProperty; import org.apache.olingo.odata2.api.exception.ODataException; import org.apache.olingo.odata2.api.uri.PathSegment; import org.apache.olingo.odata2.core.ODataPathSegmentImpl; import org.apache.olingo.odata2.core.edm.provider.EdmImplProv; import org.apache.olingo.odata2.core.uri.UriParserImpl; import org.junit.Ignore; import org.junit.Test; import java.util.Arrays; import java.util.List; import static java.util.Collections.EMPTY_MAP; public class AnnotationEdmProviderNamespacesTest { /** * Test with namespace in path segment */ @SuppressWarnings("unchecked") @Test public void testTwoWayNavigationAB() throws Exception { UriParserImpl uriParser = createUriParser(A.class, B.class, C.class, D.class); PathSegment ps1 = new ODataPathSegmentImpl("AB.AA('1')", EMPTY_MAP); PathSegment ps2 = new ODataPathSegmentImpl("B", EMPTY_MAP); uriParser.parse(Arrays.asList(ps1, ps2), EMPTY_MAP); } /** * Test with manual set default namespace for edm * (160211_mibo): This can actual not work because the option to manually set the default namespace is missing. * However this test could be used to test the option to manually set the default namespace. */ @SuppressWarnings("unchecked") @Test @Ignore("Currently not implemented") public void testTwoWayNavigationABWithDefaultNamespaceSetManual() throws Exception { UriParserImpl uriParser = createUriParser(A.class, B.class, C.class, D.class); PathSegment ps1 = new ODataPathSegmentImpl("AA('1')", EMPTY_MAP); PathSegment ps2 = new ODataPathSegmentImpl("B", EMPTY_MAP); uriParser.parse(Arrays.asList(ps1, ps2), EMPTY_MAP); } /** * Test with namespace in path segment */ @SuppressWarnings("unchecked") @Test public void testTwoWayNavigationCD() throws Exception { UriParserImpl uriParser = createUriParser(C.class, D.class, A.class, B.class); PathSegment ps1 = new ODataPathSegmentImpl("CD.CC('1')", EMPTY_MAP); PathSegment ps2 = new ODataPathSegmentImpl("D", EMPTY_MAP); uriParser.parse(Arrays.asList(ps1, ps2), EMPTY_MAP); } /** * Test with namespace in path segment */ @SuppressWarnings("unchecked") @Test public void testTwoWayNavigationBug_DefaultEntityContainerGeneratedOnWrongEntities1() throws Exception { UriParserImpl uriParser = createUriParser(A.class, B.class, C.class, D.class); PathSegment ps1 = new ODataPathSegmentImpl("CD.CC('1')", EMPTY_MAP); PathSegment ps2 = new ODataPathSegmentImpl("D", EMPTY_MAP); uriParser.parse(Arrays.asList(ps1, ps2), EMPTY_MAP); } /** * Test with namespace in path segment */ @SuppressWarnings("unchecked") @Test public void testTwoWayNavigationBug_DefaultEntityContainerGeneratedOnWrongEntities2() throws Exception { UriParserImpl uriParser = createUriParser(C.class, D.class, A.class, B.class); PathSegment ps1 = new ODataPathSegmentImpl("AB.AA('1')", EMPTY_MAP); PathSegment ps2 = new ODataPathSegmentImpl("B", EMPTY_MAP); uriParser.parse(Arrays.asList(ps1, ps2), EMPTY_MAP); } private UriParserImpl createUriParser(Class<?> ... annotatedClasses) throws ODataException { AnnotationEdmProvider provider = new AnnotationEdmProvider(Arrays.asList(annotatedClasses)); EdmImplProv edm = new EdmImplProv(provider); return new UriParserImpl(edm); } @EdmEntityType(name = "A", namespace = "AB") @EdmEntitySet(name = "AA", container = "AB") private class A { @EdmKey @EdmProperty String id; @EdmNavigationProperty(toMultiplicity = Multiplicity.ZERO_OR_ONE, toType = B.class) B b; } @EdmEntityType(name = "B", namespace = "AB") @EdmEntitySet(container = "AB") private class B { @EdmNavigationProperty(toMultiplicity = Multiplicity.MANY, toType = A.class) List<A> a; } @EdmEntityType(name = "C", namespace = "CD") @EdmEntitySet(name = "CC", container = "CD") private class C { @EdmKey @EdmProperty String id; @EdmNavigationProperty(toMultiplicity = Multiplicity.ZERO_OR_ONE, toType = D.class) D d; } @EdmEntityType(name = "D", namespace = "CD") @EdmEntitySet(container = "CD") private class D { @EdmNavigationProperty(toMultiplicity = Multiplicity.MANY, toType = C.class) List<C> c; } }