]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-425: Split off base ID generator.
authorAron Roberts <aron@socrates.berkeley.edu>
Thu, 10 Sep 2009 19:10:19 +0000 (19:10 +0000)
committerAron Roberts <aron@socrates.berkeley.edu>
Thu, 10 Sep 2009 19:10:19 +0000 (19:10 +0000)
services/id/service/src/main/java/org/collectionspace/services/id/BaseIDGenerator.java
services/id/service/src/main/java/org/collectionspace/services/id/IDGenerator.java
services/id/service/src/main/java/org/collectionspace/services/id/IDGeneratorSerializer.java
services/id/service/src/main/java/org/collectionspace/services/id/IDServiceJdbcImpl.java
services/id/service/src/main/java/org/collectionspace/services/id/SettableIDGenerator.java [new file with mode: 0644]
services/id/service/src/main/java/org/collectionspace/services/id/YearIDGeneratorPart.java
services/id/service/src/test/java/org/collectionspace/services/id/test/BaseIDGeneratorTest.java [moved from services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorTest.java with 55% similarity]
services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorSerializerTest.java
services/id/service/src/test/java/org/collectionspace/services/id/test/IDServiceJdbcImplTest.java
services/id/service/src/test/java/org/collectionspace/services/id/test/SettableIDGeneratorTest.java [new file with mode: 0644]

index fbad490f29a5efeefef987434344cae179abb82c..414de729d157238deacd0a420ce227584b5b7350 100644 (file)
@@ -21,9 +21,9 @@
  * limitations under the License.
  */
 
-// @TODO: Add Javadoc comments
+// @TODO Add Javadoc comments
 
-// @TODO: Catch Exceptions thrown by IDGeneratorPart, then
+// @TODO Catch Exceptions thrown by IDGeneratorPart, then
 // reflect this in the corresponding BaseIDGeneratorTest class.
 
 package org.collectionspace.services.id;
