| /* |
| * 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.meta; |
| |
| import java.util.Map; |
| import javax.persistence.EntityManager; |
| |
| |
| import org.apache.openjpa.persistence.meta.common.apps.MetaTest1; |
| import org.apache.openjpa.persistence.meta.common.apps.MetaTest2; |
| import org.apache.openjpa.persistence.meta.common.apps.MetaTest3; |
| import org.apache.openjpa.persistence.meta.common.apps.MetaTest5; |
| import org.apache.openjpa.persistence.meta.common.apps.MetaTest6; |
| import org.apache.openjpa.persistence.common.utils.AbstractTestCase; |
| import org.apache.openjpa.enhance.PersistenceCapable; |
| import org.apache.openjpa.kernel.Broker; |
| import org.apache.openjpa.meta.ClassMetaData; |
| import org.apache.openjpa.meta.FieldMetaData; |
| import org.apache.openjpa.meta.JavaTypes; |
| import org.apache.openjpa.meta.MetaDataRepository; |
| import org.apache.openjpa.persistence.JPAFacadeHelper; |
| |
| /** |
| * <p>Tests the {@link ClassMetaData} type, and in so doing tests parts of |
| * the {@link MetaDataRepository} and {@link FieldMetaData} types.</p> |
| * |
| * @author Abe White |
| */ |
| public class TestClassMetaData |
| extends AbstractTestCase { |
| |
| private MetaDataRepository _repos = null; |
| |
| private ClassMetaData _metaTest1 = null; |
| private ClassMetaData _metaTest2 = null; |
| private ClassMetaData _metaTest3 = null; |
| private ClassMetaData _metaTest5 = null; |
| private ClassMetaData _metaTest6 = null; |
| |
| public TestClassMetaData(String test) { |
| super(test, "metacactusapp"); |
| } |
| |
| public void setUp() |
| throws Exception { |
| _repos = getRepository(); |
| _metaTest5 = _repos.getMetaData(MetaTest5.class, null, true); |
| _metaTest3 = _repos.getMetaData(MetaTest3.class, null, true); |
| _metaTest2 = _repos.getMetaData(MetaTest2.class, null, true); |
| _metaTest1 = _repos.getMetaData(MetaTest1.class, null, true); |
| _metaTest6 = _repos.getMetaData(MetaTest6.class, null, true); |
| } |
| |
| protected MetaDataRepository getRepository() |
| throws Exception { |
| //return new OpenJPAConfigurationImpl().newMetaDataRepositoryInstance(); |
| //return getConfiguration().newMetaDataRepositoryInstance(); |
| EntityManager em = currentEntityManager(); |
| Broker broker = JPAFacadeHelper.toBroker(em); |
| return broker.getConfiguration().newMetaDataRepositoryInstance(); |
| } |
| |
| /** |
| * Test the class-level defaults. |
| */ |
| public void testClassDefaults() { |
| assertEquals(MetaTest1.class.getName(), |
| _metaTest1.getDescribedType().getName()); |
| assertNull(_metaTest1.getPCSuperclass()); |
| assertEquals(ClassMetaData.ID_DATASTORE, |
| _metaTest1.getIdentityType()); |
| assertTrue(_metaTest1.getRequiresExtent()); |
| } |
| |
| /** |
| * Test non-persistent fields. |
| */ |
| public void testDefaultNonPersistentFields() { |
| assertNull(_metaTest1.getField("staticField")); |
| assertNull(_metaTest1.getField("finalfield")); |
| assertNull(_metaTest1.getField("transientfield")); |
| assertNull(_metaTest1.getField("metaTest4Field")); |
| assertNull(_metaTest1.getField("metaTest4ArrayField")); |
| assertNull(_metaTest1.getField("objectField")); |
| assertNull(_metaTest1.getField("longWrapperField")); |
| |
| FieldMetaData fmd = _metaTest1.getField("doubleField"); |
| assertEquals(FieldMetaData.MANAGE_TRANSACTIONAL, fmd.getManagement()); |
| } |
| |
| /** |
| * Test basics on persistent fields. |
| */ |
| public void testBasicFields() { |
| FieldMetaData fmd; |
| fmd = _metaTest1.getField("stringField"); |
| assertEquals(JavaTypes.STRING, fmd.getTypeCode()); |
| assertEquals(JavaTypes.STRING, fmd.getDeclaredTypeCode()); |
| assertNull(fmd.getTypeMetaData()); |
| assertNull(fmd.getDeclaredTypeMetaData()); |
| fmd = _metaTest1.getField("intWrapperField"); |
| assertEquals(JavaTypes.INT_OBJ, fmd.getTypeCode()); |
| assertEquals(JavaTypes.INT_OBJ, fmd.getDeclaredTypeCode()); |
| fmd = _metaTest1.getField("intField"); |
| assertEquals(JavaTypes.INT, fmd.getTypeCode()); |
| assertEquals(JavaTypes.INT, fmd.getDeclaredTypeCode()); |
| fmd = _metaTest1.getField("metaTest2Field"); |
| assertEquals(JavaTypes.PC, fmd.getTypeCode()); |
| assertEquals(JavaTypes.PC, fmd.getDeclaredTypeCode()); |
| assertEquals(_metaTest2, fmd.getTypeMetaData()); |
| assertEquals(_metaTest2, fmd.getDeclaredTypeMetaData()); |
| fmd = _metaTest1.getField("metaTest2ArrayField"); |
| assertEquals(JavaTypes.ARRAY, fmd.getTypeCode()); |
| assertEquals(JavaTypes.PC, fmd.getElement().getTypeCode()); |
| assertEquals(JavaTypes.ARRAY, fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.PC, |
| fmd.getElement().getDeclaredTypeCode()); |
| fmd = _metaTest1.getField("intArrayField"); |
| assertEquals(JavaTypes.ARRAY, fmd.getTypeCode()); |
| assertEquals(JavaTypes.INT, fmd.getElement().getTypeCode()); |
| assertEquals(JavaTypes.ARRAY, fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.INT, |
| fmd.getElement().getDeclaredTypeCode()); |
| fmd = _metaTest1.getField("intField"); |
| assertEquals(FieldMetaData.NULL_EXCEPTION, fmd.getNullValue()); |
| assertTrue(!fmd.isInDefaultFetchGroup()); |
| assertTrue(!fmd.isEmbedded()); |
| fmd = _metaTest1.getField("stringField"); |
| assertEquals(FieldMetaData.NULL_UNSET, fmd.getNullValue()); |
| assertTrue(fmd.isInDefaultFetchGroup()); |
| assertTrue(fmd.isEmbedded()); |
| } |
| |
| /** |
| * Test collection and map fields. |
| */ |
| public void testCollectionFields() { |
| FieldMetaData fmd; |
| fmd = _metaTest2.getField("collectionField1"); |
| assertEquals(JavaTypes.COLLECTION, fmd.getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getElement().getTypeCode()); |
| assertEquals(Object.class, fmd.getElement().getType()); |
| assertNull(fmd.getElement().getTypeMetaData()); |
| assertEquals(JavaTypes.COLLECTION, |
| fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.OBJECT, |
| fmd.getElement().getDeclaredTypeCode()); |
| assertEquals(Object.class, fmd.getElement().getDeclaredType()); |
| assertNull(fmd.getElement().getTypeMetaData()); |
| assertTrue(fmd.getElement().isEmbedded()); |
| fmd = _metaTest2.getField("collectionField2"); |
| assertEquals(JavaTypes.COLLECTION, fmd.getTypeCode()); |
| assertEquals(JavaTypes.PC, fmd.getElement().getTypeCode()); |
| assertEquals(MetaTest3.class, fmd.getElement().getType()); |
| assertEquals(_metaTest3, fmd.getElement().getTypeMetaData()); |
| assertEquals(JavaTypes.COLLECTION, |
| fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.PC, |
| fmd.getElement().getDeclaredTypeCode()); |
| assertEquals(MetaTest3.class, fmd.getElement().getDeclaredType()); |
| assertEquals(_metaTest3, fmd.getElement().getDeclaredTypeMetaData()); |
| assertTrue(!fmd.getElement().isEmbedded()); |
| |
| fmd = _metaTest2.getField("mapField1"); |
| assertEquals(JavaTypes.MAP, fmd.getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getKey().getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getElement().getTypeCode()); |
| assertEquals(Object.class, fmd.getKey().getType()); |
| assertNull(fmd.getKey().getTypeMetaData()); |
| assertEquals(Object.class, fmd.getElement().getType()); |
| assertEquals(JavaTypes.MAP, fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getKey().getDeclaredTypeCode()); |
| assertEquals(JavaTypes.OBJECT, |
| fmd.getElement().getDeclaredTypeCode()); |
| assertEquals(Object.class, fmd.getKey().getDeclaredType()); |
| assertNull(fmd.getKey().getDeclaredTypeMetaData()); |
| assertEquals(Object.class, fmd.getElement().getDeclaredType()); |
| assertTrue(fmd.getKey().isEmbedded()); |
| assertTrue(fmd.getElement().isEmbedded()); |
| fmd = _metaTest2.getField("mapField2"); |
| assertEquals(JavaTypes.MAP, fmd.getTypeCode()); |
| assertEquals(JavaTypes.STRING, fmd.getKey().getTypeCode()); |
| assertEquals(JavaTypes.INT_OBJ, fmd.getElement().getTypeCode()); |
| assertEquals(String.class, fmd.getKey().getType()); |
| assertEquals(Integer.class, fmd.getElement().getType()); |
| assertEquals(JavaTypes.MAP, fmd.getDeclaredTypeCode()); |
| assertEquals(JavaTypes.STRING, fmd.getKey().getDeclaredTypeCode()); |
| assertEquals(JavaTypes.INT_OBJ, |
| fmd.getElement().getDeclaredTypeCode()); |
| assertEquals(String.class, fmd.getKey().getDeclaredType()); |
| assertEquals(Integer.class, fmd.getElement().getDeclaredType()); |
| assertTrue(fmd.getKey().isEmbedded()); |
| assertTrue(!fmd.getElement().isEmbedded()); |
| } |
| |
| /** |
| * Test the basic class-level meta data. |
| */ |
| public void testBasicClass() { |
| assertEquals(_metaTest1, _metaTest2.getPCSuperclassMetaData()); |
| assertTrue(!_metaTest2.getRequiresExtent()); |
| } |
| |
| /** |
| * Test application identity. |
| */ |
| public void testApplicationIdentity() { |
| assertEquals(ClassMetaData.ID_APPLICATION, |
| _metaTest5.getIdentityType()); |
| assertEquals(MetaTest5.MetaTest5Id.class.getName(), |
| _metaTest5.getObjectIdType().getName()); |
| assertEquals(ClassMetaData.ID_APPLICATION, |
| _metaTest6.getIdentityType()); |
| assertEquals(MetaTest5.MetaTest5Id.class.getName(), |
| _metaTest6.getObjectIdType().getName()); |
| } |
| |
| /** |
| * Test absolute field numbering. |
| */ |
| public void testAbsoluteFieldNumbering() { |
| assertEquals(0, _metaTest1.getField("doubleField").getIndex()); |
| assertEquals(1, _metaTest1.getField("intArrayField").getIndex()); |
| assertEquals(2, _metaTest1.getField("intField").getIndex()); |
| assertEquals(3, _metaTest1.getField("intWrapperField").getIndex()); |
| assertEquals(4, _metaTest1.getField("metaTest2ArrayField"). |
| getIndex()); |
| assertEquals(5, _metaTest1.getField("metaTest2Field").getIndex()); |
| assertEquals(6, _metaTest1.getField("stringField").getIndex()); |
| assertEquals(7, _metaTest2.getField("collectionField1").getIndex()); |
| assertEquals(8, _metaTest2.getField("collectionField2").getIndex()); |
| assertEquals(9, _metaTest2.getField("mapField1").getIndex()); |
| assertEquals(10, _metaTest2.getField("mapField2").getIndex()); |
| } |
| |
| /** |
| * Test the methods to get fields. |
| */ |
| public void testGetFields() { |
| FieldMetaData[] fmds = _metaTest2.getFields(); |
| assertEquals("doubleField", fmds[0].getName()); |
| assertEquals("intField", fmds[2].getName()); |
| assertEquals("collectionField2", fmds[8].getName()); |
| } |
| |
| /** |
| * Test that metadata on inner classes is available. |
| */ |
| public void testStaticInnerClasses() { |
| assertNotNull(_repos.getMetaData(MetaTest1.Inner.class, null, true)); |
| } |
| |
| /** |
| * Test extensions for external values and declared vs external types. |
| */ |
| public void testExternalTypes() { |
| // note that below, declared type code is promoted |
| FieldMetaData fmd = _metaTest3.getField("pcField"); |
| assertEquals(JavaTypes.PC_UNTYPED, fmd.getTypeCode()); |
| assertEquals(JavaTypes.PC_UNTYPED, fmd.getDeclaredTypeCode()); |
| assertEquals(PersistenceCapable.class, fmd.getType()); |
| assertEquals(Object.class, fmd.getDeclaredType()); |
| assertNull(fmd.getDeclaredTypeMetaData()); |
| assertNull(fmd.getTypeMetaData()); |
| |
| // note that below, declared type code is promoted |
| fmd = _metaTest3.getField("metaField"); |
| assertEquals(JavaTypes.PC, fmd.getTypeCode()); |
| assertEquals(JavaTypes.PC, fmd.getDeclaredTypeCode()); |
| assertEquals(MetaTest2.class, fmd.getType()); |
| assertEquals(Object.class, fmd.getDeclaredType()); |
| assertEquals(_metaTest2, fmd.getDeclaredTypeMetaData()); |
| assertEquals(_metaTest2, fmd.getTypeMetaData()); |
| |
| fmd = _metaTest3.getField("externalField"); |
| assertTrue(fmd.isExternalized()); |
| assertEquals(JavaTypes.MAP, fmd.getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getDeclaredTypeCode()); |
| assertEquals(Map.class, fmd.getType()); |
| assertEquals(Object.class, fmd.getDeclaredType()); |
| assertEquals(JavaTypes.STRING, fmd.getKey().getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, fmd.getKey().getDeclaredTypeCode()); |
| assertEquals(String.class, fmd.getKey().getType()); |
| assertEquals(Object.class, fmd.getKey().getDeclaredType()); |
| assertEquals(JavaTypes.PC, fmd.getElement().getTypeCode()); |
| assertEquals(JavaTypes.OBJECT, |
| fmd.getElement().getDeclaredTypeCode()); |
| assertEquals(MetaTest2.class, fmd.getElement().getType()); |
| assertEquals(Object.class, fmd.getElement().getDeclaredType()); |
| assertEquals(_metaTest2, fmd.getElement().getTypeMetaData()); |
| assertNull(fmd.getElement().getDeclaredTypeMetaData()); |
| } |
| } |