/*
* 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.openjpa.persistence.annotations.xml;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.strats.FlatClassStrategy;
import org.apache.openjpa.jdbc.meta.strats.FullClassStrategy;
import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.MetaDataRepository;
import org.apache.openjpa.meta.ValueStrategies;
import org.apache.openjpa.persistence.ArgumentException;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.OpenJPAPersistence;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* Tests metadata-complete tag switches off any annotation processing.
*
* EntityA uses metadata-complete tag and hence all its annotated mapping info
* must not be processed.
*
* EntityB does not use metadata-complete tag and hence its mapping info should
* be combination of annotation mapping info overwritten by xml description
* mapping info.
*
* @author Pinaki Poddar
*
*/
public class TestMetaDataComplete extends SingleEMFTestCase {
private static OpenJPAEntityManagerFactorySPI oemf;
private static ClassMetaData entityA, entityB, derivedA, derivedB;
private static int currentTest = 0;
public void setUp() throws Exception {
currentTest++;
if (oemf == null) {
super.setUp(EntityA.class, EntityB.class, DerivedA.class,
DerivedB.class);
oemf = (OpenJPAEntityManagerFactorySPI) OpenJPAPersistence
.cast(emf);
MetaDataRepository repos = oemf.getConfiguration()
.getMetaDataRepositoryInstance();
entityA = repos.getMetaData(EntityA.class, null, true);
entityB = repos.getMetaData(EntityB.class, null, true);
derivedA = repos.getMetaData(DerivedA.class, null, true);
derivedB = repos.getMetaData(DerivedB.class, null, true);
}
}
public void tearDown() throws Exception {
// only cleanup after the last test has run
if (currentTest >= 6) {
closeEMF(oemf);
oemf = null;
super.tearDown();
entityA = null;
entityB = null;
derivedA = null;
derivedB = null;
}
}
protected String getPersistenceUnitName() {
return "test-metadata-complete";
}
public void testIgnoresClassAnnotationIfMetaDataComplete() {
// inheritance strategy of EntityA by annotation is SINGLE_TABLE
// inheritance strategy of EntityA in xml descriptor is JOINED
assertEquals(FullClassStrategy.class, ((ClassMapping) entityA)
.getStrategy().getClass());
assertEquals(VerticalClassStrategy.class, ((ClassMapping) derivedA)
.getStrategy().getClass());
}
public void testProcessesClassAnnotationIfMetaDataIsNotComplete() {
// inheritance strategy of EntityB by annotation is SINGLE_TABLE
// inheritance strategy of EntityB in xml descriptor is not specified
assertEquals(FullClassStrategy.class, ((ClassMapping) entityB)
.getStrategy().getClass());
assertEquals(FlatClassStrategy.class, ((ClassMapping) derivedB)
.getStrategy().getClass());
}
public void testIgnoresFieldAnnotationIfMetaDataComplete() {
// generation strategy of EntityA.id by annotation is IDENTITY
// inheritance strategy of EntityA in xml descriptor is SEQUENCE
int valueStrategyA = entityA.getField("id").getValueStrategy();
assertEquals(ValueStrategies.SEQUENCE, valueStrategyA);
}
public void testProcessesFieldAnnotationIfMetaDataIsNotComplete() {
// generation strategy of EntityB.id by annotation is IDENTITY
// inheritance strategy of EntityA in xml descriptor is not specified
int valueStrategyB = entityB.getField("id").getValueStrategy();
assertEquals(ValueStrategies.AUTOASSIGN, valueStrategyB);
}
public void testIgnoresNamedQueryIfMetaDataComplete() {
// DerivedA has annotated NamedQuery
String namedQuery = "DerivedA.SelectAll";
try {
oemf.createEntityManager().createNamedQuery(namedQuery);
fail("Expected not to find NamedQuery [" + namedQuery + "]");
} catch (ArgumentException e) {
assertTrue(e.getMessage().contains(namedQuery));
}
}
public void testProcessesNamedQueryIfMetaDataIsNotComplete() {
// EntityB has annotated NamedQuery
// EntityB has a Named Query in xml descriptor
oemf.createEntityManager().createNamedQuery("EntityB.SelectOne");
oemf.createEntityManager().createNamedQuery("EntityB.SelectAll");
}
}