/*******************************************************************************
* Copyright 2013 SAP AG
*
* 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 com.sap.core.odata.processor.core.jpa.jpql;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.persistence.Cache;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnitUtil;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.metamodel.Metamodel;
import org.easymock.EasyMock;
import org.junit.Test;
import com.sap.core.odata.api.edm.EdmEntitySet;
import com.sap.core.odata.api.edm.EdmEntityType;
import com.sap.core.odata.api.edm.EdmException;
import com.sap.core.odata.api.edm.EdmMapping;
import com.sap.core.odata.api.edm.EdmProperty;
import com.sap.core.odata.api.edm.EdmSimpleType;
import com.sap.core.odata.api.exception.ODataException;
import com.sap.core.odata.api.uri.KeyPredicate;
import com.sap.core.odata.api.uri.NavigationSegment;
import com.sap.core.odata.api.uri.expression.OrderByExpression;
import com.sap.core.odata.api.uri.info.GetEntitySetUriInfo;
import com.sap.core.odata.api.uri.info.GetEntityUriInfo;
import com.sap.core.odata.processor.api.jpa.factory.JPAAccessFactory;
import com.sap.core.odata.processor.api.jpa.factory.ODataJPAAccessFactory;
import com.sap.core.odata.processor.api.jpa.jpql.JPQLContext;
import com.sap.core.odata.processor.api.jpa.jpql.JPQLContext.JPQLContextBuilder;
import com.sap.core.odata.processor.api.jpa.jpql.JPQLContextType;
import com.sap.core.odata.processor.api.jpa.jpql.JPQLStatement.JPQLStatementBuilder;
import com.sap.core.odata.processor.core.jpa.ODataJPAContextImpl;
import com.sap.core.odata.processor.core.jpa.access.data.JPAProcessorImplTest;
import com.sap.core.odata.processor.core.jpa.common.ODataJPATestConstants;
import com.sap.core.odata.processor.core.jpa.factory.ODataJPAFactoryImpl;
import com.sap.core.odata.processor.core.jpa.jpql.JPQLSelectContext.JPQLSelectContextBuilder;
import com.sap.core.odata.processor.core.jpa.jpql.JPQLSelectSingleContext.JPQLSelectSingleContextBuilder;
public class JPQLBuilderFactoryTest {
@Test
public void testGetStatementBuilderFactoryforSelect() throws ODataException {
GetEntitySetUriInfo getEntitySetView = getUriInfo();
// Build JPQL Context
JPQLContext selectContext = JPQLContext.createBuilder(
JPQLContextType.SELECT, getEntitySetView).build();
JPQLStatementBuilder statementBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getStatementBuilder(selectContext);
assertTrue(statementBuilder instanceof JPQLSelectStatementBuilder);
}
@Test
public void testGetStatementBuilderFactoryforSelectSingle()
throws ODataException {
GetEntityUriInfo getEntityView = getEntityUriInfo();
// Build JPQL Context
JPQLContext selectContext = JPQLContext.createBuilder(
JPQLContextType.SELECT_SINGLE, getEntityView).build();
JPQLStatementBuilder statementBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getStatementBuilder(selectContext);
assertTrue(statementBuilder instanceof JPQLSelectSingleStatementBuilder);
}
@Test
public void testGetStatementBuilderFactoryforJoinSelect()
throws ODataException {
GetEntitySetUriInfo getEntitySetView = getUriInfo();
// Build JPQL Context
JPQLContext selectContext = JPQLContext.createBuilder(
JPQLContextType.JOIN, getEntitySetView).build();
JPQLStatementBuilder statementBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getStatementBuilder(selectContext);
assertTrue(statementBuilder instanceof JPQLJoinStatementBuilder);
}
@Test
public void testGetStatementBuilderFactoryforJoinSelectSingle()
throws ODataException {
GetEntityUriInfo getEntityView = getEntityUriInfo();
// Build JPQL Context
JPQLContext selectContext = JPQLContext.createBuilder(
JPQLContextType.JOIN_SINGLE, getEntityView).build();
JPQLStatementBuilder statementBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getStatementBuilder(selectContext);
assertTrue(statementBuilder instanceof JPQLJoinSelectSingleStatementBuilder);
}
@Test
public void testGetContextBuilderforDelete() throws ODataException {
// Build JPQL ContextBuilder
JPQLContextBuilder contextBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getContextBuilder(
JPQLContextType.DELETE);
assertNull(contextBuilder);
}
@Test
public void testGetContextBuilderforSelect() throws ODataException {
// Build JPQL ContextBuilder
JPQLContextBuilder contextBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getContextBuilder(
JPQLContextType.SELECT);
assertNotNull(contextBuilder);
assertTrue(contextBuilder instanceof JPQLSelectContextBuilder);
}
@Test
public void testGetContextBuilderforSelectSingle() throws ODataException {
// Build JPQL ContextBuilder
JPQLContextBuilder contextBuilder = new ODataJPAFactoryImpl()
.getJPQLBuilderFactory().getContextBuilder(
JPQLContextType.SELECT_SINGLE);
assertNotNull(contextBuilder);
assertTrue(contextBuilder instanceof JPQLSelectSingleContextBuilder);
}
private GetEntitySetUriInfo getUriInfo() throws EdmException {
GetEntitySetUriInfo getEntitySetView = EasyMock
.createMock(GetEntitySetUriInfo.class);
EdmEntitySet edmEntitySet = EasyMock.createMock(EdmEntitySet.class);
EdmEntityType edmEntityType = EasyMock.createMock(EdmEntityType.class);
EasyMock.expect(edmEntityType.getMapping()).andStubReturn(null);
EasyMock.expect(edmEntityType.getName()).andStubReturn("SOItem");
EasyMock.replay(edmEntityType);
OrderByExpression orderByExpression = EasyMock
.createMock(OrderByExpression.class);
EasyMock.expect(getEntitySetView.getTargetEntitySet()).andStubReturn(
edmEntitySet);
EdmEntitySet startEdmEntitySet = EasyMock.createMock(EdmEntitySet.class);
EdmEntityType startEdmEntityType = EasyMock.createMock(EdmEntityType.class);
EasyMock.expect(startEdmEntityType.getMapping()).andStubReturn(null);
EasyMock.expect(startEdmEntityType.getName()).andStubReturn("SOHeader");
EasyMock.expect(startEdmEntitySet.getEntityType()).andStubReturn(startEdmEntityType);
EasyMock.expect(getEntitySetView.getStartEntitySet()).andStubReturn(
startEdmEntitySet);
EasyMock.replay(startEdmEntityType, startEdmEntitySet);
EasyMock.expect(getEntitySetView.getOrderBy()).andStubReturn(
orderByExpression);
EasyMock.expect(getEntitySetView.getSelect()).andStubReturn(null);
EasyMock.expect(getEntitySetView.getFilter()).andStubReturn(null);
List<NavigationSegment> navigationSegments = new ArrayList<NavigationSegment>();
EasyMock.expect(getEntitySetView.getNavigationSegments())
.andStubReturn(navigationSegments);
KeyPredicate keyPredicate = EasyMock
.createMock(KeyPredicate.class);
EdmProperty kpProperty = EasyMock
.createMock(EdmProperty.class);
EdmSimpleType edmType = EasyMock
.createMock(EdmSimpleType.class);
EdmMapping edmMapping = EasyMock.createMock(EdmMapping.class);
EasyMock.expect(edmMapping.getInternalName()).andStubReturn("Field1");
EasyMock.expect(keyPredicate.getLiteral()).andStubReturn("1");
try {
EasyMock.expect(kpProperty.getName()).andStubReturn("Field1");
EasyMock.expect(kpProperty.getType()).andStubReturn(edmType);
EasyMock.expect(kpProperty.getMapping()).andStubReturn(edmMapping);
} catch (EdmException e2) {
fail("this should not happen");
}
EasyMock.expect(keyPredicate.getProperty()).andStubReturn(kpProperty);
EasyMock.replay(edmMapping, edmType, kpProperty, keyPredicate);
List<KeyPredicate> keyPredicates = new ArrayList<KeyPredicate>();
keyPredicates.add(keyPredicate);
EasyMock.expect(getEntitySetView.getKeyPredicates()).andStubReturn(keyPredicates);
EasyMock.replay(getEntitySetView);
EasyMock.expect(edmEntitySet.getEntityType()).andStubReturn(
edmEntityType);
EasyMock.replay(edmEntitySet);
return getEntitySetView;
}
private GetEntityUriInfo getEntityUriInfo() throws EdmException {
GetEntityUriInfo getEntityView = EasyMock
.createMock(GetEntityUriInfo.class);
EdmEntitySet edmEntitySet = EasyMock.createMock(EdmEntitySet.class);
EdmEntityType edmEntityType = EasyMock.createMock(EdmEntityType.class);
EasyMock.expect(edmEntityType.getKeyProperties()).andStubReturn(
new ArrayList<EdmProperty>());
EasyMock.expect(edmEntityType.getMapping()).andStubReturn(null);
EasyMock.expect(edmEntityType.getName()).andStubReturn("");
EasyMock.expect(edmEntitySet.getEntityType()).andStubReturn(
edmEntityType);
EasyMock.expect(getEntityView.getSelect()).andStubReturn(null);
EasyMock.expect(getEntityView.getTargetEntitySet()).andStubReturn(
edmEntitySet);
EdmEntitySet startEdmEntitySet = EasyMock.createMock(EdmEntitySet.class);
EdmEntityType startEdmEntityType = EasyMock.createMock(EdmEntityType.class);
EasyMock.expect(startEdmEntityType.getMapping()).andStubReturn(null);
EasyMock.expect(startEdmEntityType.getName()).andStubReturn("SOHeader");
EasyMock.expect(startEdmEntitySet.getEntityType()).andStubReturn(startEdmEntityType);
EasyMock.expect(getEntityView.getStartEntitySet()).andStubReturn(
startEdmEntitySet);
EasyMock.replay(startEdmEntityType, startEdmEntitySet);
EasyMock.replay(edmEntityType, edmEntitySet);
EasyMock.expect(getEntityView.getKeyPredicates()).andStubReturn(
new ArrayList<KeyPredicate>());
List<NavigationSegment> navigationSegments = new ArrayList<NavigationSegment>();
EasyMock.expect(getEntityView.getNavigationSegments()).andStubReturn(
navigationSegments);
EasyMock.replay(getEntityView);
return getEntityView;
}
@Test
public void testJPAAccessFactory() {
ODataJPAFactoryImpl oDataJPAFactoryImpl = new ODataJPAFactoryImpl();
JPAAccessFactory jpaAccessFactory = oDataJPAFactoryImpl
.getJPAAccessFactory();
ODataJPAContextImpl oDataJPAContextImpl = new ODataJPAContextImpl();
Class<?> clazz = oDataJPAContextImpl.getClass();
try {
Field field = clazz.getDeclaredField("em");
field.setAccessible(true);
field.set(oDataJPAContextImpl, new JPAProcessorImplTest().getLocalEntityManager());
} 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);
}
EntityManagerFactory emf = new EntityManagerFactory() {
@Override
public boolean isOpen() {
return false;
}
@Override
public Map<String, Object> getProperties() {
return null;
}
@Override
public PersistenceUnitUtil getPersistenceUnitUtil() {
return null;
}
@Override
public Metamodel getMetamodel() {
return null;
}
@Override
public CriteriaBuilder getCriteriaBuilder() {
return null;
}
@Override
public Cache getCache() {
return null;
}
@SuppressWarnings("rawtypes")
@Override
public EntityManager createEntityManager(final Map arg0) {
return null;
}
@Override
public EntityManager createEntityManager() {
return null;
}
@Override
public void close() {}
};
oDataJPAContextImpl.setEntityManagerFactory(emf);
oDataJPAContextImpl.setPersistenceUnitName("pUnit");
assertNotNull(jpaAccessFactory.getJPAProcessor(oDataJPAContextImpl));
assertNotNull(jpaAccessFactory.getJPAEdmModelView(oDataJPAContextImpl));
}
@Test
public void testOdataJpaAccessFactory() {
ODataJPAFactoryImpl oDataJPAFactoryImpl = new ODataJPAFactoryImpl();
ODataJPAAccessFactory jpaAccessFactory = oDataJPAFactoryImpl
.getODataJPAAccessFactory();
ODataJPAContextImpl oDataJPAContextImpl = new ODataJPAContextImpl();
EntityManagerFactory emf = new EntityManagerFactory() {
@Override
public boolean isOpen() {
// TODO Auto-generated method stub
return false;
}
@Override
public Map<String, Object> getProperties() {
// TODO Auto-generated method stub
return null;
}
@Override
public PersistenceUnitUtil getPersistenceUnitUtil() {
// TODO Auto-generated method stub
return null;
}
@Override
public Metamodel getMetamodel() {
// TODO Auto-generated method stub
return null;
}
@Override
public CriteriaBuilder getCriteriaBuilder() {
// TODO Auto-generated method stub
return null;
}
@Override
public Cache getCache() {
// TODO Auto-generated method stub
return null;
}
@SuppressWarnings("rawtypes")
@Override
public EntityManager createEntityManager(final Map arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public EntityManager createEntityManager() {
// TODO Auto-generated method stub
return null;
}
@Override
public void close() {
// TODO Auto-generated method stub
}
};
oDataJPAContextImpl.setEntityManagerFactory(emf);
oDataJPAContextImpl.setPersistenceUnitName("pUnit");
assertNotNull(jpaAccessFactory.getODataJPAMessageService(new Locale(
"en")));
assertNotNull(jpaAccessFactory.createODataJPAContext());
assertNotNull(jpaAccessFactory
.createJPAEdmProvider(oDataJPAContextImpl));
assertNotNull(jpaAccessFactory
.createODataProcessor(oDataJPAContextImpl));
}
}