| /* |
| * 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); |
| } |
| |
| } |