* 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;
*/
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;
/**
* Returns the CollectionSpace ID (CSID) identifying this ID generator.
+ *
+ * @return A CollectionSpace ID (CSID) identifying this ID generator.
*/
public String getCsid() {
return this.csid;
/**
* 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.
*/
}
/**
- * 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;
/**
* 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;
}
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 {
}
-
- // 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) {
*/
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
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
*
* @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) {
*
* @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("")) {
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.");
// @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,
"ID generator " + "\'" + csid + "\'" + " could not be found.");
}
- BaseIDGenerator generator;
+ SettableIDGenerator generator;
try {
generator = IDGeneratorSerializer.deserialize(serializedGenerator);
} catch (IllegalArgumentException e) {
*
* @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.
*
* @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.
"last_generated_id = ? " +
"WHERE id_generator_csid = ?";
- BaseIDGenerator generator;
+ SettableIDGenerator generator;
try {
generator = IDGeneratorSerializer.deserialize(serializedGenerator);
} catch (IllegalArgumentException e) {
}
}
- logger.debug("> retrieved BaseIDGenerator: " + serializedGenerator);
+ logger.debug("> retrieved SettableIDGenerator: " + serializedGenerator);
return serializedGenerator;
--- /dev/null
+/**
+ * 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();
+
+ }
+
+}
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);
}
}
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();
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"));
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());
}
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());
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());
}
public void testNewUUID() {
- generator = new BaseIDGenerator(DEFAULT_CSID);
+ generator.clear();
generator.add(new UUIDGeneratorPart());
String firstID = generator.newID();
String secondID = generator.newID();
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 ...
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));
}
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.
String csid;
String nextId;
String serializedGenerator;
- BaseIDGenerator generator;
+ SettableIDGenerator generator;
IDServiceJdbcImpl jdbc = new IDServiceJdbcImpl();
IDService service = jdbc;
}
- @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator", "readIDGenerator"})
+ @Test(dependsOnMethods = {"hasRequiredDatabaseTable", "addIDGenerator",
+ "readIDGenerator"})
public void updateIDGenerator() {
final String NEW_DESCRIPTION = "new description";
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());
// 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");
}
public String getSpectrumEntryNumberGenerator() {
- generator = new BaseIDGenerator(DEFAULT_CSID);
+ generator = new SettableIDGenerator(DEFAULT_CSID);
generator.setDescription(
"SPECTRUM entry number generator");
generator.setURI(
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(
--- /dev/null
+/*
+ * 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 ...
+
+}