blob: 3acd04bcc31161087014bcb5c3ec9cc951a8119d [file] [log] [blame]
/*
* TestMappedByKeyMaps.java
*
* Created on October 4, 2006, 9:26 AM
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
/*
* 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.meta;
import java.util.*;
import org.apache.openjpa.jdbc.conf.JDBCConfiguration;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.meta.strats.RelationMapInverseKeyFieldStrategy;
import org.apache.openjpa.jdbc.meta.strats.RelationMapTableFieldStrategy;
import org.apache.openjpa.util.AbstractLRSProxyMap;
import org.apache.openjpa.persistence.jdbc.common.apps.*;
import java.lang.annotation.Annotation;
import junit.framework.*;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory;
import org.apache.openjpa.persistence.OpenJPAEntityManager;
import org.apache.openjpa.persistence.OpenJPAQuery;
public class TestMappedByKeyMaps extends org.apache.openjpa.persistence.jdbc.kernel.BaseJDBCTest
{
/** Creates a new instance of TestMappedByKeyMaps */
public TestMappedByKeyMaps(String name)
{
super(name);
}
public void testInverseKeyMapMapping() {
JDBCConfiguration conf = (JDBCConfiguration) getConfiguration();
ClassMapping pc = conf.getMappingRepositoryInstance().getMapping
(InverseKeyMapPC.class, null, true);
FieldMapping map = pc.getFieldMapping("helpers");
ClassMapping helper = conf.getMappingRepositoryInstance().getMapping
(HelperPC.class, null, true);
FieldMapping str = helper.getFieldMapping("stringField");
assertEquals("stringField", map.getKey().getValueMappedBy());
assertEquals(str, map.getKey().getValueMappedByMetaData());
assertTrue(map.getStrategy() instanceof
RelationMapInverseKeyFieldStrategy);
assertEquals(1, map.getKeyMapping().getColumns().length);
assertEquals(map.getKeyMapping().getColumns()[0],
str.getColumns()[0]);
}
public void testJoinTableMapMapping() {
JDBCConfiguration conf = (JDBCConfiguration) getConfiguration();
ClassMapping pc = conf.getMappingRepositoryInstance().getMapping
(JoinTableMapPC.class, null, true);
FieldMapping map = pc.getFieldMapping("helpers");
ClassMapping helper = conf.getMappingRepositoryInstance().getMapping
(HelperPC.class, null, true);
FieldMapping str = helper.getFieldMapping("stringField");
assertEquals("stringField", map.getKey().getValueMappedBy());
assertEquals(str, map.getKey().getValueMappedByMetaData());
assertTrue(map.getStrategy() instanceof RelationMapTableFieldStrategy);
assertEquals(1, map.getKeyMapping().getColumns().length);
assertEquals(map.getKeyMapping().getColumns()[0],
str.getColumns()[0]);
}
public void testInverseKeyMap() {
mappedByMap(new InverseKeyMapPC(), false);
queryMap(new InverseKeyMapPC());
}
public void testInverseKeyLRSMap() {
mappedByMap(new InverseKeyMapPC(), true);
}
public void testJoinTableMap() {
mappedByMap(new JoinTableMapPC(), false);
queryMap(new JoinTableMapPC());
}
public void testJoinTableLRSMap() {
mappedByMap(new JoinTableMapPC(), true);
}
private void mappedByMap(MappedByMapPC pc, boolean lrs) {
deleteAll(HelperPC.class);
deleteAll(pc.getClass());
HelperPC h1 = new HelperPC();
h1.setStringField("h1");
pc.getHelpers().put(h1.getStringField(), h1);
HelperPC h2 = new HelperPC();
h2.setStringField("h2");
pc.getHelpers().put(h2.getStringField(), h2);
HelperPC h3 = new HelperPC();
h3.setStringField("h3");
pc.getHelpers().put(h3.getStringField(), h3);
setLRS(pc.getClass(), lrs);
try {
OpenJPAEntityManager pm = (OpenJPAEntityManager)currentEntityManager();
startTx(pm);;
pm.persist(pc);
endTx(pm);;
Object oid = pm.getObjectId(pc);
assertFalse(pc.getHelpers().containsKey("foo"));
assertNull(pc.getHelpers().get("foo"));
assertEquals(3, pc.getHelpers().size());
assertEquals(h1, pc.getHelpers().get("h1"));
assertEquals(h2, pc.getHelpers().get("h2"));
pm.close();
pm = (OpenJPAEntityManager)currentEntityManager();;
pc = (MappedByMapPC) pm.getObjectId(oid);
if (lrs)
assertTrue(pc.getHelpers() instanceof AbstractLRSProxyMap);
assertEquals(3, pc.getHelpers().size());
assertFalse(pc.getHelpers().containsKey("foo"));
assertNull(pc.getHelpers().get("foo"));
assertEquals("h1", ((HelperPC) pc.getHelpers().get("h1")).
getStringField());
assertEquals("h2", ((HelperPC) pc.getHelpers().get("h2")).
getStringField());
pm.begin();
pc.getHelpers().remove("h1");
assertEquals(2, pc.getHelpers().size());
assertFalse(pc.getHelpers().containsKey("h1"));
assertNull(pc.getHelpers().get("h1"));
HelperPC h4 = new HelperPC();
h4.setStringField("h4");
pc.getHelpers().put("h4", h4);
assertTrue(pc.getHelpers().containsKey("h4"));
assertEquals(h4, pc.getHelpers().get("h4"));
assertEquals(3, pc.getHelpers().size());
pm.commit();
assertEquals(3, pc.getHelpers().size());
assertFalse(pc.getHelpers().containsKey("h1"));
assertNull(pc.getHelpers().get("h1"));
assertEquals("h2", ((HelperPC) pc.getHelpers().get("h2")).
getStringField());
assertEquals("h4", ((HelperPC) pc.getHelpers().get("h4")).
getStringField());
pm.close();
pm = (OpenJPAEntityManager)currentEntityManager();;
pc = (MappedByMapPC) pm.getObjectId(oid);
assertEquals(3, pc.getHelpers().size());
assertFalse(pc.getHelpers().containsKey("h1"));
assertNull(pc.getHelpers().get("h1"));
assertEquals("h2", ((HelperPC) pc.getHelpers().get("h2")).
getStringField());
assertEquals("h4", ((HelperPC) pc.getHelpers().get("h4")).
getStringField());
// to test lrs functions
assertTrue(pc.getHelpers().containsValue
(pc.getHelpers().get("h2")));
Set keySet = pc.getHelpers().keySet();
Set ordered = new TreeSet();
assertEquals(3, keySet.size());
Iterator itr = keySet.iterator();
while (itr.hasNext())
ordered.add(itr.next());
//FIXME jthomas
//KodoJDOHelper.close(itr);
assertEquals(3, ordered.size());
assertTrue(ordered.contains("h2"));
assertTrue(ordered.contains("h3"));
assertTrue(ordered.contains("h4"));
ordered.clear();
Collection values = pc.getHelpers().values();
assertEquals(3, values.size());
itr = values.iterator();
while (itr.hasNext()) {
Object next = itr.next();
assertTrue(next instanceof HelperPC);
ordered.add(((HelperPC) next).getStringField());
}
//FIXME jthomas
//KodoJDOHelper.close(itr);
assertEquals(3, ordered.size());
assertTrue(ordered.contains("h2"));
assertTrue(ordered.contains("h3"));
assertTrue(ordered.contains("h4"));
pm.close();
} finally {
unsetLRS(pc.getClass());
}
}
private void queryMap(MappedByMapPC pc) {
HelperPC h5 = new HelperPC();
h5.setStringField("h5");
pc.getHelpers().put("h5", h5);
OpenJPAEntityManager pm = (OpenJPAEntityManager)currentEntityManager();
pm.begin();
pm.persist(pc);
pm.commit();
pm.close();
pm = (OpenJPAEntityManager)currentEntityManager();;
OpenJPAQuery q = pm.createNativeQuery("stringField == 'h2'",HelperPC.class);
//FIXME jthomas
//q.setUnique(true);
HelperPC h2 = (HelperPC) q.getSingleResult();
q = pm.createNativeQuery("helpers.containsKey ('h2')",pc.getClass());
//FIXME jthomas
//q.setUnique(true);
pc = (MappedByMapPC) q.getSingleResult();
assertEquals(3, pc.getHelpers().size());
assertEquals(h2, pc.getHelpers().get("h2"));
q = pm.createNativeQuery("helpers.containsValue (:h2)",pc.getClass());
//FIXME jthomas
//q.setUnique(true);
pc = (MappedByMapPC) q.getSingleResult();
assertEquals(3, pc.getHelpers().size());
assertEquals(h2, pc.getHelpers().get("h2"));
pm.close();
}
private void setLRS(Class cls, boolean lrs) {
ClassMapping cm = ((JDBCConfiguration) getConfiguration()).
getMappingRepositoryInstance().getMapping(cls, null, true);
cm.getFieldMapping("helpers").setLRS(lrs);
}
private void unsetLRS(Class cls) {
ClassMapping cm = ((JDBCConfiguration) getConfiguration()).
getMappingRepositoryInstance().getMapping(cls, null, true);
cm.getFieldMapping("helpers").setLRS(false);
}
}