rdonkin 02/02/25 11:07:15 Modified: betwixt/src/java/org/apache/commons/betwixt XMLBeanInfo.java XMLIntrospector.java betwixt/src/java/org/apache/commons/betwixt/io BeanWriter.java Added: betwixt/src/java/org/apache/commons/betwixt/io IDGenerator.java betwixt/src/java/org/apache/commons/betwixt/io/id AbstractIDGenerator.java RandomIDGenerator.java SequentialIDGenerator.java package.html Log: Implemented ID/IDREF solution to cyclic reference problem Revision Changes Path 1.5 +50 -6 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLBeanInfo.java Index: XMLBeanInfo.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLBeanInfo.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- XMLBeanInfo.java 19 Feb 2002 06:10:26 -0000 1.4 +++ XMLBeanInfo.java 25 Feb 2002 19:07:15 -0000 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLBeanInfo.java,v 1.4 2002/02/19 06:10:26 jstrachan Exp $ - * $Revision: 1.4 $ - * $Date: 2002/02/19 06:10:26 $ + * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLBeanInfo.java,v 1.5 2002/02/25 19:07:15 rdonkin Exp $ + * $Revision: 1.5 $ + * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * @@ -57,7 +57,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * $Id: XMLBeanInfo.java,v 1.4 2002/02/19 06:10:26 jstrachan Exp $ + * $Id: XMLBeanInfo.java,v 1.5 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt; @@ -68,14 +68,18 @@ * or XSLT for example.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ */ public class XMLBeanInfo { - + /** Descriptor for main element */ private ElementDescriptor elementDescriptor; /** the beans class that this XML info refers to */ private Class beanClass; + /** <code>ID</code> attribute name */ + private String idAttributeName = "id"; + /** <code>IDREF</code> attribute name */ + private String idrefAttributeName = "idref"; /** Base constructor */ public XMLBeanInfo( Class beanClass ) { @@ -100,5 +104,45 @@ /** Sets the beans class that this XML info refers to */ public void setBeanClass(Class beanClass) { this.beanClass = beanClass; + } + + /** Search attributes for one matching <code>ID</code> attribute name */ + public AttributeDescriptor getIDAttribute() { + // XXX this only need to be done once! + // we'll check to see if the bean already has an id + if ( getElementDescriptor().hasAttributes() ) { + AttributeDescriptor[] attributes = getElementDescriptor().getAttributeDescriptors(); + if ( attributes != null ) { + for ( int i = 0, size = attributes.length; i < size; i++ ) { + // support a match either on local or qualified name + if ( getIDAttributeName().equals( attributes[i].getQualifiedName() ) + || getIDAttributeName().equals( attributes[i].getLocalName() )) { + // we've got a match so use this attribute + return attributes[i]; + + } + } + } + } + return null; + } + + /** Get name of <code>ID</code> attribute */ + public String getIDAttributeName() { + return idAttributeName; + } + /** Set name of <code>ID</code> attribute */ + public void setIDAttributeName(String idAttributeName) { + this.idAttributeName = idAttributeName; + } + + /** Get <code>IDREF</code> attribute name */ + public String getIDREFAttributeName() { + return idrefAttributeName; + } + + /** Set <code>IDREF</code> attribute name */ + public void setIDREFAttributeName() { + this.idrefAttributeName = idrefAttributeName; } } 1.18 +7 -7 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java Index: XMLIntrospector.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- XMLIntrospector.java 19 Feb 2002 15:31:30 -0000 1.17 +++ XMLIntrospector.java 25 Feb 2002 19:07:15 -0000 1.18 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v 1.17 2002/02/19 15:31:30 jstrachan Exp $ - * $Revision: 1.17 $ - * $Date: 2002/02/19 15:31:30 $ + * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/XMLIntrospector.java,v 1.18 2002/02/25 19:07:15 rdonkin Exp $ + * $Revision: 1.18 $ + * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * @@ -57,7 +57,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * $Id: XMLIntrospector.java,v 1.17 2002/02/19 15:31:30 jstrachan Exp $ + * $Id: XMLIntrospector.java,v 1.18 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt; @@ -99,7 +99,7 @@ * Later requests for the same class will return the cached value.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> - * @version $Revision: 1.17 $ + * @version $Revision: 1.18 $ */ public class XMLIntrospector { @@ -416,7 +416,7 @@ } /** Returns true if the type is a loop type */ - protected boolean isLoopType(Class type) { + public boolean isLoopType(Class type) { return type.isArray() || Map.class.isAssignableFrom( type ) || Collection.class.isAssignableFrom( type ) @@ -426,7 +426,7 @@ /** Returns true for primitive types */ - protected boolean isPrimitiveType(Class type) { + public boolean isPrimitiveType(Class type) { if ( type.equals( Object.class ) ) { return false; } 1.15 +233 -35 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java Index: BeanWriter.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- BeanWriter.java 19 Feb 2002 06:10:27 -0000 1.14 +++ BeanWriter.java 25 Feb 2002 19:07:15 -0000 1.15 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java,v 1.14 2002/02/19 06:10:27 jstrachan Exp $ - * $Revision: 1.14 $ - * $Date: 2002/02/19 06:10:27 $ + * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/BeanWriter.java,v 1.15 2002/02/25 19:07:15 rdonkin Exp $ + * $Revision: 1.15 $ + * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * @@ -57,7 +57,7 @@ * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * - * $Id: BeanWriter.java,v 1.14 2002/02/19 06:10:27 jstrachan Exp $ + * $Id: BeanWriter.java,v 1.15 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt.io; @@ -68,6 +68,7 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.util.Iterator; +import java.util.HashMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -78,6 +79,7 @@ import org.apache.commons.betwixt.XMLIntrospector; import org.apache.commons.betwixt.expression.Context; import org.apache.commons.betwixt.expression.Expression; +import org.apache.commons.betwixt.io.id.SequentialIDGenerator; /** <p><code>BeanWriter</code> output beans as XML.</p> @@ -97,8 +99,26 @@ * The output will be indented. * The indent string used is set by {@link #setIndent}. * + * <p> Bean graphs can sometimes contain cycles. + * Care must be taken when serializing cyclic bean graphs + * since this can lead to infinite recursion. + * The approach taken by <code>BeanWriter</code> is to automatically + * assign an <code>ID</code> attribute value to beans. + * When a cycle is encountered, + * an element is written that has the <code>IDREF</code> attribute set to the + * id assigned earlier. + * + * <p> The names of the <code>ID</code> and <code>IDREF</code> attributes used + * can be customized by the <code>XMLBeanInfo</code>. + * The id's used can also be customized by the user + * via <code>IDGenerator</code> subclasses. + * The implementation used can be set by the <code>IdGenerator</code> property. + * BeanWriter defaults to using <code>SequentialIDGenerator</code> + * which supplies id values in numeric sequence. + * + * * @author <a href="mailto:[EMAIL PROTECTED]">James Strachan</a> - * @version $Revision: 1.14 $ + * @version $Revision: 1.15 $ */ public class BeanWriter { @@ -127,6 +147,10 @@ private boolean autoFlush; /** Log used for logging (Doh!) */ private Log log = LogFactory.getLog( BeanWriter.class ); + /** Map containing ID attribute values for beans */ + private HashMap idMap = new HashMap(); + /** Used to generate ID attribute values*/ + private IDGenerator idGenerator = new SequentialIDGenerator(); /** * <p> Constructor uses <code>System.out</code> for output.</p> @@ -162,20 +186,16 @@ * @param bean write out representation of this bean */ public void write(Object bean) throws IOException, IntrospectionException { - log.debug("Writing bean graph..."); - XMLBeanInfo beanInfo = introspector.introspect( bean ); - if ( beanInfo != null ) { - ElementDescriptor elementDescriptor = beanInfo.getElementDescriptor(); - if ( elementDescriptor != null ) { - Context context = new Context( bean, log ); - write( elementDescriptor.getQualifiedName(), elementDescriptor, context ); - } - } + log.debug( "Writing bean graph..." ); + log.debug( bean ); + write( null, bean ); + if ( autoFlush ) { writer.flush(); } - log.debug("Finished writing bean graph."); + + log.debug( "Finished writing bean graph." ); } /** Writes the given bean to the current stream using the given <code>qualifiedName</code> */ @@ -185,9 +205,11 @@ throws IOException, IntrospectionException { - if (log.isDebugEnabled()) + + + if ( log.isTraceEnabled() ) { - log.debug("Writing bean graph (qualified name '" + qualifiedName + "'"); + log.trace( "Writing bean graph (qualified name '" + qualifiedName + "'" ); } // introspect to obtain bean info @@ -199,11 +221,63 @@ if ( qualifiedName == null ) { qualifiedName = elementDescriptor.getQualifiedName(); } - write( qualifiedName, elementDescriptor, context ); + + Object ref = null; + Object id = null; + + // only give id's to non-primatives + if ( elementDescriptor.isPrimitiveType() ) { + // write without an id + write( + qualifiedName, + elementDescriptor, + context ); + } + else { + + ref = idMap.get( context.getBean() ); + if ( ref == null ) { + // this is the first time that this bean has be written + AttributeDescriptor idAttribute = beanInfo.getIDAttribute(); + if (idAttribute == null) { + // use a generated id + id = new Integer( idGenerator.nextId() ); + idMap.put( bean, id); + + // write element with id + write( + qualifiedName, + elementDescriptor, + context , + beanInfo.getIDAttributeName(), + id.toString()); + + } else { + // use id from bean property + // it's up to the user to ensure uniqueness + // XXX should we trap nulls? + id = idAttribute.getTextExpression().evaluate( context ); + idMap.put( bean, id); + + // the ID attribute should be written automatically + write( + qualifiedName, + elementDescriptor, + context ); + } + } + else { + // we've already written this bean so write an IDREF + writeIDREFElement( + qualifiedName, + beanInfo.getIDREFAttributeName(), + ref.toString()); + } + } } } - log.debug("Finished writing bean graph."); + log.trace( "Finished writing bean graph." ); } /** @@ -234,6 +308,17 @@ public void setIndent(String indent) { this.indent = indent; } + + /** Get IDGenerator used to generate ID attribute values */ + public IDGenerator getIdGenerator() { + return idGenerator; + } + + /** Set IDGenerator used to generate ID attribute values */ + public void setIdGenerator(IDGenerator idGenerator) { + this.idGenerator = idGenerator; + } + /** @@ -276,7 +361,81 @@ public void setLog(Log log) { this.log = log; } + + + // Expression methods + //------------------------------------------------------------------------- + + /** Express an element tag start using given qualified name */ + protected void expressElementStart(String qualifiedName) throws IOException { + if ( qualifiedName == null ) { + // XXX this indicates a programming error + log.fatal( "[expressElementStart]Qualified name is null." ); + throw new RuntimeException( "Qualified name is null." ); + } + + writePrintln(); + writeIndent(); + writer.write( "<" ); + writer.write( qualifiedName ); + } + + /** Express an element end tag using given qualifiedName */ + protected void expressElementEnd(String qualifiedName) throws IOException { + if (qualifiedName == null) { + // XXX this indicates a programming error + log.fatal( "[expressElementEnd]Qualified name is null." ); + throw new RuntimeException( "Qualified name is null." ); + } + + writer.write( "</" ); + writer.write( qualifiedName ); + writer.write( ">" ); + } + + /** Express an empty element end */ + protected void expressElementEnd() throws IOException { + writer.write( "/>" ); + } + + /** Express body text */ + protected void expressBodyText(String text) throws IOException { + writer.write( ">" ); + if ( text == null ) { + // XXX This is probably a programming error + log.error( "[expressBodyText]Body text is null" ); + + } else { + writer.write( text ); + } + } + + /** Express an attribute */ + protected void expressAttribute( + String qualifiedName, + String value) + throws + IOException{ + if ( value == null ) { + // XXX probably a programming error + log.error( "Null attribute value." ); + return; + } + if ( qualifiedName == null ) { + // XXX probably a programming error + log.error( "Null attribute value." ); + return; + } + + writer.write( " " ); + writer.write( qualifiedName ); + writer.write( "=\"" ); + writer.write( value ); + writer.write( "\"" ); + } + + // Implementation methods //------------------------------------------------------------------------- @@ -289,21 +448,65 @@ throws IOException, IntrospectionException { - writePrintln(); - writeIndent(); - writer.write( "<" ); - writer.write( qualifiedName ); + expressElementStart( qualifiedName ); + + writeRestOfElement( qualifiedName, elementDescriptor, context); + } + + + + /** Writes the given element adding an ID attribute */ + protected void write( + String qualifiedName, + ElementDescriptor elementDescriptor, + Context context, + String idAttribute, + String idValue ) + throws + IOException, + IntrospectionException { + + expressElementStart( qualifiedName ); + + expressAttribute( idAttribute, idValue ); + + writeRestOfElement( qualifiedName, elementDescriptor, context ); + } + + /** Write attributes, child elements and element end */ + protected void writeRestOfElement( + String qualifiedName, + ElementDescriptor elementDescriptor, + Context context ) + throws + IOException, + IntrospectionException { + writeAttributes( elementDescriptor, context ); if ( writeContent( elementDescriptor, context ) ) { - writer.write( "</" ); - writer.write( qualifiedName ); - writer.write( ">" ); - } + expressElementEnd( qualifiedName ); + } else { - writer.write( "/>" ); + expressElementEnd(); } } + + protected void writeIDREFElement( + String qualifiedName, + String idrefAttributeName, + String idrefAttributeValue ) + throws + IOException, + IntrospectionException { + + // write IDREF element + expressElementStart( qualifiedName ); + + expressAttribute( idrefAttributeName, idrefAttributeValue ); + + expressElementEnd(); + } /** Writes the element content. * @@ -357,8 +560,7 @@ if ( value != null ) { String text = escapeBodyValue(value); if ( text != null && text.length() > 0 ) { - writer.write( ">" ); - writer.write( text ); + expressBodyText(text); answer = true; } } @@ -395,11 +597,7 @@ if ( value != null ) { String text = escapeAttributeValue(value); if ( text != null && text.length() > 0 ) { - writer.write( " " ); - writer.write( attributeDescriptor.getQualifiedName() ); - writer.write( "=\"" ); - writer.write( text ); - writer.write( "\"" ); + expressAttribute(attributeDescriptor.getQualifiedName(), text); } } } 1.1 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/IDGenerator.java Index: IDGenerator.java =================================================================== /* * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/IDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ * $Revision: 1.1 $ * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * $Id: IDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt.io; /** <p>Interface allowing pluggable <code>ID</code> generators.</p> * * <p> <code>IDGenerator</code>'s are used to generate <code>ID</code> * attribute values by <code>BeanWriter</code>. * Generators have been created that supply random and sequantial values.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Robert Burrell Donkin</a> * @version $Revision: 1.1 $ */ public interface IDGenerator { /** Get the last id produced */ public int getLastId(); /** Generate id */ public int nextId(); } 1.1 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/AbstractIDGenerator.java Index: AbstractIDGenerator.java =================================================================== /* * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/AbstractIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ * $Revision: 1.1 $ * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * $Id: AbstractIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt.io.id; import org.apache.commons.betwixt.io.IDGenerator; /** <p> Abstract superclass for id generator implementations. * Provides utility methods that store the last id generated. * Sub class should override {@link #nextIdImpl}.</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Robert Burrell Donkin</a> * @version $Revision: 1.1 $ */ public abstract class AbstractIDGenerator implements IDGenerator { /** Last id returned */ private int lastId = 0; /** Get last if implementation */ public final int getLastId() { return lastId; } /** Generate next id */ public final int nextId() { lastId = nextIdImpl(); return lastId; } /** Subclasses overried this method */ protected abstract int nextIdImpl(); } 1.1 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/RandomIDGenerator.java Index: RandomIDGenerator.java =================================================================== /* * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/RandomIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ * $Revision: 1.1 $ * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * $Id: RandomIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt.io.id; import java.util.Random; /** <p>Generates random ids. * This class can generate positive-only ids (the default) * or it can generate a mix of negative and postive ones. * * @author <a href="mailto:[EMAIL PROTECTED]">Robert Burrell Donkin</a> * @version $Revision: 1.1 $ */ public final class RandomIDGenerator extends AbstractIDGenerator { /** Use simple java.util.Random as the source for our numbers */ private Random random = new Random(); /** Should only positive id's be generated? */ private boolean onlyPositiveIds = true; /** Base constructor */ public RandomIDGenerator() {} /** Construct sets PositiveIds property */ public RandomIDGenerator(boolean onlyPositiveIds) { setPositiveIds(onlyPositiveIds); } /** Next id implementation */ public int nextIdImpl() { int next = random.nextInt(); if (onlyPositiveIds && next<0) { // it's negative and we're ignoring them so get another return nextIdImpl(); } return next; } /** Get whether only positive id's should be generated */ public boolean getPositiveIds() { return onlyPositiveIds; } /** Set whether only positive id's should be generated */ public void setPositiveIds(boolean onlyPositiveIds) { this.onlyPositiveIds = onlyPositiveIds; } } 1.1 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/SequentialIDGenerator.java Index: SequentialIDGenerator.java =================================================================== /* * $Header: /home/cvs/jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/SequentialIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ * $Revision: 1.1 $ * $Date: 2002/02/25 19:07:15 $ * * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2002 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * $Id: SequentialIDGenerator.java,v 1.1 2002/02/25 19:07:15 rdonkin Exp $ */ package org.apache.commons.betwixt.io.id; /** <p>This simply uses a counting mechanism to assign id's</p> * * @author <a href="mailto:[EMAIL PROTECTED]">Robert Burrell Donkin</a> * @version $Revision: 1.1 $ */ public final class SequentialIDGenerator extends AbstractIDGenerator { /** Counter used to assign id's */ private int counter = 0; /** Base constructor */ public SequentialIDGenerator() {} /** Set the start value for the sequence */ public SequentialIDGenerator(int start) { this.counter = start; } /** Next id implementation */ public int nextIdImpl() { return ++counter; } /** Get the current counter value */ public int getCount() { return counter; } } 1.1 jakarta-commons-sandbox/betwixt/src/java/org/apache/commons/betwixt/io/id/package.html Index: package.html =================================================================== <html> <head> </head> <body> <p>This package is home to <code>IDGenerator</code> implementations. </p> </body> </html>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>