@@ -45,10 +45,10 @@ import java.util.regex.Pattern;
  */
 public class BaseIDGenerator implements IDGenerator {
 
-    private String csid = "";
-    private String uri = "";
-    private String description = "";
-    private Vector<IDGeneratorPart> parts = new Vector<IDGeneratorPart>();
+    protected String csid = "";
+    protected String uri = "";
+    protected String description = "";
+    protected Vector<IDGeneratorPart> parts = new Vector<IDGeneratorPart>();
 
     final static int MAX_ID_LENGTH = 50;
     
@@ -83,6 +83,8 @@ public class BaseIDGenerator implements IDGenerator {
 
     /**
      * Returns the CollectionSpace ID (CSID) identifying this ID generator.
+     *
+     * @return  A CollectionSpace ID (CSID) identifying this ID generator.
      */
     public String getCsid() {
         return this.csid;
@@ -90,7 +92,7 @@ public class BaseIDGenerator implements IDGenerator {
 
     /**
      * Sets a URI as a second type of identifier for this ID generator,
-     * in addition to the CollectionSpace ID (CSID).
+     * in addition to its CollectionSpace ID (CSID).
      *
      * @param uriStr A String representation of a URI.
      */
@@ -109,8 +111,12 @@ public class BaseIDGenerator implements IDGenerator {
     }
 
     /**
-     * Returns the URI, if any, that is used as a second type of
-     * identifier for this ID generator.
+     * Returns a String representation of the URI, if any,
+     * that is used as a second type of identifier for this
+     * ID generator, in addition to its CollectionSpace ID (CSID).
+     *
+     * @return  A String representation of the URI identifying this
+     *          ID generator.
      */
     public String getURI() {
         return this.uri;
@@ -129,6 +135,8 @@ public class BaseIDGenerator implements IDGenerator {
 
     /**
      * Returns the human-readable description of this ID generator, if any.
+     *
+     * @return  description  A human-readable description of this ID generator.
      */
     public String getDescription() {
         return this.description;
@@ -160,131 +168,7 @@ public class BaseIDGenerator implements IDGenerator {
         }
         return sb.toString();
     }
-
-
-/*
-    @Override
-    public String newID() {
-        StringBuffer sb = new StringBuffer(MAX_ID_LENGTH);
-        int lastPart = parts.size() - 1;
-        int i = 0;
-        for (IDGeneratorPart part : this.parts) {
-            if (i == lastPart){
-                sb.append(part.newID());
-            } else {
-                sb.append(part.getCurrentID());
-            }
-            i++;
-        }
-        return sb.toString();
-    }
-*/
-
-    // Returns the current value of this ID, given a
-    // supplied ID that partly matches the pattern.
-    //
-    // If the supplied ID fully matches the pattern,
-    // will return the supplied ID.
-    //
-    // However, if the supplied ID is a partial ID, which
-    // partly "stem-matches" the pattern but does not
-    // ully match the pattern, will return the partial ID with
-    // its next ID component appended.  The next ID component
-    // will be set to its initial value.
-    //
-    // Examples:
-    // * 2009.5." becomes "2009.5.1", in a case where the
-    //   next ID component is an incrementing numeric IDGeneratorPart.
-    // * "E55-" becomes "E55-a", where the next ID component
-    //   is an incrementing alphabetic IDGeneratorPart.
-    public String getCurrentID(String value)
-        throws IllegalArgumentException {
-
-      if (value == null) return value;
-      
-      // Try ever-larger stem matches against the supplied value,
-      // by incrementally appending each part's regex, until no
-      // (more) matches are found.
-      //
-      // In so doing, build a subset of this BaseIDGenerator's regex
-      // that fully matches the supplied value.
-      Pattern pattern = null;
-      Matcher matcher = null;
-      int matchedParts = 0;
-      StringBuffer regexToTry = new StringBuffer();
-      StringBuffer regex = new StringBuffer();
-      for (IDGeneratorPart partToTryMatching : this.parts) {
-          regexToTry.append(partToTryMatching.getRegex());
-          pattern = Pattern.compile(regexToTry.toString());
-            matcher = pattern.matcher(value);
-            // If a stem match was found on the current regex,
-            // store a count of matched IDGeneratorParts and the regex pattern
-            // that has matched to this point.
-            if (matcher.lookingAt()) {
-                matchedParts++;
-              regex.append(partToTryMatching.getRegex());
-            // Otherwise, exit the loop.
-            } else {
-                break;
-            }
-        }
-
-        // If the supplied ID doesn't partly match the pattern,
-        // throw an Exception.
-        if (matchedParts == 0) {
-            throw new IllegalArgumentException("Supplied ID does not match this ID pattern.");
-        }
-
-        pattern = Pattern.compile(regex.toString());
-        matcher = pattern.matcher(value);
-        
-        // If the supplied ID doesn't match the pattern built above,
-        // throw an Exception.  (This error condition should likely
-        // never be reached, but it's here as a guard.)
-        if (! matcher.matches()) {
-            throw new IllegalArgumentException("Supplied ID does not match this ID pattern.");
-        }
-        
-        // Otherwise, if the supplied ID matches the pattern,
-        // split the ID into its components and store those
-        // values in each of the pattern's IDGeneratorParts.
-        IDGeneratorPart currentPart;
-        for (int i = 1; i <= matchedParts; i++) {
-            currentPart = this.parts.get(i - 1);
-            currentPart.setCurrentID(matcher.group(i));
-        }
-
-        // Obtain the initial value of the next IDGeneratorPart, and
-        // set the current value of that part to its initial value.
-        //
-        // If the supplied ID fully matches the pattern, there will
-        // be no 'next' IDGeneratorPart, and we must catch that Exception below. 
-        int nextPartNum = matchedParts;
-        try {
-            // String initial = this.parts.get(nextPartNum).getInitialID();
-            // this.parts.get(nextPartNum).setCurrentID(initial);
-            String currentID = this.parts.get(nextPartNum).getCurrentID();
-            // Increment the number of matched parts to reflect the
-            // addition of this next IDGeneratorPart.
-            matchedParts++;
-        } catch (ArrayIndexOutOfBoundsException e ) {
-            // Do nothing here; we simply won't increment
-            // the number of matched parts, used in the loop below.
-        }
-        
-        // Call the getCurrentID() method on each of the
-        // supplied IDGeneratorParts, as well as on the added IDGeneratorPart
-        // whose initial value was just obtained, if any.
-        StringBuffer sb = new StringBuffer();
-        for (int i = 1; i <= matchedParts; i++) {
-            sb.append(this.parts.get(i - 1).getCurrentID());
-        }
-        
-        return sb.toString();
-
-    }
-
-    // Returns the next value of this ID, and sets the current value to that ID.
+    
     @Override
     public String newID() throws IllegalStateException {
     
@@ -304,54 +188,6 @@ public class BaseIDGenerator implements IDGenerator {
         
     }
 
-
-    // Returns the new value of this ID, given a
-    // supplied ID that entirely matches the pattern,
-    // and sets the current value to that ID.
-    public String newID(String value)
-        throws IllegalStateException, IllegalArgumentException {
-
-        if (value == null) { 
-            throw new IllegalArgumentException("Supplied ID cannot be null.");
-        }
-        
-        Pattern pattern = Pattern.compile(getRegex());
-        Matcher matcher = pattern.matcher(value);
-        
-        // If the supplied ID doesn't entirely match the pattern,
-        // throw an Exception.
-        if (! matcher.matches()) {
-            throw new IllegalArgumentException(
-                "Supplied ID does not match this ID pattern.");
-        }
-        
-        // Otherwise, if the supplied ID entirely matches the pattern,
-        // split the ID into its components and store those values in
-        // each of the pattern's IDGeneratorParts.
-        IDGeneratorPart currentPart;
-        for (int i = 1; i <= (matcher.groupCount() - 1); i++) {
-            currentPart = this.parts.get(i - 1);
-            currentPart.setCurrentID(matcher.group(i));
-        }
-        
-        // @TODO This code is duplicated in newID(), above,
-        // and thus we may want to refactor this.
-        int lastPartNum = this.parts.size();
-        StringBuffer sb = new StringBuffer(MAX_ID_LENGTH);
-        int i = 0;
-        for (IDGeneratorPart part : this.parts) {
-               i++;
-               if (i < lastPartNum) {
-               sb.append(part.getCurrentID());
-               } else {
-                       sb.append(part.newID());
-               }
-        }
-        
-        return sb.toString();
-        
-    }
-    
  
     @Override
     public boolean isValidID(String id) {
@@ -373,7 +209,9 @@ public class BaseIDGenerator implements IDGenerator {
       */
     public boolean isValidID(String id, String regex) {
     
-        if (id == null) return false;
+        if (id == null) {
+            return false;
+        }
  
         // @TODO May potentially throw at least one pattern-related exception.
         // We'll need to catch and handle this here, as well as in all
index b8d733f66def84595277c4d60de06fecd65ff8be..e6417b4cbde683f8c3740eb285d90185d0a15cbe 100644 (file)
@@ -32,25 +32,18 @@ package org.collectionspace.services.id;
 public interface IDGenerator {
 
     /**
-     * Returns a new ID.
+     * Returns the current ID.
      *
-     * @return  A new ID.
+     * @return  The current ID.
      */
-       public String newID();
+       public String getCurrentID();
 
     /**
-     * Returns a new ID, based on a supplied identifier.
+     * Returns a new ID.
      *
      * @return  A new ID.
      */
-       public String newID(String id);
-       
-    /**
-     * Returns the current ID.
-     *
-     * @return  The current ID.
-     */
-       public String getCurrentID();
+       public String newID();
 
     /**
      * Validates a supplied ID against the format of the IDs
index fcb95a3528231415ec9362884fd7bbfe518ed273..eb14b3008666171d77a94d851881b48c0abafdff 100644 (file)
@@ -55,7 +55,7 @@ public class IDGeneratorSerializer {
    *
    * @throws  IllegalArgumentException if the ID generator cannot be serialized.
    */
-       public static String serialize(BaseIDGenerator generator)
+       public static String serialize(SettableIDGenerator generator)
            throws IllegalArgumentException {
        
          if (generator == null) {
@@ -87,7 +87,7 @@ public class IDGeneratorSerializer {
    *
    * @throws  IllegalArgumentException if the ID generator cannot be deserialized.
    */
-       public static BaseIDGenerator deserialize(String serializedGenerator)
+       public static SettableIDGenerator deserialize(String serializedGenerator)
          throws IllegalArgumentException {
 
          if (serializedGenerator == null || serializedGenerator.equals("")) {
@@ -96,9 +96,9 @@ public class IDGeneratorSerializer {
 
     XStream xstream = new XStream(new DomDriver());
 
-    BaseIDGenerator generator;
+    SettableIDGenerator generator;
     try {
-      generator = (BaseIDGenerator) xstream.fromXML(serializedGenerator);
+      generator = (SettableIDGenerator) xstream.fromXML(serializedGenerator);
     } catch (XStreamException e) {
            throw new IllegalArgumentException(
              "Could not understand or parse this representation of an ID generator.");
index 93d9ad698090180ee2f90cd7258f4255e8f31bcc..68e07065fcc1e62d16995c57b546100a1ec98738 100644 (file)
@@ -51,7 +51,7 @@
 // @TODO Handle concurrency.
 //
 // Right now, with each new request we're simply instantiating
-// a new BaseIDGenerator and returning its next ID.  As a result,
+// a new SettableIDGenerator and returning its next ID.  As a result,
 // the generated IDs may well duplicate other, previously-generated IDs.
 //
 // When we start storing ID generators and IDs in a database,
@@ -302,7 +302,7 @@ public class IDServiceJdbcImpl implements IDService {
                                "ID generator " + "\'" + csid + "\'" + " could not be found.");
                }
                
-               BaseIDGenerator generator;
+               SettableIDGenerator generator;
                try {
                        generator = IDGeneratorSerializer.deserialize(serializedGenerator);
                } catch (IllegalArgumentException e) {
@@ -477,10 +477,10 @@ public class IDServiceJdbcImpl implements IDService {
        *
        * @throws  IllegalStateException if a storage-related error occurred.
        */
-       public void addIDGenerator(String csid, BaseIDGenerator generator)
+       public void addIDGenerator(String csid, SettableIDGenerator generator)
          throws IllegalArgumentException, IllegalStateException {
        
-               logger.debug("> in addIDGenerator(String, BaseIDGenerator)");
+               logger.debug("> in addIDGenerator(String, SettableIDGenerator)");
        
                // @TODO: Add checks for authorization to perform this operation.
                
@@ -617,10 +617,10 @@ public class IDServiceJdbcImpl implements IDService {
        *
        * @throws  IllegalStateException if a storage-related error occurred.
        */
-       public void updateIDGenerator(String csid, BaseIDGenerator generator)
+       public void updateIDGenerator(String csid, SettableIDGenerator generator)
          throws IllegalArgumentException, IllegalStateException {
        
-               logger.debug("> in updateIDGenerator(String, BaseIDGenerator)");
+               logger.debug("> in updateIDGenerator(String, SettableIDGenerator)");
        
                // @TODO: Add checks for authorization to perform this operation.
        
@@ -701,7 +701,7 @@ public class IDServiceJdbcImpl implements IDService {
                                   "last_generated_id = ? " + 
                                  "WHERE id_generator_csid = ?";
                                  
-                               BaseIDGenerator generator;
+                               SettableIDGenerator generator;
                                try {
                                        generator = IDGeneratorSerializer.deserialize(serializedGenerator);
                                } catch (IllegalArgumentException e) {
@@ -893,7 +893,7 @@ public class IDServiceJdbcImpl implements IDService {
                        }
                }
                
-               logger.debug("> retrieved BaseIDGenerator: " + serializedGenerator);
+               logger.debug("> retrieved SettableIDGenerator: " + serializedGenerator);
                
                return serializedGenerator;
        
diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/SettableIDGenerator.java b/services/id/service/src/main/java/org/collectionspace/services/id/SettableIDGenerator.java
new file mode 100644 (file)
index 0000000..3ba753a
--- /dev/null
@@ -0,0 +1,238 @@
+/**
+ * This document is a part of the source code and related artifacts
+ * for CollectionSpace, an open source collections management system
+ * for museums and related institutions:
+ *
+ * http://www.collectionspace.org
+ * http://wiki.collectionspace.org
+ *
+ * Copyright © 2009 Regents of the University of California
+ *
+ * Licensed under the Educational Community License (ECL), Version 2.0.
+ * You may not use this file except in compliance with this License.
+ *
+ * You may obtain a copy of the ECL 2.0 License at
+ * https://source.collectionspace.org/collection-space/LICENSE.txt
+ *
+ * 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.
+ */
+
+// @TODO: Add Javadoc comments
+
+// @TODO: Catch Exceptions thrown by IDGeneratorPart, then
+// reflect this in the corresponding BaseIDGeneratorTest class.
+
+package org.collectionspace.services.id;
+
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * SettableIDGenerator
+ *
+ * Models an identifier (ID) generator, consisting of 
+ * multiple IDGeneratorParts.
+ *
+ * This generator extends the base ID generator to handle
+ * instances where a full or partial ID is supplied,
+ * on which a new ID must be generated.
+ *
+ * $LastChangedRevision: 647 $
+ * $LastChangedDate$
+ */
+public class SettableIDGenerator extends BaseIDGenerator {
+
+    /**
+     * Constructor.
+     *
+     * @param csid  A CollectionSpace ID (CSID) identifying this ID generator.
+     *
+     */
+    public SettableIDGenerator(String csid) {
+      super(csid);
+    }
+    
+    /**
+     * Constructor.
+     *
+     * @param csid  A CollectionSpace ID (CSID) identifying this ID generator.
+     *
+     * @param parts A collection of ID generator parts.
+     *
+     */
+    public SettableIDGenerator(String csid, Vector<IDGeneratorPart> parts) {
+        super(csid, parts);
+    }
+
+   /**
+     * Returns the current value of this ID, based on a
+     * supplied ID that partly matches - via stem matching -
+     * the format of the IDs generated by this ID generator.
+     *
+     * If the supplied ID fully matches the pattern,
+     * returns the supplied ID.
+     *
+     * However, if the supplied ID is a partial ID, which
+     * partly stem matches the format but does not fully
+     * match the format, returns the partial ID with its
+     * its next ID component appended.  The next ID component
+     * will be set to its initial value.
+     *
+     * Examples:
+     *
+     * - 2009.5." becomes "2009.5.1", in a case where the
+     *   next ID component is an incrementing numeric IDGeneratorPart.
+     * - "E55-" becomes "E55-a", where the next ID component
+     *   is an incrementing alphabetic IDGeneratorPart.
+     *
+     * @param   value  An ID that matches the stem of the format
+     *                 of the IDs generated by this ID generator.
+     *
+     * @return  The current value of this ID.
+     */
+    public String getCurrentID(String value)
+        throws IllegalArgumentException {
+
+      if (value == null) return value;
+      
+      // Try ever-larger stem matches against the supplied value,
+      // by incrementally appending each part's regex, until no
+      // (more) matches are found.
+      //
+      // In so doing, build a subset of this BaseIDGenerator's regex
+      // that fully matches the supplied value.
+      Pattern pattern = null;
+      Matcher matcher = null;
+      int matchedParts = 0;
+      StringBuffer regexToTry = new StringBuffer();
+      StringBuffer regex = new StringBuffer();
+      for (IDGeneratorPart partToTryMatching : this.parts) {
+          regexToTry.append(partToTryMatching.getRegex());
+          pattern = Pattern.compile(regexToTry.toString());
+            matcher = pattern.matcher(value);
+            // If a stem match was found on the current regex,
+            // store a count of matched IDGeneratorParts and the regex pattern
+            // that has matched to this point.
+            if (matcher.lookingAt()) {
+                matchedParts++;
+              regex.append(partToTryMatching.getRegex());
+            // Otherwise, exit the loop.
+            } else {
+                break;
+            }
+        }
+
+        // If the supplied ID doesn't partly match the pattern,
+        // throw an Exception.
+        if (matchedParts == 0) {
+            throw new IllegalArgumentException("Supplied ID does not match this ID pattern.");
+        }
+
+        pattern = Pattern.compile(regex.toString());
+        matcher = pattern.matcher(value);
+        
+        // If the supplied ID doesn't match the pattern built above,
+        // throw an Exception.  (This error condition should likely
+        // never be reached, but it's here as a guard.)
+        if (! matcher.matches()) {
+            throw new IllegalArgumentException("Supplied ID does not match this ID pattern.");
+        }
+        
+        // Otherwise, if the supplied ID matches the pattern,
+        // split the ID into its components and store those
+        // values in each of the pattern's IDGeneratorParts.
+        IDGeneratorPart currentPart;
+        for (int i = 1; i <= matchedParts; i++) {
+            currentPart = this.parts.get(i - 1);
+            currentPart.setCurrentID(matcher.group(i));
+        }
+
+        // Obtain the initial value of the next IDGeneratorPart, and
+        // set the current value of that part to its initial value.
+        //
+        // If the supplied ID fully matches the pattern, there will
+        // be no 'next' IDGeneratorPart, and we must catch that Exception below. 
+        int nextPartNum = matchedParts;
+        try {
+            // String initial = this.parts.get(nextPartNum).getInitialID();
+            // this.parts.get(nextPartNum).setCurrentID(initial);
+            String currentID = this.parts.get(nextPartNum).getCurrentID();
+            // Increment the number of matched parts to reflect the
+            // addition of this next IDGeneratorPart.
+            matchedParts++;
+        } catch (ArrayIndexOutOfBoundsException e ) {
+            // Do nothing here; we simply won't increment
+            // the number of matched parts, used in the loop below.
+        }
+        
+        // Call the getCurrentID() method on each of the
+        // supplied IDGeneratorParts, as well as on the added IDGeneratorPart
+        // whose initial value was just obtained, if any.
+        StringBuffer sb = new StringBuffer();
+        for (int i = 1; i <= matchedParts; i++) {
+            sb.append(this.parts.get(i - 1).getCurrentID());
+        }
+        
+        return sb.toString();
+
+    }
+
+   /**
+     * Returns a new ID, based on a supplied ID that entirely
+     * matches the format of the IDs generated by this ID generator.
+     *
+     * @param   value  An ID that entirely matches the format
+     *                 of the IDs generated by this ID generator.
+     *
+     * @return  An new ID. 
+     */
+    public String newID(String value)
+        throws IllegalStateException, IllegalArgumentException {
+
+        if (value == null) { 
+            throw new IllegalArgumentException("Supplied ID cannot be null.");
+        }
+        
+        Pattern pattern = Pattern.compile(getRegex());
+        Matcher matcher = pattern.matcher(value);
+        
+        // If the supplied ID doesn't entirely match the pattern,
+        // throw an Exception.
+        if (! matcher.matches()) {
+            throw new IllegalArgumentException(
+                "Supplied ID does not match this ID pattern.");
+        }
+        
+        // Otherwise, if the supplied ID entirely matches the pattern,
+        // split the ID into its components and store those values in
+        // each of the pattern's IDGeneratorParts.
+        IDGeneratorPart currentPart;
+        for (int i = 1; i <= (matcher.groupCount() - 1); i++) {
+            currentPart = this.parts.get(i - 1);
+            currentPart.setCurrentID(matcher.group(i));
+        }
+        
+        // @TODO This code is duplicated in newID(), above,
+        // and thus we may want to refactor this.
+        int lastPartNum = this.parts.size();
+        StringBuffer sb = new StringBuffer(MAX_ID_LENGTH);
+        int i = 0;
+        for (IDGeneratorPart part : this.parts) {
+               i++;
+               if (i < lastPartNum) {
+               sb.append(part.getCurrentID());
+               } else {
+                       sb.append(part.newID());
+               }
+        }
+        
+        return sb.toString();
+        
+    }
+     
+}
index 2b0364e11f87d17bb742095f6ff7070dbefd8e67..d73d28a858026fb933ad34bf4c91f71df4900d2a 100644 (file)
@@ -159,8 +159,8 @@ public class YearIDGeneratorPart implements IDGeneratorPart {
 
        public static String getCurrentYear() {
                Calendar cal = GregorianCalendar.getInstance();
-        int y = cal.get(Calendar.YEAR);
-               return Integer.toString(y);
+        int year = cal.get(Calendar.YEAR);
+               return Integer.toString(year);
        }       
        
 }
similarity index 55%
rename from services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorTest.java
rename to services/id/service/src/test/java/org/collectionspace/services/id/test/BaseIDGeneratorTest.java
index 4f3b9f0d7c6d7050109412897bb31326f40c610e..10b6d511cc9587846aa96849d782c0245ce26b66 100644 (file)
@@ -30,64 +30,68 @@ import java.util.Vector;
 import junit.framework.TestCase;
 import static org.junit.Assert.fail;
 
+import org.collectionspace.services.id.YearIDGeneratorPart;
 
 /**    
- * IDGeneratorTest, Test class for IDGenerator.
+ * BaseIDGeneratorTest, Test class for BaseIDGenerator.
  *
  * $LastChangedRevision$
  * $LastChangedDate$
  */
-public class IDGeneratorTest extends TestCase {
+public class BaseIDGeneratorTest extends TestCase {
 
-    BaseIDGenerator generator;
+    BaseIDGenerator generator = new BaseIDGenerator(DEFAULT_CSID);
     IDGeneratorPart part;
     
+    final static String CURRENT_YEAR = YearIDGeneratorPart.getCurrentYear();
     final static String DEFAULT_CSID = "1";
 
     // Note: tests may fail with IllegalArgumentException
     // if any initialization of new IDParts fails
     // due to invalid arguments passed to their constructors.
 
+    // Test empty parts lists
+
     public void testEmptyPartsListCurrentID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
         assertEquals("", generator.getCurrentID());
     }
 
     public void testEmptyPartsListNewID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
         assertEquals("", generator.newID());
     }
+    
+    // Test adding parts and retrieving current IDs
 
     public void testCurrentIDViaVector() {
-
         Vector parts = new Vector();
+        BaseIDGenerator gen;
 
         parts.clear();
         parts.add(new AlphabeticIDGeneratorPart("a"));
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertEquals("a", generator.getCurrentID());
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertEquals("a", gen.getCurrentID());
 
         parts.clear();
         parts.add(new NumericIDGeneratorPart("1"));
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertEquals("1", generator.getCurrentID());
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertEquals("1", gen.getCurrentID());
 
         parts.clear();
         parts.add(new StringIDGeneratorPart("PREFIX"));
         parts.add(new StringIDGeneratorPart("-"));
         parts.add(new StringIDGeneratorPart("SUFFIX"));
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertEquals("PREFIX-SUFFIX", generator.getCurrentID());
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertEquals("PREFIX-SUFFIX", gen.getCurrentID());
 
         parts.clear();
         parts.add(new YearIDGeneratorPart());
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertEquals(getCurrentYear(), generator.getCurrentID());
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertEquals(CURRENT_YEAR, gen.getCurrentID());
 
         parts.clear();
         parts.add(new UUIDGeneratorPart());
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertTrue(generator.getCurrentID().length() ==
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertTrue(gen.getCurrentID().length() ==
             UUIDGeneratorPart.UUID_LENGTH);
 
         parts.clear();
@@ -96,14 +100,12 @@ public class IDGeneratorTest extends TestCase {
         parts.add(new NumericIDGeneratorPart("1"));
         parts.add(new StringIDGeneratorPart("-"));
         parts.add(new AlphabeticIDGeneratorPart("a"));
-        generator = new BaseIDGenerator(DEFAULT_CSID, parts);
-        assertEquals("2009.1-a", generator.getCurrentID());
-            
+        gen = new BaseIDGenerator(DEFAULT_CSID, parts);
+        assertEquals("2009.1-a", gen.getCurrentID());
     }
 
     public void testCurrentIDViaAdd() {
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new YearIDGeneratorPart("2009"));
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
@@ -111,106 +113,37 @@ public class IDGeneratorTest extends TestCase {
         generator.add(new AlphabeticIDGeneratorPart("a"));    
         assertEquals("2009.1-a", generator.getCurrentID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new YearIDGeneratorPart("2009"));
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("0"));
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("0"));
         assertEquals("2009.0.0", generator.getCurrentID());
-            
     }
-
-    public void testCurrentIDWithPartialSuppliedID() {
-            
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new StringIDGeneratorPart("E"));
-        generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals("E1", generator.getCurrentID("E"));
-        assertEquals("E1", generator.getCurrentID("E"));
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart());
-        generator.add(new StringIDGeneratorPart("."));
-        assertEquals("2009.", generator.getCurrentID("2009"));
-        assertEquals("2009.", generator.getCurrentID("2009"));
-        assertEquals("2010.", generator.getCurrentID("2010"));
-        assertEquals("2010.", generator.getCurrentID("2010"));
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart());
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals("2009.1", generator.getCurrentID("2009."));
-        assertEquals("2009.1", generator.getCurrentID("2009."));
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart());
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("55"));
-        assertEquals("2010.55", generator.getCurrentID("2010."));
-        assertEquals("2010.55", generator.getCurrentID("2010."));
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart());
-        assertEquals("2009.1", generator.getCurrentID("2009."));
-        assertEquals("2009.1", generator.getCurrentID("2009."));
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        generator.add(new StringIDGeneratorPart("-"));
-        generator.add(new AlphabeticIDGeneratorPart("a"));
-        assertEquals("2009.1-a", generator.getCurrentID("2009.1-"));
-        assertEquals("2009.1-a", generator.getCurrentID("2009.1-"));
-        assertEquals("2009.3-a", generator.getCurrentID("2009.3-"));
-        assertEquals("2009.3-a", generator.getCurrentID("2009.3-"));
-
-    }
-
-    public void testCurrentIDWithFullSuppliedID() {
     
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("55"));
-        assertEquals("2009.55", generator.getCurrentID("2009.55"));
-        assertEquals("2009.56", generator.newID());
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        generator.add(new StringIDGeneratorPart("-"));
-        generator.add(new AlphabeticIDGeneratorPart("a"));
-        assertEquals("2009.1-a", generator.getCurrentID("2009.1-a"));
-        assertEquals("2009.1-b", generator.newID());
-
-    }
+    // Test generating new IDs from a single part
 
     public void testNewAlphabeticLowercaseID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("a"));
         assertEquals("a", generator.newID());
         assertEquals("b", generator.newID());
         assertEquals("c", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("aa"));
         assertEquals("aa", generator.newID());
         assertEquals("ab", generator.newID());
         assertEquals("ac", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("az"));
         assertEquals("az", generator.newID());
         assertEquals("ba", generator.newID());
         assertEquals("bb", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("a"));
         generator.add(new AlphabeticIDGeneratorPart("yy"));
         assertEquals("ayy", generator.newID());
@@ -219,25 +152,25 @@ public class IDGeneratorTest extends TestCase {
     }
 
     public void testNewAlphabeticUppercaseID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "A"));
         assertEquals("A", generator.newID());
         assertEquals("B", generator.newID());
         assertEquals("C", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "AA"));
         assertEquals("AA", generator.newID());
         assertEquals("AB", generator.newID());
         assertEquals("AC", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "AZ"));
         assertEquals("AZ", generator.newID());
         assertEquals("BA", generator.newID());
         assertEquals("BB", generator.newID());
         
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "A"));
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "YY"));
         assertEquals("AYY", generator.newID());
@@ -245,20 +178,28 @@ public class IDGeneratorTest extends TestCase {
         assertEquals("AZA", generator.newID());
     }
 
+    public void testNewNumericID() {
+        generator.clear();
+        generator.add(new NumericIDGeneratorPart("1"));
+        assertEquals("1", generator.newID());
+        assertEquals("2", generator.newID());
+        assertEquals("3", generator.newID());
+    }
+
     public void testNewStringID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new StringIDGeneratorPart("PREFIX"));
         assertEquals("PREFIX", generator.newID());
         assertEquals("PREFIX", generator.newID());
         assertEquals("PREFIX", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "AA"));
         assertEquals("AA", generator.newID());
         assertEquals("AB", generator.newID());
         assertEquals("AC", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new AlphabeticIDGeneratorPart("A", "Z", "AZ"));
         assertEquals("AZ", generator.newID());
         assertEquals("BA", generator.newID());
@@ -266,7 +207,7 @@ public class IDGeneratorTest extends TestCase {
     }
 
     public void testNewUUID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new UUIDGeneratorPart());
         String firstID = generator.newID();
         String secondID = generator.newID();
@@ -278,165 +219,109 @@ public class IDGeneratorTest extends TestCase {
         assertTrue(firstID.compareTo(thirdID) != 0);
         assertTrue(secondID.compareTo(thirdID) != 0);
     }
+    
+    // Test generating new IDs from multiple, mixed parts
 
-    public void testNewID() {
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals("1", generator.newID());
-        assertEquals("2", generator.newID());
-        assertEquals("3", generator.newID());
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+    public void testNewMixedID() {
+        generator.clear();
         generator.add(new YearIDGeneratorPart());
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals(getCurrentYear() + ".1", generator.newID());
-        assertEquals(getCurrentYear() + ".2", generator.newID());
-        assertEquals(getCurrentYear() + ".3", generator.newID());
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        assertEquals(CURRENT_YEAR + ".1", generator.newID());
+        assertEquals(CURRENT_YEAR + ".2", generator.newID());
+        assertEquals(CURRENT_YEAR + ".3", generator.newID());
+        
+        generator.clear();
         generator.add(new YearIDGeneratorPart());
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
         generator.add(new StringIDGeneratorPart("-"));
         generator.add(new AlphabeticIDGeneratorPart("a"));
-        assertEquals(getCurrentYear() + ".1-a", generator.newID());
-        assertEquals(getCurrentYear() + ".1-b", generator.newID());
-        assertEquals(getCurrentYear() + ".1-c", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1-a", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1-b", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1-c", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new StringIDGeneratorPart("T"));
         generator.add(new NumericIDGeneratorPart("1005"));
         assertEquals("T1005", generator.newID());
         assertEquals("T1006", generator.newID());
         assertEquals("T1007", generator.newID());
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new YearIDGeneratorPart());
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals(getCurrentYear() + ".1.1", generator.newID());
-        assertEquals(getCurrentYear() + ".1.2", generator.newID());
-        assertEquals(getCurrentYear() + ".1.3", generator.newID());
-            
+        assertEquals(CURRENT_YEAR + ".1.1", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1.2", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1.3", generator.newID()); 
     }
 
-    public void testNewIDWithTrailingConstantStringID() {
-    
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+    public void testNewMixedIDWithTrailingConstantStringID() {
+        generator.clear();
         generator.add(new YearIDGeneratorPart());
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
         generator.add(new StringIDGeneratorPart("-"));
-        assertEquals(getCurrentYear() + ".1-", generator.newID());
-        assertEquals(getCurrentYear() + ".1-", generator.newID());
-
+        assertEquals(CURRENT_YEAR + ".1-", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1-", generator.newID());
     }
-
-    public void testNewIDWithSuppliedID() {
     
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals("2009.1", generator.newID("2009.1"));
-        assertEquals("2009.2", generator.newID());
-        assertEquals("2009.3", generator.newID());
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        generator.add(new StringIDGeneratorPart("-"));
-        generator.add(new AlphabeticIDGeneratorPart("a"));
-        assertEquals("2009.1-a", generator.newID("2009.1-a"));
-        assertEquals("2009.1-b", generator.newID());
-        assertEquals("2009.1-c", generator.newID());
-
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("3"));
-        generator.add(new StringIDGeneratorPart("-"));
-        generator.add(new AlphabeticIDGeneratorPart("b"));        
-        assertEquals("2009.3-b", generator.newID("2009.3-b"));
-        assertEquals("2009.3-c", generator.newID());
-        assertEquals("2009.3-d", generator.newID());
-
-    }
+    // Test validating IDs
 
     public void testValidUUID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new UUIDGeneratorPart());
-
         assertTrue(generator.isValidID("4c9395a8-1669-41f9-806c-920d86e40912"));
-
-        // Invalid character in 15th position (should be '4').
-        assertFalse(generator.isValidID("4c9395a8-1669-31f9-806c-920d86e40912"));
-        // Invalid character in 20th position (should be '8', '9', 'a', or 'b').
-        assertFalse(generator.isValidID("4c9395a8-1669-41f9-106c-920d86e40912"));
         assertFalse(generator.isValidID(null));
         assertFalse(generator.isValidID(""));
         assertFalse(generator.isValidID("not a UUID"));
         assertFalse(generator.isValidID("12345"));
+        // Invalid character in 15th position (should be '4').
+        assertFalse(generator.isValidID("4c9395a8-1669-31f9-806c-920d86e40912"));
+        // Invalid character in 20th position (should be '8', '9', 'a', or 'b').
+        assertFalse(generator.isValidID("4c9395a8-1669-41f9-106c-920d86e40912"));
     }
 
     public void testValidYearID() {
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new YearIDGeneratorPart());
-
         assertTrue(generator.isValidID("2009"));
         assertTrue(generator.isValidID("5555"));
-
         assertFalse(generator.isValidID("456"));
         assertFalse(generator.isValidID("10000"));
     }
 
-
-    public void testGetRegex() {
-    
-        generator = new BaseIDGenerator(DEFAULT_CSID);
-        generator.add(new YearIDGeneratorPart("2009"));
-        generator.add(new StringIDGeneratorPart("."));
-        generator.add(new NumericIDGeneratorPart("1"));
-        assertEquals("(\\d{4})(\\.)(\\d{1,6})", generator.getRegex());
-    
-    }
-
-    public void testIsValidIDYearSeparatorItemPattern() {
-    
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+    public void testValidMixedID() {
+        generator.clear();
         generator.add(new YearIDGeneratorPart("2009"));
         generator.add(new StringIDGeneratorPart("."));
         generator.add(new NumericIDGeneratorPart("1"));
-        
         assertTrue(generator.isValidID("2009.1"));
         assertTrue(generator.isValidID("5555.55"));
-
         assertFalse(generator.isValidID("456.1"));
         assertFalse(generator.isValidID("2009-1"));
         assertFalse(generator.isValidID("2009.a"));
         assertFalse(generator.isValidID("2009-a"));
         assertFalse(generator.isValidID("non-generator conforming text"));
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator.clear();
         generator.add(new YearIDGeneratorPart("2009"));
         generator.add(new StringIDGeneratorPart("ZZ.AND."));
         generator.add(new NumericIDGeneratorPart("1"));
-
         assertTrue(generator.isValidID("2009ZZ.AND.1"));
         assertFalse(generator.isValidID("2009ZZ-AND-1"));
-    
     }
 
-    public static String getCurrentYear() {
-        Calendar cal = GregorianCalendar.getInstance();
-        int y = cal.get(Calendar.YEAR);
-        return Integer.toString(y);
-    }    
+    public void testGetRegex() {
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        assertEquals("(\\d{4})(\\.)(\\d{1,6})", generator.getRegex());
+    }
 
     // @TODO: Add more tests of boundary conditions, exceptions ...
  
index 585d348b2661fa7cf77805eaa1d5440a5b0cc169..7e297825c45a1b276aede4bd1c872722a52350f2 100644 (file)
@@ -39,23 +39,23 @@ import static org.junit.Assert.*;
 public class IDGeneratorSerializerTest extends TestCase {
 
   String serializedGenerator;
-  BaseIDGenerator generator;
+  SettableIDGenerator generator;
   
   final static String DEFAULT_CSID = "TEST-1";
 
   final static String DEFAULT_SERIALIZED_ID_GENERATOR =
-    "<org.collectionspace.services.id.BaseIDGenerator>\n" +
+    "<org.collectionspace.services.id.SettableIDGenerator>\n" +
     "  <csid>" + DEFAULT_CSID + "</csid>\n" +
     "  <uri></uri>\n" +
     "  <description></description>\n" +
     "  <parts/>\n" +
-    "</org.collectionspace.services.id.BaseIDGenerator>";
+    "</org.collectionspace.services.id.SettableIDGenerator>";
 
     // @TODO We may want to canonicalize (or otherwise normalize) the expected and
     // actual XML in these tests, to avoid failures resulting from differences in
     // whitespace, etc.
     public void testSerializeIDGenerator() {
-      BaseIDGenerator generator = new BaseIDGenerator(DEFAULT_CSID);
+      SettableIDGenerator generator = new SettableIDGenerator(DEFAULT_CSID);
         assertEquals(DEFAULT_SERIALIZED_ID_GENERATOR, IDGeneratorSerializer.serialize(generator));
     }
 
@@ -78,7 +78,7 @@ public class IDGeneratorSerializerTest extends TestCase {
 
     public void testDeserializeNullSerializedIDGenerator() {
       try {
-        BaseIDGenerator generator = IDGeneratorSerializer.deserialize(null);
+        SettableIDGenerator generator = IDGeneratorSerializer.deserialize(null);
             fail("Should have thrown IllegalArgumentException here");
         } catch (IllegalArgumentException expected) {
             // This Exception should be thrown, and thus the test should pass.
index 1576429fa17ab6f582e6ef4412c4c72694170176..aa9cf422fed148cd40c58a1ae02aa2a27a499675 100644 (file)
@@ -42,7 +42,7 @@ public class IDServiceJdbcImplTest {
     String csid;
     String nextId;
     String serializedGenerator;
-    BaseIDGenerator generator;
+    SettableIDGenerator generator;
     
     IDServiceJdbcImpl jdbc = new IDServiceJdbcImpl();
     IDService service = jdbc;
@@ -81,7 +81,8 @@ public class IDServiceJdbcImplTest {
         
     }
 
-    @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator", "readIDGenerator"})
+    @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator",
+        "readIDGenerator"})
     public void updateIDGenerator() {
 
         final String NEW_DESCRIPTION = "new description";
@@ -108,15 +109,16 @@ public class IDServiceJdbcImplTest {
         jdbc.deleteIDGenerator(DEFAULT_CSID);
     }
 
-    @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator", "readIDGenerator", 
-       "updateIDGenerator", "deleteIDGenerator"})
-        public void newIDValidPattern() {
+    @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator",
+        "readIDGenerator", "updateIDGenerator", "deleteIDGenerator"})
+        public void newID() {
                 
         try {
             jdbc.deleteIDGenerator(DEFAULT_CSID);
         } catch (Exception e) {
-               // Fail silently; this is guard code.
+               // This deletion attempt may properly fail silently
+               // if no ID generator with the specified CSID currently
+               // exists in the database. 
         }
 
         jdbc.addIDGenerator(DEFAULT_CSID, getSpectrumEntryNumberGenerator());
@@ -150,9 +152,9 @@ public class IDServiceJdbcImplTest {
     // 1. The ID Service is running and accessible to this test; and
     // 2. There is no ID generator retrievable through that service
     //        with the identifier 'non-existent identifier'.
-    @Test(dependsOnMethods = {"hasRequiredDatabaseTable"}, 
+    @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "newID"}, 
         expectedExceptions = IllegalArgumentException.class)
-    public void newIDInvalidPattern() {
+    public void newIDNonExistentGenerator() {
         nextId = service.newID("non-existent identifier");                
     }
 
@@ -164,7 +166,7 @@ public class IDServiceJdbcImplTest {
     
     public String getSpectrumEntryNumberGenerator() {
         
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator = new SettableIDGenerator(DEFAULT_CSID);
         generator.setDescription(
             "SPECTRUM entry number generator");
         generator.setURI(
@@ -178,7 +180,7 @@ public class IDServiceJdbcImplTest {
 
     public String getChinAccessionNumberGenerator() {
 
-        generator = new BaseIDGenerator(DEFAULT_CSID);
+        generator = new SettableIDGenerator(DEFAULT_CSID);
         generator.setDescription(
             "CHIN accession number generator, for items without parts");
         generator.setURI(
diff --git a/services/id/service/src/test/java/org/collectionspace/services/id/test/SettableIDGeneratorTest.java b/services/id/service/src/test/java/org/collectionspace/services/id/test/SettableIDGeneratorTest.java
new file mode 100644 (file)
index 0000000..741343c
--- /dev/null
@@ -0,0 +1,162 @@
+/*    
+ * This document is a part of the source code and related artifacts
+ * for CollectionSpace, an open source collections management system
+ * for museums and related institutions:
+ *
+ * http://www.collectionspace.org
+ * http://wiki.collectionspace.org
+ *
+ * Copyright © 2009 Regents of the University of California
+ *
+ * Licensed under the Educational Community License (ECL), Version 2.0.
+ * You may not use this file except in compliance with this License.
+ *
+ * You may obtain a copy of the ECL 2.0 License at
+ * https://source.collectionspace.org/collection-space/LICENSE.txt
+ *
+ * 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.collectionspace.services.id;
+
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Vector;
+
+import junit.framework.TestCase;
+import static org.junit.Assert.fail;
+
+import org.collectionspace.services.id.YearIDGeneratorPart;
+
+/**    
+ * SettableIDGeneratorTest, Test class for SettableIDGenerator.
+ *
+ * $LastChangedRevision$
+ * $LastChangedDate$
+ */
+public class SettableIDGeneratorTest extends TestCase {
+
+    SettableIDGenerator generator = new SettableIDGenerator(DEFAULT_CSID);
+    IDGeneratorPart part;
+    
+    final static String CURRENT_YEAR = YearIDGeneratorPart.getCurrentYear();
+    final static String DEFAULT_CSID = "1";
+
+    // Note: tests may fail with IllegalArgumentException
+    // if any initialization of new IDParts fails
+    // due to invalid arguments passed to their constructors.
+
+    public void testCurrentIDWithPartialSuppliedID() {
+        generator.clear();
+        generator.add(new StringIDGeneratorPart("E"));
+        generator.add(new NumericIDGeneratorPart("1"));
+        assertEquals("E1", generator.getCurrentID("E"));
+        assertEquals("E1", generator.getCurrentID("E"));
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart());
+        generator.add(new StringIDGeneratorPart("."));
+        assertEquals("2009.", generator.getCurrentID("2009"));
+        assertEquals("2009.", generator.getCurrentID("2009"));
+        assertEquals("2010.", generator.getCurrentID("2010"));
+        assertEquals("2010.", generator.getCurrentID("2010"));
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart());
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        assertEquals("2009.1", generator.getCurrentID("2009."));
+        assertEquals("2009.1", generator.getCurrentID("2009."));
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart());
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("55"));
+        assertEquals("2010.55", generator.getCurrentID("2010."));
+        assertEquals("2010.55", generator.getCurrentID("2010."));
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart());
+        assertEquals("2009.1", generator.getCurrentID("2009."));
+        assertEquals("2009.1", generator.getCurrentID("2009."));
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        generator.add(new StringIDGeneratorPart("-"));
+        generator.add(new AlphabeticIDGeneratorPart("a"));
+        assertEquals("2009.1-a", generator.getCurrentID("2009.1-"));
+        assertEquals("2009.1-a", generator.getCurrentID("2009.1-"));
+        assertEquals("2009.3-a", generator.getCurrentID("2009.3-"));
+        assertEquals("2009.3-a", generator.getCurrentID("2009.3-"));
+
+    }
+
+    public void testCurrentIDWithFullSuppliedID() {
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("55"));
+        assertEquals("2009.55", generator.getCurrentID("2009.55"));
+        assertEquals("2009.56", generator.newID());
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        generator.add(new StringIDGeneratorPart("-"));
+        generator.add(new AlphabeticIDGeneratorPart("a"));
+        assertEquals("2009.1-a", generator.getCurrentID("2009.1-a"));
+        assertEquals("2009.1-b", generator.newID());
+    }
+
+    public void testNewIDWithTrailingConstantStringID() {
+        generator.clear();
+        generator.add(new YearIDGeneratorPart());
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        generator.add(new StringIDGeneratorPart("-"));
+        assertEquals(CURRENT_YEAR + ".1-", generator.newID());
+        assertEquals(CURRENT_YEAR + ".1-", generator.newID());
+    }
+
+    public void testNewIDWithSuppliedID() {
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        assertEquals("2009.1", generator.newID("2009.1"));
+        assertEquals("2009.2", generator.newID());
+        assertEquals("2009.3", generator.newID());
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("1"));
+        generator.add(new StringIDGeneratorPart("-"));
+        generator.add(new AlphabeticIDGeneratorPart("a"));
+        assertEquals("2009.1-a", generator.newID("2009.1-a"));
+        assertEquals("2009.1-b", generator.newID());
+        assertEquals("2009.1-c", generator.newID());
+
+        generator.clear();
+        generator.add(new YearIDGeneratorPart("2009"));
+        generator.add(new StringIDGeneratorPart("."));
+        generator.add(new NumericIDGeneratorPart("3"));
+        generator.add(new StringIDGeneratorPart("-"));
+        generator.add(new AlphabeticIDGeneratorPart("b"));        
+        assertEquals("2009.3-b", generator.newID("2009.3-b"));
+        assertEquals("2009.3-c", generator.newID());
+        assertEquals("2009.3-d", generator.newID());
+    }
+
+    // @TODO Add more tests of boundary conditions, exceptions ...
+}