Author: tfischer Date: Wed Apr 9 20:35:11 2014 New Revision: 1586133 URL: http://svn.apache.org/r1586133 Log: TORQUE-315: fix setAndSave so it also works if the cached collection from the object is passed in or the cached collection does not represent the state in the database.
Added: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/resetterReferencingObject.vm Modified: db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/TemplateOptionName.java db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/FieldHelper.java db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/JavaFieldAttributeName.java db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/OMForeignKeyTransformer.java db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/conf/options.properties db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/referencingObjectMethods.vm db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/peer/SetAndSaveTest.java Modified: db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/TemplateOptionName.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/TemplateOptionName.java?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/TemplateOptionName.java (original) +++ db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/TemplateOptionName.java Wed Apr 9 20:35:11 2014 @@ -90,6 +90,12 @@ public enum TemplateOptionName implement /** The name of the option for the suffix of the adder methods. */ OM_ADDER_SUFFIX("torque.om.complexObjectModel.adderSuffix"), + /** The name of the option for the prefix of the resetter methods. */ + OM_RESETTER_PREFIX("torque.om.complexObjectModel.resetterPrefix"), + + /** The name of the option for the suffix of the resetter methods. */ + OM_RESETTER_SUFFIX("torque.om.complexObjectModel.resetterSuffix"), + /** The name of the option for the prefix of the initializer methods. */ OM_INITIALIZER_PREFIX("torque.om.complexObjectModel.initializerPrefix"), Modified: db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/FieldHelper.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/FieldHelper.java?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/FieldHelper.java (original) +++ db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/FieldHelper.java Wed Apr 9 20:35:11 2014 @@ -58,9 +58,9 @@ final class FieldHelper * @return the getter method name, not null. */ public static String getGetterName( - String fieldName, - String fieldType, - ControllerState controllerState) + final String fieldName, + final String fieldType, + final ControllerState controllerState) { String getterName; if (controllerState.getBooleanOption( @@ -84,7 +84,7 @@ final class FieldHelper * * @return the setter method name, not null. */ - public static String getSetterName(String fieldName) + public static String getSetterName(final String fieldName) { String setterName = SET + StringUtils.capitalize(fieldName); return setterName; @@ -98,7 +98,7 @@ final class FieldHelper * * @return the field name, not null. */ - public static String getFieldNameFromSetterName(String setterName) + public static String getFieldNameFromSetterName(final String setterName) { String fieldName = StringUtils.uncapitalize( setterName.substring(SET.length())); @@ -114,8 +114,8 @@ final class FieldHelper * @return the adder method name, not null. */ public static String getAdderName( - String fieldName, - ControllerState controllerState) + final String fieldName, + final ControllerState controllerState) { String adderName = controllerState.getOption( @@ -127,6 +127,27 @@ final class FieldHelper } /** + * Returns the name of the resetter method for a field. + * + * @param fieldName the name of the field, not null. + * @param controllerState the current controller state, not null. + * + * @return the resetter method name, not null. + */ + public static String getResetterName( + final String fieldName, + final ControllerState controllerState) + { + String adderName + = controllerState.getOption( + TemplateOptionName.OM_RESETTER_PREFIX) + + StringUtils.capitalize(fieldName) + + controllerState.getOption( + TemplateOptionName.OM_RESETTER_SUFFIX); + return adderName; + } + + /** * Returns the name of the initializer method for a field. * * @param fieldName the name of the field, not null. @@ -135,8 +156,8 @@ final class FieldHelper * @return the initializer method name, not null. */ public static String getInitializerName( - String fieldName, - ControllerState controllerState) + final String fieldName, + final ControllerState controllerState) { String initializerName = controllerState.getOption( @@ -156,8 +177,8 @@ final class FieldHelper * @return the isInitialized method name, not null. */ public static String getIsInitializedName( - String fieldName, - ControllerState controllerState) + final String fieldName, + final ControllerState controllerState) { String initializerName = controllerState.getOption( @@ -179,9 +200,9 @@ final class FieldHelper * @return the filler method name, not null. */ public static String getFillerName( - String fieldName, - String distinctionPart, - ControllerState controllerState) + final String fieldName, + final String distinctionPart, + final ControllerState controllerState) { String fillerName = controllerState.getOption( @@ -204,9 +225,9 @@ final class FieldHelper * @return the setAndSave method name, not null. */ public static String getSetAndSaveMethodName( - String fieldName, - String distinctionPart, - ControllerState controllerState) + final String fieldName, + final String distinctionPart, + final ControllerState controllerState) { String fillerName = controllerState.getOption( Modified: db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/JavaFieldAttributeName.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/JavaFieldAttributeName.java?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/JavaFieldAttributeName.java (original) +++ db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/JavaFieldAttributeName.java Wed Apr 9 20:35:11 2014 @@ -91,6 +91,12 @@ public enum JavaFieldAttributeName imple ADDER_NAME("adder"), /** + * In case the field is a collection: + * The name of the method used to reset (null) the collection. + */ + RESETTER_NAME("resetter"), + + /** * In case the field can be filled somehow: * The name of the method used to fill the field. */ Modified: db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/OMForeignKeyTransformer.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/OMForeignKeyTransformer.java?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/OMForeignKeyTransformer.java (original) +++ db/torque/torque4/trunk/torque-templates/src/main/java/org/apache/torque/templates/transformer/om/OMForeignKeyTransformer.java Wed Apr 9 20:35:11 2014 @@ -230,6 +230,14 @@ public class OMForeignKeyTransformer adderName); } { + String adderName = FieldHelper.getResetterName( + getterSetterFieldName, + controllerState); + foreignFieldElement.setAttribute( + JavaFieldAttributeName.RESETTER_NAME, + adderName); + } + { String initializerName = FieldHelper.getInitializerName( getterSetterFieldName, controllerState); Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/conf/options.properties URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/conf/options.properties?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/conf/options.properties (original) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/conf/options.properties Wed Apr 9 20:35:11 2014 @@ -144,6 +144,13 @@ torque.om.complexObjectModel.foreignFiel torque.om.complexObjectModel.adderPrefix = add torque.om.complexObjectModel.adderSuffix = +# Prefix and Suffix for the resetter method on the "local" side of the fk +# Method name is ${prefix}${referencedObjectClass}${suffix} +# If necessary ${torque.om.complexObjectModel.localFieldNameRelatedBy} +# followed by the column names is appended to this. +torque.om.complexObjectModel.resetterPrefix = reset +torque.om.complexObjectModel.resetterSuffix = + # Prefix and Suffix for the initializer method on the "local" side of the fk # Method name is ${prefix}${referencedObjectClass}${suffix} # If necessary ${torque.om.complexObjectModel.localFieldNameRelatedBy} Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml (original) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml Wed Apr 9 20:35:11 2014 @@ -352,6 +352,10 @@ <action xsi:type="applyAction" outlet="torque.om.dbObject.base.adderReferencingObject"/> </mergepoint> + <mergepoint name="resetter"> + <action xsi:type="applyAction" + outlet="torque.om.dbObject.base.resetterReferencingObject"/> + </mergepoint> <mergepoint name="initializer"> <action xsi:type="applyAction" outlet="torque.om.dbObject.base.initializerReferencingObject"/> @@ -381,6 +385,11 @@ path="dbObject/base/adderReferencingObject.vm"> </outlet> + <outlet name="torque.om.dbObject.base.resetterReferencingObject" + xsi:type="velocityOutlet" + path="dbObject/base/resetterReferencingObject.vm"> + </outlet> + <outlet name="torque.om.dbObject.base.initializerReferencingObject" xsi:type="velocityOutlet" path="dbObject/base/initializerReferencingObject.vm"> Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/referencingObjectMethods.vm URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/referencingObjectMethods.vm?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/referencingObjectMethods.vm (original) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/referencingObjectMethods.vm Wed Apr 9 20:35:11 2014 @@ -31,6 +31,7 @@ $torqueGen.mergepoint("initializer") $torqueGen.mergepoint("isInitialized") $torqueGen.mergepoint("adder") +$torqueGen.mergepoint("resetter") #end $torqueGen.mergepoint("getter") #if ($objectIsCaching) Added: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/resetterReferencingObject.vm URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/resetterReferencingObject.vm?rev=1586133&view=auto ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/resetterReferencingObject.vm (added) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/resetterReferencingObject.vm Wed Apr 9 20:35:11 2014 @@ -0,0 +1,41 @@ +## 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. +## +###### +## +## version $Id: adderReferencingObject.vm 1331196 2012-04-27 02:56:12Z tfischer $ +## +## This template creates the resetter method in the object for the "foreign" part +## of a foreign key. +## The template expects as input a "foreign-field" element inside a +## "foreign-key" element from the torque schema, which was generated +## by the OMTransformer. +## +#set ( $foreignKeyElement = $torqueGen.getParent() ) +#set ( $localTableElement = $foreignKeyElement.getChild("table") ) +#set ( $localClassName = $localTableElement.getAttribute("dbObjectClassName") ) +#set ( $foreignKeyLocalFieldElement = $foreignKeyElement.getChild("local-field") ) +#set ( $foreignKeyLocalColumnSetter = $foreignKeyLocalFieldElement.getAttribute("setter")) + /** + * Method called to reset the cache of $fieldContainedType objects + * which are related through the $field foreign key attribute. + */ + public void ${resetter}() + { + $field = null; + } + Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm (original) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm Wed Apr 9 20:35:11 2014 @@ -128,6 +128,10 @@ Connection connection) throws TorqueException { + // make sure the collection cache in toLinkTo represents the current + // database state + toLinkTo.${resetter}(); + toLinkTo.${getter}(connection); #if ($referencesPrimaryKey) ObjectKey localKey = toLinkTo.getPrimaryKey(); #else @@ -182,6 +186,9 @@ toSaveKeys.add(toSaveKey); } } + + // calculate intersection between objects in the database + // and objects in the list List<${foreignDbObjectClassName}> intersection; if (toSaveKeys.isEmpty()) { Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/peer/SetAndSaveTest.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/peer/SetAndSaveTest.java?rev=1586133&r1=1586132&r2=1586133&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/peer/SetAndSaveTest.java (original) +++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/peer/SetAndSaveTest.java Wed Apr 9 20:35:11 2014 @@ -24,6 +24,7 @@ import java.util.List; import org.apache.torque.BaseDatabaseTestCase; import org.apache.torque.ForeignKeySchemaData; +import org.apache.torque.TorqueException; import org.apache.torque.test.dbobject.CompIntegerVarcharFk; import org.apache.torque.test.dbobject.CompIntegerVarcharPk; import org.apache.torque.test.dbobject.CompPkContainsFk; @@ -151,6 +152,47 @@ public class SetAndSaveTest extends Base oIntegerPk, fkList); + assertSetAndSaveForOIntegerPk(testData, oIntegerPk, newNonPkOIntegerFk); + } + + /** + * Tests whether the setAndSave method works + * where the collection is euql to the cached list of the object. + * + * @throws Exception if the test fails + */ + public void testSetAndSaveCachedCollection() throws Exception + { + ForeignKeySchemaData.clearTablesInDatabase(); + ForeignKeySchemaData testData + = ForeignKeySchemaData.getDefaultTestData(); + testData.save(); + + OIntegerPk oIntegerPk = testData.getOIntegerPkList().get(0); + List<NonPkOIntegerFk> fkList = oIntegerPk.initNonPkOIntegerFks(); + fkList.clear(); + // object already associated to this object + fkList.add(testData.getNonPkOIntegerFkList().get(1)); + // object already associated to another object + fkList.add(testData.getNonPkOIntegerFkList().get(2)); + // object not associated yet + fkList.add(testData.getNonPkOIntegerFkList().get(3)); + // new object + NonPkOIntegerFk newNonPkOIntegerFk = new NonPkOIntegerFk(); + newNonPkOIntegerFk.setName("newNonPkOIntegerFk"); + fkList.add(newNonPkOIntegerFk); + + OIntegerPkPeer.setAndSaveNonPkOIntegerFks( + oIntegerPk, + fkList); + + assertSetAndSaveForOIntegerPk(testData, oIntegerPk, newNonPkOIntegerFk); + } + + private void assertSetAndSaveForOIntegerPk(final ForeignKeySchemaData testData, + final OIntegerPk oIntegerPk, final NonPkOIntegerFk newNonPkOIntegerFk) + throws TorqueException + { List<NonPkOIntegerFk> cachedFks = oIntegerPk.getNonPkOIntegerFks(); assertEquals(4, cachedFks.size()); --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscr...@db.apache.org For additional commands, e-mail: torque-dev-h...@db.apache.org