Return-Path: Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: (qmail 17808 invoked from network); 22 Sep 2008 19:01:46 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 22 Sep 2008 19:01:46 -0000 Received: (qmail 86789 invoked by uid 500); 22 Sep 2008 19:01:44 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 86758 invoked by uid 500); 22 Sep 2008 19:01:43 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 86749 invoked by uid 99); 22 Sep 2008 19:01:43 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 22 Sep 2008 12:01:43 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 22 Sep 2008 19:00:51 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 2D505238896F; Mon, 22 Sep 2008 12:00:55 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: svn commit: r697950 - in /jackrabbit/trunk/jackrabbit-ocm/src: main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/ test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/ test/java/org/apache/jackrabbit/ocm/testmodel/collection/ Date: Mon, 22 Sep 2008 19:00:54 -0000 To: commits@jackrabbit.apache.org From: clombart@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080922190055.2D505238896F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: clombart Date: Mon Sep 22 12:00:54 2008 New Revision: 697950 URL: http://svn.apache.org/viewvc?rev=697950&view=rev Log: Patch provided by Vincent Giguère for issue JCR-1645 ( Add support for Map of referenced beans). I made some modifications in the test content class Main otherwise it doesnt't compile. Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/BeanReferenceMapConverterImpl.java jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/MapReferenceValueEncoder.java jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/BeanReferenceMapConverterImplTest.java jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/MapReferenceValueEncoderTest.java Modified: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/testmodel/collection/Main.java Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/BeanReferenceMapConverterImpl.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/BeanReferenceMapConverterImpl.java?rev=697950&view=auto ============================================================================== --- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/BeanReferenceMapConverterImpl.java (added) +++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/BeanReferenceMapConverterImpl.java Mon Sep 22 12:00:54 2008 @@ -0,0 +1,214 @@ +/* + * 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.jackrabbit.ocm.manager.collectionconverter.impl; + + +import org.apache.jackrabbit.ocm.exception.JcrMappingException; +import org.apache.jackrabbit.ocm.exception.ObjectContentManagerException; +import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableMap; +import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjects; +import org.apache.jackrabbit.ocm.manager.collectionconverter.ManageableObjectsUtil; +import org.apache.jackrabbit.ocm.manager.objectconverter.ObjectConverter; +import org.apache.jackrabbit.ocm.mapper.Mapper; +import org.apache.jackrabbit.ocm.mapper.model.ClassDescriptor; +import org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor; +import org.apache.jackrabbit.ocm.mapper.model.FieldDescriptor; +import org.apache.jackrabbit.ocm.reflection.ReflectionUtils; + +import javax.jcr.*; +import javax.jcr.lock.LockException; +import javax.jcr.nodetype.ConstraintViolationException; +import javax.jcr.version.VersionException; +import java.util.Iterator; +import java.util.Map; + +/** + * Map converter used to map reference/uuid property by key into a java.util.Map. + *

+ * This implementation takes for granted that the keys to the map are of type java.lang.String. + *

