blob: 34f7d762ae7608c200b47cbfd5921fa7d40b67a8 [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.openjpa.persistence.jdbc.annotations;
import java.awt.*;
import java.util.Map;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.Discriminator;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.meta.ValueMapping;
import org.apache.openjpa.jdbc.meta.strats.ClassNameDiscriminatorStrategy;
import org.apache.openjpa.jdbc.schema.ForeignKey;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.persistence.JPAFacadeHelper;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.test.SingleEMFTestCase;
/**
* <p>Test the parsing of non-standard mapping annotations.</p>
*
* @author Abe White
*/
public class TestNonstandardMappingAnnotations
extends SingleEMFTestCase {
private ClassMapping _mapping;
private DBDictionary _dict;
public void setUp() {
setUp(NonstandardMappingEntity.class, ExtensionsEntity.class,
NonstandardMappingMappedSuper.class, EmbedValue2.class,
EmbedValue.class,
CLEAR_TABLES);
// trigger complete resolution of metadata etc.
emf.createEntityManager().close();
JDBCConfiguration conf = (JDBCConfiguration) emf.getConfiguration();
_dict = conf.getDBDictionaryInstance();
_mapping = (ClassMapping) JPAFacadeHelper.getMetaData(emf,
NonstandardMappingEntity.class);
}
public void testNonpolymorphic() {
FieldMapping fm = _mapping.getFieldMapping("superRel");
assertEquals(ValueMapping.POLY_FALSE, fm.getPolymorphic());
ValueMapping vm = _mapping.getFieldMapping("joinCollection").
getElementMapping();
assertEquals(ValueMapping.POLY_JOINABLE, vm.getPolymorphic());
vm = _mapping.getFieldMapping("joinMap").getKeyMapping();
assertEquals(ValueMapping.POLY_FALSE, vm.getPolymorphic());
vm = _mapping.getFieldMapping("joinMap").getElementMapping();
assertEquals(ValueMapping.POLY_FALSE, vm.getPolymorphic());
}
public void testDataStoreIdColumn() {
assertEquals("NONSTD_ENTITY", _mapping.getTable().getName());
assertEquals(ClassMapping.ID_DATASTORE, _mapping.getIdentityType());
assertEquals(1, _mapping.getPrimaryKeyColumns().length);
assertEquals("OID", _mapping.getPrimaryKeyColumns()[0].getName());
}
public void testDiscriminator() {
Discriminator disc = _mapping.getDiscriminator();
assertTrue(disc.getStrategy() instanceof
ClassNameDiscriminatorStrategy);
assertEquals(1, disc.getColumns().length);
assertEquals("DISCRIM", disc.getColumns()[0].getName());
}
public void testSuperclassOverride() {
FieldMapping fm = _mapping.getFieldMapping("superCollection");
assertEquals("SUP_COLL", fm.getTable().getName());
assertEquals(1, fm.getJoinForeignKey().getColumns().length);
assertEquals("OWNER", fm.getJoinForeignKey().getColumns()[0].
getName());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("SUP_ELEM", fm.getElementMapping().getColumns()[0].
getName());
assertNull(fm.getElementMapping().getValueIndex());
assertNotNull(fm.getJoinIndex());
}
public void testCustomField() {
FieldMapping fm = _mapping.getFieldMapping("custom");
assertTrue(fm.getHandler() instanceof PointHandler);
assertEquals(2, fm.getColumns().length);
assertEquals("X_COL", fm.getColumns()[0].getName());
assertEquals("Y_COL", fm.getColumns()[1].getName());
assertNotNull(fm.getValueIndex());
}
public void testValueCollection() {
FieldMapping fm = _mapping.getFieldMapping("stringCollection");
assertEquals("STRINGS_COLL", fm.getTable().getName());
assertEquals(1, fm.getJoinForeignKey().getColumns().length);
assertEquals("OWNER", fm.getJoinForeignKey().getColumns()[0].
getName());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("STR_ELEM", fm.getElementMapping().getColumns()[0].
getName());
assertEquals(127, fm.getElementMapping().getColumns()[0].getSize());
assertNotNull(fm.getElementMapping().getValueIndex());
assertNull(fm.getJoinIndex());
}
public void testJoinCollection() {
FieldMapping fm = _mapping.getFieldMapping("joinCollection");
assertEquals("JOIN_COLL", fm.getTable().getName());
assertEquals(1, fm.getJoinForeignKey().getColumns().length);
assertEquals("OWNER", fm.getJoinForeignKey().getColumns()[0].
getName());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("JOIN_ELEM", fm.getElementMapping().getColumns()[0].
getName());
assertForeignKey(fm.getJoinForeignKey());
assertForeignKey(fm.getElementMapping().getForeignKey());
}
private void assertForeignKey(ForeignKey fk) {
if (_dict.supportsForeignKeys)
assertEquals(ForeignKey.ACTION_RESTRICT, fk.getDeleteAction());
}
public void testValueMap() {
FieldMapping fm = _mapping.getFieldMapping("stringMap");
assertEquals("STRINGS_MAP", fm.getTable().getName());
assertEquals(1, fm.getJoinForeignKey().getColumns().length);
assertEquals("OWNER", fm.getJoinForeignKey().getColumns()[0].
getName());
assertEquals(1, fm.getKeyMapping().getColumns().length);
assertEquals("STR_KEY", fm.getKeyMapping().getColumns()[0].
getName());
assertEquals(127, fm.getKeyMapping().getColumns()[0].getSize());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("STR_VAL", fm.getElementMapping().getColumns()[0].
getName());
assertEquals(127, fm.getElementMapping().getColumns()[0].getSize());
assertNull(fm.getJoinIndex());
assertNotNull(fm.getKeyMapping().getValueIndex());
assertNotNull(fm.getElementMapping().getValueIndex());
}
public void testJoinMap() {
FieldMapping fm = _mapping.getFieldMapping("joinMap");
assertEquals("JOIN_MAP", fm.getTable().getName());
assertEquals(1, fm.getJoinForeignKey().getColumns().length);
assertEquals("OWNER", fm.getJoinForeignKey().getColumns()[0].
getName());
assertEquals(1, fm.getKeyMapping().getColumns().length);
assertEquals("JOIN_KEY", fm.getKeyMapping().getColumns()[0].
getName());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("JOIN_VAL", fm.getElementMapping().getColumns()[0].
getName());
assertForeignKey(fm.getJoinForeignKey());
assertForeignKey(fm.getKeyMapping().getForeignKey());
assertForeignKey(fm.getElementMapping().getForeignKey());
}
public void testEmbeddedOverride() {
FieldMapping fm = _mapping.getFieldMapping("embed");
assertTrue(fm.isEmbedded());
assertEquals(1, fm.getColumns().length);
assertTrue("UUID_HEX".equalsIgnoreCase(fm.getColumns()[0].
getName()));
ClassMapping embed = fm.getEmbeddedMapping();
fm = embed.getFieldMapping("rel");
assertEquals(1, fm.getColumns().length);
assertEquals("EM_REL_ID", fm.getColumns()[0].getName());
fm = embed.getFieldMapping("eager");
assertEquals("EM_EAGER", fm.getTable().getName());
assertEquals(1, fm.getElementMapping().getColumns().length);
assertEquals("ELEM_EAGER_ID", fm.getElementMapping().getColumns()[0].
getName());
}
public void testEmbeddedElementOverride() {
FieldMapping fm = _mapping.getFieldMapping("embedCollection");
assertTrue(fm.getElement().isEmbedded());
assertEquals("EMBED_COLL", fm.getTable().getName());
assertEquals(0, fm.getElementMapping().getColumns().length);
ClassMapping embed = fm.getElementMapping().getEmbeddedMapping();
fm = embed.getFieldMapping("basic");
assertEquals(1, fm.getColumns().length);
assertEquals("EM_BASIC", fm.getColumns()[0].getName());
}
public void testInsertAndRetrieve() {
NonstandardMappingEntity pc = new NonstandardMappingEntity();
pc.getSuperCollection().add("super");
pc.setCustom(new Point(1, 2));
pc.getStringCollection().add("string");
NonstandardMappingEntity pc2 = new NonstandardMappingEntity();
pc.getJoinCollection().add(pc2);
pc.getStringMap().put("stringKey", "stringValue");
NonstandardMappingEntity pc3 = new NonstandardMappingEntity();
pc.getJoinMap().put(pc2, pc3);
ExtensionsEntity embed = new ExtensionsEntity();
embed.setExternalValues('M');
embed.setExternalizer(String.class);
pc.setEmbed(embed);
EmbedValue2 embed2 = new EmbedValue2();
embed2.setBasic("basic");
pc.getEmbedCollection().add(embed2);
OpenJPAEntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persistAll(new Object[]{ pc, pc2, pc3 });
em.getTransaction().commit();
Object pcId = em.getObjectId(pc);
Object pc2Id = em.getObjectId(pc2);
Object pc3Id = em.getObjectId(pc3);
em.close();
em = emf.createEntityManager();
pc = em.find(NonstandardMappingEntity.class, pcId);
assertEquals(1, pc.getSuperCollection().size());
assertEquals("super", pc.getSuperCollection().get(0));
assertEquals(1, pc.getCustom().x);
assertEquals(2, pc.getCustom().y);
assertEquals(1, pc.getStringCollection().size());
assertEquals("string", pc.getStringCollection().get(0));
assertEquals(1, pc.getJoinCollection().size());
assertEquals(pc2Id, em.getObjectId(pc.getJoinCollection().get(0)));
assertEquals(1, pc.getStringMap().size());
assertEquals("stringValue", pc.getStringMap().get("stringKey"));
assertEquals(1, pc.getJoinMap().size());
Map.Entry entry = pc.getJoinMap().entrySet().iterator().next();
assertEquals(pc2Id, em.getObjectId(entry.getKey()));
assertEquals(pc3Id, em.getObjectId(entry.getValue()));
assertEquals('M', pc.getEmbed().getExternalValues());
assertEquals(String.class, pc.getEmbed().getExternalizer());
assertEquals(1, pc.getEmbedCollection().size());
assertEquals("basic", pc.getEmbedCollection().get(0).getBasic());
em.close();
}
public void testInsertAndRetrieveEmbeddedCollection() {
NonstandardMappingEntity pc = new NonstandardMappingEntity();
EmbedValue2 embed2 = new EmbedValue2();
embed2.setBasic("basic");
pc.getEmbedCollection().add(embed2);
OpenJPAEntityManager em = emf.createEntityManager();
em.getTransaction().begin();
em.persist(pc);
em.getTransaction().commit();
Object pcId = em.getObjectId(pc);
em.close();
em = emf.createEntityManager();
pc = em.find(NonstandardMappingEntity.class, pcId);
assertEquals(1, pc.getEmbedCollection().size());
assertEquals("basic", pc.getEmbedCollection().get(0).getBasic());
em.close();
}
}