From: Aron Roberts Date: Thu, 10 Sep 2009 19:10:19 +0000 (+0000) Subject: CSPACE-425: Split off base ID generator. X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=dd90c40b3ae7b5229bb94304e60317256c776b9c;p=tmp%2Fjakarta-migration.git CSPACE-425: Split off base ID generator. --- diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/BaseIDGenerator.java b/services/id/service/src/main/java/org/collectionspace/services/id/BaseIDGenerator.java index fbad490f2..414de729d 100644 --- a/services/id/service/src/main/java/org/collectionspace/services/id/BaseIDGenerator.java +++ b/services/id/service/src/main/java/org/collectionspace/services/id/BaseIDGenerator.java @@ -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 parts = new Vector(); + protected String csid = ""; + protected String uri = ""; + protected String description = ""; + protected Vector parts = new Vector(); 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 diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/IDGenerator.java b/services/id/service/src/main/java/org/collectionspace/services/id/IDGenerator.java index b8d733f66..e6417b4cb 100644 --- a/services/id/service/src/main/java/org/collectionspace/services/id/IDGenerator.java +++ b/services/id/service/src/main/java/org/collectionspace/services/id/IDGenerator.java @@ -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 diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/IDGeneratorSerializer.java b/services/id/service/src/main/java/org/collectionspace/services/id/IDGeneratorSerializer.java index fcb95a352..eb14b3008 100644 --- a/services/id/service/src/main/java/org/collectionspace/services/id/IDGeneratorSerializer.java +++ b/services/id/service/src/main/java/org/collectionspace/services/id/IDGeneratorSerializer.java @@ -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."); diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/IDServiceJdbcImpl.java b/services/id/service/src/main/java/org/collectionspace/services/id/IDServiceJdbcImpl.java index 93d9ad698..68e07065f 100644 --- a/services/id/service/src/main/java/org/collectionspace/services/id/IDServiceJdbcImpl.java +++ b/services/id/service/src/main/java/org/collectionspace/services/id/IDServiceJdbcImpl.java @@ -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 index 000000000..3ba753ad6 --- /dev/null +++ b/services/id/service/src/main/java/org/collectionspace/services/id/SettableIDGenerator.java @@ -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 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(); + + } + +} diff --git a/services/id/service/src/main/java/org/collectionspace/services/id/YearIDGeneratorPart.java b/services/id/service/src/main/java/org/collectionspace/services/id/YearIDGeneratorPart.java index 2b0364e11..d73d28a85 100644 --- a/services/id/service/src/main/java/org/collectionspace/services/id/YearIDGeneratorPart.java +++ b/services/id/service/src/main/java/org/collectionspace/services/id/YearIDGeneratorPart.java @@ -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); } } diff --git a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorTest.java b/services/id/service/src/test/java/org/collectionspace/services/id/test/BaseIDGeneratorTest.java 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 4f3b9f0d7..10b6d511c 100644 --- a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorTest.java +++ b/services/id/service/src/test/java/org/collectionspace/services/id/test/BaseIDGeneratorTest.java @@ -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 ... diff --git a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorSerializerTest.java b/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorSerializerTest.java index 585d348b2..7e297825c 100644 --- a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorSerializerTest.java +++ b/services/id/service/src/test/java/org/collectionspace/services/id/test/IDGeneratorSerializerTest.java @@ -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 = - "\n" + + "\n" + " " + DEFAULT_CSID + "\n" + " \n" + " \n" + " \n" + - ""; + ""; // @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. diff --git a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDServiceJdbcImplTest.java b/services/id/service/src/test/java/org/collectionspace/services/id/test/IDServiceJdbcImplTest.java index 1576429fa..aa9cf422f 100644 --- a/services/id/service/src/test/java/org/collectionspace/services/id/test/IDServiceJdbcImplTest.java +++ b/services/id/service/src/test/java/org/collectionspace/services/id/test/IDServiceJdbcImplTest.java @@ -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 index 000000000..741343c46 --- /dev/null +++ b/services/id/service/src/test/java/org/collectionspace/services/id/test/SettableIDGeneratorTest.java @@ -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 ... + +}