blob: 186a864351e296a93562c983b9def5ac030e66c5 [file] [log] [blame]
/*******************************************************************************
*
* 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.jpa.processor.core.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.metamodel.Attribute;
import org.apache.olingo.odata2.api.edm.EdmMultiplicity;
import org.apache.olingo.odata2.api.edm.FullQualifiedName;
import org.apache.olingo.odata2.api.edm.provider.Association;
import org.apache.olingo.odata2.api.edm.provider.AssociationEnd;
import org.apache.olingo.odata2.api.edm.provider.EntityType;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAModelException;
import org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmAssociationEndView;
import org.apache.olingo.odata2.jpa.processor.api.model.JPAEdmReferentialConstraintView;
import org.apache.olingo.odata2.jpa.processor.core.common.ODataJPATestConstants;
import org.apache.olingo.odata2.jpa.processor.core.mock.model.JPAAttributeMock;
import org.apache.olingo.odata2.jpa.processor.core.mock.model.JPAEdmMockData.SimpleType;
import org.apache.olingo.odata2.jpa.processor.core.mock.model.JPAEdmMockData.SimpleType.SimpleTypeA;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
public class JPAEdmAssociationTest extends JPAEdmTestModelView {
private JPAEdmAssociation objAssociation = null;
private static String ASSOCIATION_NAME = "SalesOrderHeader_String";
private JPAEdmAssociationTest localView = null;
private static final String PUNIT_NAME = "salesorderprocessing";
private int variant;
@Before
public void setup() {
localView = new JPAEdmAssociationTest();
objAssociation = new JPAEdmAssociation(localView, localView, localView, 1);
try {
objAssociation.getBuilder().build();
} catch (ODataJPAModelException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (ODataJPARuntimeException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
}
@Override
public AssociationEnd getEdmAssociationEnd1() {
AssociationEnd associationEnd = new AssociationEnd();
associationEnd.setType(new FullQualifiedName("salesorderprocessing", "SalesOrderHeader"));
associationEnd.setRole("SalesOrderHeader");
associationEnd.setMultiplicity(EdmMultiplicity.ONE);
return associationEnd;
}
@Override
public AssociationEnd getEdmAssociationEnd2() {
AssociationEnd associationEnd = new AssociationEnd();
associationEnd.setType(new FullQualifiedName("salesorderprocessing", "String"));
associationEnd.setRole("String");
associationEnd.setMultiplicity(EdmMultiplicity.MANY);
return associationEnd;
}
@Override
public Association getEdmAssociation() {
Association association = new Association();
association
.setEnd1(new AssociationEnd().setType(new FullQualifiedName("salesorderprocessing", "SalesOrderHeader")));
association.setEnd2(new AssociationEnd().setType(new FullQualifiedName("salesorderprocessing", "String")));
return association;
}
@Override
public boolean isExists() {
return true;
}
@Override
public JPAEdmReferentialConstraintView getJPAEdmReferentialConstraintView() {
JPAEdmReferentialConstraint refConstraintView = new JPAEdmReferentialConstraint(localView, localView, localView);
return refConstraintView;
}
@Override
public Attribute<?, ?> getJPAAttribute() {
return getJPAAttributeLocal();
}
@Override
public String getpUnitName() {
return PUNIT_NAME;
}
@Override
public EntityType getEdmEntityType() {
EntityType entityType = new EntityType();
entityType.setName(SimpleTypeA.NAME);
return entityType;
}
// The inner class which gives us an replica of the jpa attribute
@SuppressWarnings("hiding")
private class AttributeMock<Object, String> extends JPAAttributeMock<Object, String> {
@SuppressWarnings("unchecked")
@Override
public Class<String> getJavaType() {
return (Class<String>) SimpleType.SimpleTypeA.clazz;
}
@Override
public PersistentAttributeType getPersistentAttributeType() {
if (variant == 1) {
return PersistentAttributeType.ONE_TO_MANY;
} else if (variant == 2) {
return PersistentAttributeType.ONE_TO_ONE;
} else if (variant == 2) {
return PersistentAttributeType.MANY_TO_ONE;
} else {
return PersistentAttributeType.MANY_TO_MANY;
}
}
}
private Attribute<?, ?> getJPAAttributeLocal() {
AttributeMock<Object, String> attr = new AttributeMock<Object, String>();
return attr;
}
@Test
public void testGetBuilder() {
assertNotNull(objAssociation.getBuilder());
}
@Test
public void testGetEdmAssociation() {
assertNotNull(objAssociation.getEdmAssociation());
assertEquals(objAssociation.getEdmAssociation().getName(), ASSOCIATION_NAME);
}
@Test
public void testGetConsistentEdmAssociationList() {
assertTrue(objAssociation.getConsistentEdmAssociationList().size() > 0);
}
@Override
public String getEdmRelationShipName() {
return "Association_SalesOrderHeader_String";
}
@Test
public void testSearchAssociation1() {
class TestAssociationEndView extends JPAEdmTestModelView {
@Override
public String getEdmRelationShipName() {
return "SalesOrderHeader_String1";
}
private Attribute<?, ?> getJPAAttributeLocal() {
AttributeMock<Object, String> attr = new AttributeMock<Object, String>();
return attr;
}
@Override
public Attribute<?, ?> getJPAAttribute() {
return getJPAAttributeLocal();
}
@Override
public String getJoinColumnName() {
return "SO_ID";
}
@Override
public String getJoinColumnReferenceColumnName() {
return "DEMO_ID";
}
@Override
public String getMappedByName() {
return "demo";
}
@Override
public String getOwningPropertyName() {
return "salesOrder";
}
@Override
public int getNumberOfAssociationsWithSimilarEndPoints(final JPAEdmAssociationEndView view) {
return 1;
}
@Override
public String getpUnitName() {
return "salesorderprocessing";
}
@Override
public EntityType getEdmEntityType() {
EntityType entityType = new EntityType();
entityType.setName("SalesOrderHeader");
return entityType;
}
@SuppressWarnings("hiding")
class AttributeMock<Object, String> extends JPAAttributeMock<Object, String> {
@SuppressWarnings("unchecked")
@Override
public Class<String> getJavaType() {
return (Class<String>) SimpleType.SimpleTypeA.clazz;
}
@Override
public PersistentAttributeType getPersistentAttributeType() {
return PersistentAttributeType.ONE_TO_MANY;
}
@Override
public Member getJavaMember() {
return new AnnotatedElementMock();
}
@Override
public java.lang.String getName() {
// TODO Auto-generated method stub
return super.getName();
}
class AnnotatedElementMock implements AnnotatedElement, Member {
@Override
public boolean isAnnotationPresent(final Class<? extends Annotation> annotationClass) {
return true;
}
@SuppressWarnings("unchecked")
@Override
public Annotation getAnnotation(@SuppressWarnings("rawtypes") final Class annotationClass) {
if (annotationClass.equals(JoinColumn.class)) {
JoinColumn joinColumn = EasyMock.createMock(JoinColumn.class);
EasyMock.expect(joinColumn.name()).andStubReturn("SO_ID");
EasyMock.expect(joinColumn.referencedColumnName()).andStubReturn("DEMO_ID");
EasyMock.replay(joinColumn);
return joinColumn;
} else {
OneToMany oneToMany = EasyMock.createMock(OneToMany.class);
EasyMock.expect(oneToMany.mappedBy()).andStubReturn("demo");
EasyMock.replay(oneToMany);
return oneToMany;
}
}
@Override
public Annotation[] getAnnotations() {
return null;
}
@Override
public Annotation[] getDeclaredAnnotations() {
return null;
}
@Override
public Class<?> getDeclaringClass() {
// TODO Auto-generated method stub
return null;
}
@Override
public java.lang.String getName() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getModifiers() {
// TODO Auto-generated method stub
return 0;
}
@Override
public boolean isSynthetic() {
// TODO Auto-generated method stub
return false;
}
}
}
}
TestAssociationEndView objJPAEdmAssociationEndTest = new TestAssociationEndView();
JPAEdmAssociationEnd objJPAEdmAssociationEnd =
new JPAEdmAssociationEnd(objJPAEdmAssociationEndTest, objJPAEdmAssociationEndTest);
try {
objJPAEdmAssociationEnd.getBuilder().build();
Field field = objAssociation.getClass().getDeclaredField("associationEndMap");
field.setAccessible(true);
Map<String, JPAEdmAssociationEndView> associationEndMap = new HashMap<String, JPAEdmAssociationEndView>();
associationEndMap.put("SalesOrderHeader_String", objJPAEdmAssociationEnd);
field.set(objAssociation, associationEndMap);
} catch (ODataJPARuntimeException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (ODataJPAModelException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (SecurityException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (NoSuchFieldException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalArgumentException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (IllegalAccessException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
assertEquals("SalesOrderHeader_String", objAssociation.searchAssociation(objJPAEdmAssociationEnd).getName());
}
@Test
public void testAddJPAEdmAssociationView() {
class LocalJPAAssociationView extends JPAEdmTestModelView {
@Override
public AssociationEnd getEdmAssociationEnd1() {
AssociationEnd associationEnd = new AssociationEnd();
associationEnd.setType(new FullQualifiedName("salesorderprocessing", "SalesOrderHeader"));
associationEnd.setRole("SalesOrderHeader");
associationEnd.setMultiplicity(EdmMultiplicity.ONE);
return associationEnd;
}
@Override
public AssociationEnd getEdmAssociationEnd2() {
AssociationEnd associationEnd = new AssociationEnd();
associationEnd.setType(new FullQualifiedName("salesorderprocessing", "SalesOrderItem"));
associationEnd.setRole("SalesOrderItem");
associationEnd.setMultiplicity(EdmMultiplicity.MANY);
return associationEnd;
}
@Override
public Association getEdmAssociation() {
Association association = new Association();
association.setEnd1(new AssociationEnd().setType(new FullQualifiedName("salesorderprocessing",
"SalesOrderHeader")));
association.setEnd2(new AssociationEnd()
.setType(new FullQualifiedName("salesorderprocessing", "SalesOrderItem")));
return association;
}
}
LocalJPAAssociationView assocViewObj = new LocalJPAAssociationView();
JPAEdmAssociation objLocalAssociation = new JPAEdmAssociation(assocViewObj, assocViewObj, assocViewObj, 1);
try {
objLocalAssociation.getBuilder().build();
} catch (ODataJPARuntimeException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (ODataJPAModelException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
objAssociation.addJPAEdmAssociationView(objLocalAssociation, localView);
}
@Test
public void testAddJPAEdmRefConstraintView() {
localView = new JPAEdmAssociationTest();
objAssociation = new JPAEdmAssociation(localView, localView, localView, 1);
try {
objAssociation.getBuilder().build();
} catch (ODataJPAModelException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
} catch (ODataJPARuntimeException e) {
fail(ODataJPATestConstants.EXCEPTION_MSG_PART_1 + e.getMessage() + ODataJPATestConstants.EXCEPTION_MSG_PART_2);
}
objAssociation.addJPAEdmRefConstraintView(localView);
assertTrue(objAssociation.getConsistentEdmAssociationList().size() > 0);
}
@Test
public void testGetJPAEdmReferentialConstraintView() {
}
}