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]>

Reply via email to