+ * Further development will be required to fully support Map. + * + * @author Vincent Giguere + */ +public class BeanReferenceMapConverterImpl extends AbstractCollectionConverterImpl { + + + /** + * Constructor + * + * @param atomicTypeConverters + * @param objectConverter + * @param mapper + */ + public BeanReferenceMapConverterImpl(Map atomicTypeConverters, + ObjectConverter objectConverter, + Mapper mapper) { + super(atomicTypeConverters, objectConverter, mapper); + } + + protected void doInsertCollection(Session session, + Node parentNode, + CollectionDescriptor collectionDescriptor, + ManageableObjects objects) throws RepositoryException { + + // For maps of bean references, only Maps are supported + if (!(objects instanceof ManageableMap)) { + + throw new JcrMappingException("Impossible to retrieve the attribute " + + collectionDescriptor.getFieldName() + " in the class " + + collectionDescriptor.getClassDescriptor().getClassName() + + " because it is not a map"); + } + + + addUuidProperties(session, parentNode, collectionDescriptor, (ManageableMap) objects); + } + + + protected void doUpdateCollection(Session session, + Node parentNode, + CollectionDescriptor collectionDescriptor, + ManageableObjects objects) throws RepositoryException { + + // For maps of bean references, only Maps are supported + if (!(objects instanceof ManageableMap)) { + + throw new JcrMappingException("Impossible to retrieve the attribute " + + collectionDescriptor.getFieldName() + " in the class " + + collectionDescriptor.getClassDescriptor().getClassName() + + " because it is not a map"); + } + String jcrName = getCollectionJcrName(collectionDescriptor); + + // Delete existing values + if (parentNode.hasProperty(jcrName)) { + parentNode.setProperty(jcrName, (Value[]) null); + } + + if (objects == null) { + return; + } + + addUuidProperties(session, parentNode, collectionDescriptor, (ManageableMap) objects); + + } + + /** + * @see org.apache.jackrabbit.ocm.manager.collectionconverter.impl.AbstractCollectionConverterImpl#doGetCollection(javax.jcr.Session, javax.jcr.Node, org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor, Class) + */ + protected ManageableObjects doGetCollection(Session session, + Node parentNode, + CollectionDescriptor collectionDescriptor, + Class collectionFieldClass) throws RepositoryException { + + + try { + String jcrName = getCollectionJcrName(collectionDescriptor); + + if (!parentNode.hasProperty(jcrName)) { + return null; + } + + Property property = parentNode.getProperty(jcrName); + Value[] values = property.getValues(); + + ManageableObjects objects = ManageableObjectsUtil.getManageableObjects(collectionFieldClass); + + // For maps of bean references, only Maps are supported + if (!(objects instanceof ManageableMap)) { + + throw new JcrMappingException("Impossible to retrieve the attribute " + + collectionDescriptor.getFieldName() + " in the class " + + collectionDescriptor.getClassDescriptor().getClassName() + + " because it is not a map"); + } + + for (int i = 0; i < values.length; i++) { + + String encoded = values[i].getString(); + String key = MapReferenceValueEncoder.decodeKey(encoded); + String uuid = MapReferenceValueEncoder.decodeReference(encoded); + + + String path = session.getNodeByUUID(uuid).getPath(); + Object object = objectConverter.getObject(session, path); + ((ManageableMap) objects).addObject(key, object); + } + + return objects; + } + catch (Exception e) { + throw new ObjectContentManagerException("Cannot get the collection field : " + + collectionDescriptor.getFieldName() + + "for class " + collectionDescriptor.getClassDescriptor().getClassName(), e); + } + } + + /** + * @see org.apache.jackrabbit.ocm.manager.collectionconverter.impl.AbstractCollectionConverterImpl#doIsNull(javax.jcr.Session, javax.jcr.Node, org.apache.jackrabbit.ocm.mapper.model.CollectionDescriptor, Class) + */ + protected boolean doIsNull(Session session, Node parentNode, CollectionDescriptor collectionDescriptor, Class collectionFieldClass) throws RepositoryException { + String jcrName = getCollectionJcrName(collectionDescriptor); + return !parentNode.hasProperty(jcrName); + } + + private void addUuidProperties(Session session, Node parentNode, + CollectionDescriptor collectionDescriptor, + ManageableMap manageableMap) + throws UnsupportedRepositoryOperationException, RepositoryException, VersionException, LockException, ConstraintViolationException { + try { + if (manageableMap == null) { + return; + } + + String jcrName = getCollectionJcrName(collectionDescriptor); + Value[] values = new Value[manageableMap.getSize()]; + ValueFactory valueFactory = session.getValueFactory(); + Map map = (Map) manageableMap.getObjects(); + Iterator keyIterator = map.keySet().iterator(); + + for (int i = 0; i < manageableMap.getSize(); i++) { + String key = (String) keyIterator.next(); + Object object = map.get(key); + if (object != null) { + ClassDescriptor classDescriptor = mapper.getClassDescriptorByClass(object.getClass()); + + FieldDescriptor fieldDescriptor = classDescriptor.getUuidFieldDescriptor(); + if (fieldDescriptor == null) { + throw new JcrMappingException("The bean doesn't have an uuid - classdescriptor : " + + classDescriptor.getClassName()); + } + + String uuid = (String) ReflectionUtils.getNestedProperty(object, fieldDescriptor.getFieldName()); + values[i] = valueFactory.createValue(MapReferenceValueEncoder.encodeKeyAndReference(key, uuid), PropertyType.STRING); + } + } + + parentNode.setProperty(jcrName, values); + + } + catch (Exception e) { + throw new ObjectContentManagerException("Cannot insert collection field : " + + collectionDescriptor.getFieldName() + + " of class " + + collectionDescriptor.getClassDescriptor().getClassName(), e); + } + } + +} \ No newline at end of file Added: jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/MapReferenceValueEncoder.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/MapReferenceValueEncoder.java?rev=697950&view=auto ============================================================================== --- jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/MapReferenceValueEncoder.java (added) +++ jackrabbit/trunk/jackrabbit-ocm/src/main/java/org/apache/jackrabbit/ocm/manager/collectionconverter/impl/MapReferenceValueEncoder.java Mon Sep 22 12:00:54 2008 @@ -0,0 +1,42 @@ +/* + * 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.jackrabbit.ocm.manager.collectionconverter.impl; + + +public class MapReferenceValueEncoder { + + private final static String PREFIX="OCM:"; + final static String KEY_TOKEN="MAPKEY:"; + final static String REFERENCE_TOKEN="MAPVALUE:"; + + public static String decodeKey(String encoded) + { + String[] splitted = encoded.split(PREFIX); + return splitted[1].replaceAll(KEY_TOKEN, ""); + } + + public static String decodeReference(String encoded) + { + String[] splitted = encoded.split(PREFIX); + return splitted[2].replaceAll(REFERENCE_TOKEN, ""); + } + + public static String encodeKeyAndReference(String key, String reference) + { + return PREFIX+KEY_TOKEN+key+PREFIX+REFERENCE_TOKEN+reference; + } +} Added: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/BeanReferenceMapConverterImplTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/BeanReferenceMapConverterImplTest.java?rev=697950&view=auto ============================================================================== --- jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/BeanReferenceMapConverterImplTest.java (added) +++ jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/BeanReferenceMapConverterImplTest.java Mon Sep 22 12:00:54 2008 @@ -0,0 +1,450 @@ +/* + * 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.jackrabbit.ocm.manager.collectionconverter; + +import junit.framework.Test; +import junit.framework.TestSuite; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.ocm.AnnotationTestBase; +import org.apache.jackrabbit.ocm.RepositoryLifecycleTestSetup; +import org.apache.jackrabbit.ocm.manager.ObjectContentManager; +import org.apache.jackrabbit.ocm.testmodel.collection.Main; +import org.apache.jackrabbit.ocm.testmodel.uuid.A; + +import javax.jcr.RepositoryException; + + +/** + * + * This test validates that the BeanReferenceMapConverterImpl can be used to annotate java.util.Map + * that contain beans stored as references. + * + * + * Map converter used to map reference/uuid property by key into a java.util.Map. + * + * + * @author Vincent Giguère + * + */ +public class BeanReferenceMapConverterImplTest extends AnnotationTestBase { + private final static Log log = LogFactory.getLog(BeanReferenceMapConverterImplTest.class); + + /** + *

Defines the test case name for junit.

+ * + * @param testName The test case name. + */ + public BeanReferenceMapConverterImplTest(String testName) throws Exception { + super(testName); + } + + public static Test suite() { + // All methods starting with "test" will be executed in the test suite. + return new RepositoryLifecycleTestSetup( + new TestSuite(BeanReferenceMapConverterImplTest.class)); + } + + + public void test_map_of_referenced_nodes_is_persisted_and_reloaded_properly() throws RepositoryException { + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + A secondA = new A(); + A thirdA = new A(); + + firstA.setPath("/references/a1"); + secondA.setPath("/references/a2"); + thirdA.setPath("/references/a3"); + + firstA.setStringData("the first"); + secondA.setStringData("the second"); + thirdA.setStringData("the third"); + + ocm.insert(firstA); + ocm.insert(secondA); + ocm.insert(thirdA); + + assertNotNull(firstA.getPath()); + assertNotNull(secondA.getPath()); + assertNotNull(thirdA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + secondA = (A) ocm.getObject(secondA.getPath()); + thirdA = (A) ocm.getObject(thirdA.getPath()); + + assertNotNull(firstA.getUuid()); + assertNotNull(secondA.getUuid()); + assertNotNull(thirdA.getUuid()); + + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", secondA); + main.getReferenceMap().put("keyThird", thirdA); + + + ocm.insert(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("Referenced objects in store were not retrieved.", 3, main.getReferenceMap().size()); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyFirst")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keySecond")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyThird")); + + + assertEquals("the first", main.getReferenceMap().get("keyFirst").getStringData()); + assertEquals("the second", main.getReferenceMap().get("keySecond").getStringData()); + assertEquals("the third", main.getReferenceMap().get("keyThird").getStringData()); + + } + + public void test_map_can_persist_and_restore_same_node_reference_under_multiple_keys() throws RepositoryException { + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + + firstA.setPath("/references/a1"); + + firstA.setStringData("the data"); + + ocm.insert(firstA); + + assertNotNull(firstA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + + assertNotNull(firstA.getUuid()); + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", firstA); + main.getReferenceMap().put("keyThird", firstA); + + + ocm.insert(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("Referenced objects in store were not retrieved.", 3, main.getReferenceMap().size()); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyFirst")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keySecond")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyThird")); + + + assertEquals("the data", main.getReferenceMap().get("keyFirst").getStringData()); + assertEquals("the data", main.getReferenceMap().get("keySecond").getStringData()); + assertEquals("the data", main.getReferenceMap().get("keyThird").getStringData()); + + + } + + + public void test_map_keys_are_stored_in_relation_to_referenced_node() throws RepositoryException { + + /** + * Make sure that the key to the map is not part of the referenced node. + * In the child node realm, using the @Field(id=true) works, but not with referenced nodes, as they can be referenced by many nodes. + */ + + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + A secondA = new A(); + A thirdA = new A(); + + firstA.setPath("/references/a1"); + secondA.setPath("/references/a2"); + thirdA.setPath("/references/a3"); + + firstA.setStringData("the first"); + secondA.setStringData("the second"); + thirdA.setStringData("the third"); + + ocm.insert(firstA); + ocm.insert(secondA); + ocm.insert(thirdA); + + assertNotNull(firstA.getPath()); + assertNotNull(secondA.getPath()); + assertNotNull(thirdA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + secondA = (A) ocm.getObject(secondA.getPath()); + thirdA = (A) ocm.getObject(thirdA.getPath()); + + assertNotNull(firstA.getUuid()); + assertNotNull(secondA.getUuid()); + assertNotNull(thirdA.getUuid()); + + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", secondA); + main.getReferenceMap().put("keyThird", thirdA); + + + Main main2 = new Main(); + main2.setPath("/test/2"); + main2.getReferenceMap().put("AnotherkeyFirst", firstA); + main2.getReferenceMap().put("AnotherkeySecond", secondA); + main2.getReferenceMap().put("AnotherkeyThird", thirdA); + + + ocm.insert(main); + ocm.insert(main2); + main = (Main) ocm.getObject(main.getPath()); + main2 = (Main) ocm.getObject(main2.getPath()); + + assertEquals("Referenced objects in store were not retrieved.", 3, main.getReferenceMap().size()); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyFirst")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keySecond")); + assertNotNull("Reference could not be retrieved by its original key", main.getReferenceMap().get("keyThird")); + + + assertEquals("Referenced objects in store were not retrieved.", 3, main2.getReferenceMap().size()); + assertNotNull("Reference could not be retrieved by its original key", main2.getReferenceMap().get("AnotherkeyFirst")); + assertNotNull("Reference could not be retrieved by its original key", main2.getReferenceMap().get("AnotherkeySecond")); + assertNotNull("Reference could not be retrieved by its original key", main2.getReferenceMap().get("AnotherkeyThird")); + + assertEquals("the first", main.getReferenceMap().get("keyFirst").getStringData()); + assertEquals("the second", main.getReferenceMap().get("keySecond").getStringData()); + assertEquals("the third", main.getReferenceMap().get("keyThird").getStringData()); + + assertEquals("the first", main2.getReferenceMap().get("AnotherkeyFirst").getStringData()); + assertEquals("the second", main2.getReferenceMap().get("AnotherkeySecond").getStringData()); + assertEquals("the third", main2.getReferenceMap().get("AnotherkeyThird").getStringData()); + + } + + public void test_converter_removes_deleted_nodes_when_updating() throws RepositoryException { + + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + A secondA = new A(); + A thirdA = new A(); + + firstA.setPath("/references/a1"); + secondA.setPath("/references/a2"); + thirdA.setPath("/references/a3"); + + firstA.setStringData("the first"); + secondA.setStringData("the second"); + thirdA.setStringData("the third"); + + ocm.insert(firstA); + ocm.insert(secondA); + ocm.insert(thirdA); + + assertNotNull(firstA.getPath()); + assertNotNull(secondA.getPath()); + assertNotNull(thirdA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + secondA = (A) ocm.getObject(secondA.getPath()); + thirdA = (A) ocm.getObject(thirdA.getPath()); + + assertNotNull(firstA.getUuid()); + assertNotNull(secondA.getUuid()); + assertNotNull(thirdA.getUuid()); + + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", secondA); + main.getReferenceMap().put("keyThird", thirdA); + + + ocm.insert(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 3, main.getReferenceMap().size()); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + + + assertEquals("DefaultMapConverterImpl failed to store objects in map", "the first", main.getReferenceMap().get("keyFirst").getStringData()); + assertEquals("DefaultMapConverterImpl failed to store objects in map", "the second", main.getReferenceMap().get("keySecond").getStringData()); + assertEquals("DefaultMapConverterImpl failed to store objects in map", "the third", main.getReferenceMap().get("keyThird").getStringData()); + + + main.getReferenceMap().remove("keyFirst"); + ocm.update(main); + main = (Main) ocm.getObject(main.getPath()); + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 2, main.getReferenceMap().size()); + assertNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + + } + + public void test_converter_adds_new_nodes_when_updating() throws RepositoryException { + + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + A secondA = new A(); + A thirdA = new A(); + + firstA.setPath("/references/a1"); + secondA.setPath("/references/a2"); + thirdA.setPath("/references/a3"); + + firstA.setStringData("the first"); + secondA.setStringData("the second"); + thirdA.setStringData("the third"); + + ocm.insert(firstA); + ocm.insert(secondA); + ocm.insert(thirdA); + + assertNotNull(firstA.getPath()); + assertNotNull(secondA.getPath()); + assertNotNull(thirdA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + secondA = (A) ocm.getObject(secondA.getPath()); + thirdA = (A) ocm.getObject(thirdA.getPath()); + + assertNotNull(firstA.getUuid()); + assertNotNull(secondA.getUuid()); + assertNotNull(thirdA.getUuid()); + + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", secondA); + + + + ocm.insert(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 2, main.getReferenceMap().size()); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + + + main.getReferenceMap().put("keyThird", thirdA); + ocm.update(main); + main = (Main) ocm.getObject(main.getPath()); + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 3, main.getReferenceMap().size()); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + } + + public void test_converter_can_add_and_remove_nodes_simultaneously_when_updating() throws RepositoryException { + + ObjectContentManager ocm = getObjectContentManager(); + + this.getSession().getRootNode().addNode("test"); + this.getSession().getRootNode().addNode("references"); + this.getSession().save(); + + A firstA = new A(); + A secondA = new A(); + A thirdA = new A(); + A fourthA = new A(); + + firstA.setPath("/references/a1"); + secondA.setPath("/references/a2"); + thirdA.setPath("/references/a3"); + fourthA.setPath("/references/a4"); + + firstA.setStringData("the first"); + secondA.setStringData("the second"); + thirdA.setStringData("the third"); + + ocm.insert(firstA); + ocm.insert(secondA); + ocm.insert(thirdA); + ocm.insert(fourthA); + + assertNotNull(firstA.getPath()); + assertNotNull(secondA.getPath()); + assertNotNull(thirdA.getPath()); + assertNotNull(fourthA.getPath()); + + firstA = (A) ocm.getObject(firstA.getPath()); + secondA = (A) ocm.getObject(secondA.getPath()); + thirdA = (A) ocm.getObject(thirdA.getPath()); + fourthA = (A) ocm.getObject(fourthA.getPath()); + + assertNotNull(firstA.getUuid()); + assertNotNull(secondA.getUuid()); + assertNotNull(thirdA.getUuid()); + assertNotNull(fourthA.getUuid()); + + + Main main = new Main(); + main.setPath("/test/1"); + main.getReferenceMap().put("keyFirst", firstA); + main.getReferenceMap().put("keySecond", secondA); + main.getReferenceMap().put("keyThird", thirdA); + + + + ocm.insert(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 3, main.getReferenceMap().size()); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + assertNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFourth")); + + + main.getReferenceMap().put("keyFourth", fourthA); + main.getReferenceMap().remove("keyFirst"); + ocm.update(main); + main = (Main) ocm.getObject(main.getPath()); + + assertEquals("DefaultMapConverterImpl failed to store or reload objects in map property: referencedMap", 3, main.getReferenceMap().size()); + assertNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFirst")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keySecond")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyThird")); + assertNotNull("DefaultMapConverterImpl failed to store objects in map", main.getReferenceMap().get("keyFourth")); + } +} Added: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/MapReferenceValueEncoderTest.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/MapReferenceValueEncoderTest.java?rev=697950&view=auto ============================================================================== --- jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/MapReferenceValueEncoderTest.java (added) +++ jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/manager/collectionconverter/MapReferenceValueEncoderTest.java Mon Sep 22 12:00:54 2008 @@ -0,0 +1,60 @@ +/* + * 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.jackrabbit.ocm.manager.collectionconverter; + +import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.MapReferenceValueEncoder; +import static junit.framework.Assert.assertEquals;import static junit.framework.Assert.assertTrue; +import junit.framework.TestCase; + +/** + * TODO: JAVADOC + *

+ * Created by Vincent Giguere + * Date: Jun 9, 2008 + * Time: 3:08:28 PM + */ +public class MapReferenceValueEncoderTest extends TestCase{ + + + public void testEncode_key_and_reference() + { + String key = "value1"; + String reference = "aReference"; + assertTrue(MapReferenceValueEncoder.encodeKeyAndReference(key, reference).contains(key)); + assertTrue(MapReferenceValueEncoder.encodeKeyAndReference(key, reference).contains(reference)); + + } + + + public void testDecode_key() + { + String key = "value1"; + String reference = "aReference"; + assertEquals(key , MapReferenceValueEncoder.decodeKey(MapReferenceValueEncoder.encodeKeyAndReference(key, reference))); + } + + + public void testDecode_reference() + { + String key = "value1"; + String reference = "aReference"; + assertEquals(reference , MapReferenceValueEncoder.decodeReference(MapReferenceValueEncoder.encodeKeyAndReference(key, reference))); + } + + +} Modified: jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/testmodel/collection/Main.java URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/testmodel/collection/Main.java?rev=697950&r1=697949&r2=697950&view=diff ============================================================================== --- jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/testmodel/collection/Main.java (original) +++ jackrabbit/trunk/jackrabbit-ocm/src/test/java/org/apache/jackrabbit/ocm/testmodel/collection/Main.java Mon Sep 22 12:00:54 2008 @@ -16,12 +16,15 @@ */ package org.apache.jackrabbit.ocm.testmodel.collection; +import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.jackrabbit.ocm.manager.collectionconverter.impl.BeanReferenceMapConverterImpl; import org.apache.jackrabbit.ocm.mapper.impl.annotation.Collection; import org.apache.jackrabbit.ocm.mapper.impl.annotation.Field; import org.apache.jackrabbit.ocm.mapper.impl.annotation.Node; +import org.apache.jackrabbit.ocm.testmodel.uuid.A; /** @@ -39,6 +42,9 @@ private HashMapElement hashMapElement; @Collection private Map map; + + @Collection(collectionConverter=BeanReferenceMapConverterImpl.class) + private Map referenceMap = new HashMap(); // 3 ways to implements a collection : @@ -122,6 +128,14 @@ public void setCustomList(CustomList customList) { this.customList = customList; } + public Map getReferenceMap() { + return referenceMap; + } + public void setReferenceMap(Map referenceMap) { + this.referenceMap = referenceMap; + } + + }