jmcnally 2002/09/22 23:15:41
Modified: src/java/org/apache/torque/om ComboKey.java
Added: src/test/org/apache/torque/om ComboKeyTest.java
Log:
ComboKey changes proposed by J. Russell Smyth to allow re-creation of a
ComboKey based on its String reprentation. The old version was broken.
So it was obviously not being used.
also some other minor cleanup of the code.
Revision Changes Path
1.8 +56 -99
jakarta-turbine-torque/src/java/org/apache/torque/om/ComboKey.java
Index: ComboKey.java
===================================================================
RCS file:
/home/cvs/jakarta-turbine-torque/src/java/org/apache/torque/om/ComboKey.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- ComboKey.java 16 Jul 2002 14:57:28 -0000 1.7
+++ ComboKey.java 23 Sep 2002 06:15:40 -0000 1.8
@@ -56,7 +56,6 @@
import java.util.ArrayList;
-import org.apache.torque.TorqueException;
import org.apache.commons.lang.ObjectUtils;
/**
@@ -66,6 +65,7 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">John McNally</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">J. Russell Smyth</a>
* @version $Id$
*/
public class ComboKey extends ObjectKey
@@ -82,11 +82,6 @@
*/
public static final String SEPARATOR_STRING = ":";
- private static final String ERROR_MSG =
- "This method cannot be used with an uninitialized ComboKey";
-
- private ArrayList tmpKeys;
- private StringBuffer sbuf;
private SimpleKey[] key;
/**
@@ -95,8 +90,6 @@
*/
public ComboKey()
{
- tmpKeys = new ArrayList(4);
- sbuf = new StringBuffer();
}
/**
@@ -105,80 +98,44 @@
*/
public ComboKey(SimpleKey[] keys)
{
- this();
setValue(keys);
}
/**
* Creates a compound ComboKey whose internal representation is a
* String array.
+ * @deprecated ambiguous unnecessary ctor will be removed.
*/
- public ComboKey(String[] keys) throws TorqueException
+ public ComboKey(String[] keys)
{
- this();
setValue(keys);
}
/**
* Sets the internal representation to a String array.
*/
- public ComboKey(String keys) throws TorqueException
+ public ComboKey(String keys)
{
- this();
setValue(keys);
}
/**
- * Sets the internal representation using an array of SimpleKeys.
+ * Sets the internal representation using a SimpleKey array.
*/
public void setValue(SimpleKey[] keys)
{
- if (this.key == null)
- {
- this.key = keys;
- }
- else
- {
- for (int i = 0; i < this.key.length; i++)
- {
- if (this.key[i] == null)
- {
- this.key[i] = keys[i];
- }
- }
- }
+ this.key = keys;
}
/**
* Sets the internal representation using a String array.
+ * @deprecated ambiguous unnecessary method will be removed.
*/
- public void setValue(String[] keys) throws TorqueException
+ public void setValue(String[] keys)
{
- if (this.key == null)
- {
- throw new TorqueException(ERROR_MSG);
- /*
- this.key = new SimpleKey[keys.length];
- for ( int i = 0; i < keys.length; i++ )
- {
- this.key[i] = new SimpleKey(keys[i]);
- }
- */
- }
- else
- {
- for (int i = 0; i < this.key.length; i++)
- {
- if (this.key[i] == null && keys[i] != null)
- {
- throw new TorqueException(ERROR_MSG);
- // this.key[i] = new SimpleKey( keys[i] );
- }
- else
- {
- this.key[i].setValue(keys[i]);
- }
- }
+ this.key = new SimpleKey[keys.length];
+ for ( int i = 0; i < keys.length; i++ ) {
+ this.key[i] = new StringKey(keys[i]);
}
}
@@ -186,55 +143,51 @@
* Sets the internal representation using a String of the
* form produced by the toString method.
*/
- public void setValue(String keys) throws TorqueException
+ public void setValue(String keys)
{
- int previousIndex = -1;
+ int startPtr = 0;
int indexOfSep = keys.indexOf(SEPARATOR);
+ ArrayList tmpKeys = new ArrayList();
while (indexOfSep != -1)
{
- if (indexOfSep == 0)
+ if (indexOfSep == startPtr)
{
tmpKeys.add(null);
}
- else if (indexOfSep > 0 && indexOfSep < keys.length() - 1)
+ else
{
- tmpKeys.add(keys.substring(previousIndex + 1, indexOfSep));
- }
- else if (indexOfSep == keys.length() - 1)
- {
- tmpKeys.add(null);
+ char keyType = keys.charAt(startPtr);
+ String keyString = keys.substring(startPtr + 1, indexOfSep);
+
+ SimpleKey newKey = null;
+ switch(keyType){
+ case 'N':
+ newKey = new NumberKey(keyString);
+ break;
+ case 'S':
+ newKey = new StringKey(keyString);
+ break;
+ case 'D':
+ try{
+ newKey = new DateKey(keyString);
+ }catch(NumberFormatException nfe){
+ newKey = new DateKey();
+ }
+ break;
+ default:
+ // unextepcted key type
+ }
+ tmpKeys.add(newKey);
}
- indexOfSep = keys.indexOf(SEPARATOR);
+ startPtr = indexOfSep + 1;
+ indexOfSep = keys.indexOf(SEPARATOR,startPtr);
}
- if (this.key == null)
+ this.key = new SimpleKey[tmpKeys.size()];
+ for ( int i = 0; i < this.key.length; i++ )
{
- throw new TorqueException(ERROR_MSG);
- /*
- this.key = new SimpleKey[tmpKeys.size()];
- for ( int i = 0; i < this.key.length; i++ )
- {
- this.key[i] = new SimpleKey( (String)tmpKeys.get(i) );
- }
- */
+ this.key[i] = (SimpleKey)tmpKeys.get(i);
}
- else
- {
- for (int i = 0; i < this.key.length; i++)
- {
- if (this.key[i] == null && tmpKeys.get(i) != null)
- {
- throw new TorqueException(ERROR_MSG);
- // this.key[i] = new SimpleKey( (String)tmpKeys.get(i) );
- }
- else
- {
- this.key[i].setValue((String) tmpKeys.get(i));
- }
- }
- }
-
- tmpKeys.clear();
}
public void setValue(ComboKey keys)
@@ -341,14 +294,21 @@
SimpleKey[] keys = (SimpleKey[]) key;
for (int i = 0; i < keys.length; i++)
{
- if (i != 0)
- {
- sb.append(SEPARATOR);
- }
if (keys[i] != null)
{
+ if(keys[i] instanceof StringKey){
+ sb.append("S");
+ }else if(keys[i] instanceof NumberKey){
+ sb.append("N");
+ }else if(keys[i] instanceof DateKey){
+ sb.append("D");
+ }else{ // unknown type
+ sb.append("U");
+ }
keys[i].appendTo(sb);
}
+ // MUST BE ADDED AFTER EACH KEY, IN CASE OF NULL KEY!
+ sb.append(SEPARATOR);
}
}
}
@@ -382,10 +342,7 @@
*/
public String toString()
{
- if (sbuf.length() > 0)
- {
- sbuf.delete(0, sbuf.length());
- }
+ StringBuffer sbuf = new StringBuffer();
appendTo(sbuf);
return sbuf.toString();
}
1.1
jakarta-turbine-torque/src/test/org/apache/torque/om/ComboKeyTest.java
Index: ComboKeyTest.java
===================================================================
package org.apache.torque.om;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Turbine" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Turbine", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
import java.util.ArrayList;
import junit.framework.*;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.apache.torque.TorqueException;
import org.apache.commons.lang.ObjectUtils;
/**
* TestCase for ComboKey
*
* @author <a href="mailto:[EMAIL PROTECTED]">J. Russell Smyth</a>
* @version $Revision: 1.1 $
*/
public class ComboKeyTest extends TestCase
{
private ComboKey c1a = new ComboKey(
new SimpleKey[]{new StringKey("key1"),new StringKey("key2")});
private ComboKey c1b = new ComboKey(
new SimpleKey[]{new StringKey("key1"),new StringKey("key2")});
private ComboKey c1c = new ComboKey(new String[]{"key1","key2"});
private ComboKey c2a = new ComboKey(
new SimpleKey[]{new StringKey("key3"),new StringKey("key4")});
// complex keys for test
private java.util.Date now = new java.util.Date();
private ComboKey c3a = new ComboKey(
new SimpleKey[]{new StringKey("key1"),null,new DateKey(now)});
private ComboKey c3b = new ComboKey(new SimpleKey[]{
new StringKey("key1"),null,new DateKey(now)});
private ComboKey c4a = new ComboKey(
new SimpleKey[]{new StringKey("key1"),null,new NumberKey(123456)});
/**
* Simple constructor.
*
* @param name the name of the test to execute
*/
public ComboKeyTest(String name)
{
super(name);
}
public static void main(java.lang.String[] args)
{
junit.textui.TestRunner.run(suite());
}
public static Test suite()
{
TestSuite suite = new TestSuite(ComboKeyTest.class);
return suite;
}
public void testReflexive()
{
Assert.assertTrue(c1a.equals(c1a));
// Complex key using null and date
// This currently has to use looseEquals as ComboKey.equals(Obj)
// does not accept null key values (WHY!)
Assert.assertTrue(c3a.looseEquals(c3a));
}
// public void testReflexiveWithNullKeyValue()
// {
// Assert.assertTrue(c3a.equals(c3a));
// }
public void testSymmetric()
{
Assert.assertTrue(c1a.equals(c1b));
Assert.assertTrue(c1b.equals(c1a));
}
public void testNull()
{
Assert.assertTrue(!c1a.equals(null));
}
public void testNotEqual()
{
Assert.assertTrue(!c1a.equals(c2a));
}
public void testRoundTripWithStringKeys(){
// two strings
ComboKey oldKey = new ComboKey(
new SimpleKey[]{new StringKey("key1"),new StringKey("key2")});
ComboKey newKey = null;
String stringValue = oldKey.toString();
System.out.println("OldKey as String="+stringValue);
try
{
newKey = new ComboKey(stringValue);
}
catch(Exception e)
{
fail("Exception "+e.getClass().getName()+
" thrown on new ComboKey("+stringValue+"):"+e.getMessage());
}
Assert.assertEquals(oldKey,newKey);
}
public void testRoundTripWithComplexKey(){
// complex key
ComboKey oldKey = new ComboKey(
new SimpleKey[]{new StringKey("key1"), new NumberKey(12345),
new DateKey(new java.util.Date())});
ComboKey newKey = null;
String stringValue = oldKey.toString();
System.out.println("OldKey as String="+stringValue);
try
{
newKey = new ComboKey(stringValue);
}
catch(Exception e)
{
fail("Exception "+e.getClass().getName()+" thrown on new ComboKey("
+stringValue+"):"+e.getMessage());
}
Assert.assertEquals(oldKey,newKey);
}
public void testRoundTripWithNullKey()
{
// with null key
ComboKey oldKey = new ComboKey(
new SimpleKey[]{new StringKey("key1"),null});
ComboKey newKey = null;
String stringValue = oldKey.toString();
System.out.println("OldKey as String="+stringValue);
try
{
newKey = new ComboKey(stringValue);
}
catch(Exception e)
{
fail("Exception "+e.getClass().getName()+" thrown on new ComboKey("
+stringValue+"):"+e.getMessage());
}
// This currently has to use looseEquals as ComboKey.equals(Obj)
// does not accept null key values (WHY!)
Assert.assertTrue(oldKey.looseEquals(newKey));
}
/** Test of appendTo method, of class org.apache.torque.om.ComboKey. */
public void testAppendTo()
{
StringBuffer sb = new StringBuffer();
c1a.appendTo(sb);
Assert.assertEquals("Skey1:Skey2:",sb.toString());
}
/** Test of toString method, of class org.apache.torque.om.ComboKey. */
public void testToString()
{
Assert.assertEquals("Skey1::N123456:",c4a.toString());
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>