001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */ 
017    package org.apache.commons.betwixt.io.id;
018    
019    import java.util.Random;
020    
021    /** <p>Generates <code>ID</code>'s at random.
022      * The random number source is <code>java.util.Random</code>.</p>
023      *
024      * <p>Random <code>ID</code>'s are very useful if you're inserting 
025      * elements created by <code>Betwixt</code> into a stream with existing
026      * elements.
027      * Using random <code>ID</code>'s should reduce the danger of collision
028      * with existing element <code>ID</code>'s.</p>
029      * 
030      * <p>This class can generate positive-only ids (the default)
031      * or it can generate a mix of negative and postive ones.
032      * This behaviour can be set by {@link #setPositiveIds} 
033      * or by using the {@link #RandomIDGenerator(boolean onlyPositiveIds)} 
034      * constructor.</p>
035      *
036      * @author <a href="mailto:rdonkin@apache.org">Robert Burrell Donkin</a>
037      * @version $Revision: 438373 $
038      */
039    public final class RandomIDGenerator extends AbstractIDGenerator {
040        
041        /** Use simple java.util.Random as the source for our numbers */
042        private Random random = new Random();
043        /** Should only positive id's be generated? */
044        private boolean onlyPositiveIds = true;
045            
046        /** 
047          * Constructor sets the <code>PositiveIds</code> property to <code>true</code>.
048          */
049        public RandomIDGenerator() {} 
050        
051        /** 
052          * Constructor sets <code>PositiveIds</code> property.
053          *
054          * @param onlyPositiveIds set <code>PositiveIds</code> property to this value
055          */
056        public RandomIDGenerator(boolean onlyPositiveIds) {
057            setPositiveIds(onlyPositiveIds);
058        }
059        
060        /** 
061          * <p>Generates a random <code>ID</code>.</p>
062          * 
063          * <p>If the <code>PositiveIds</code> property is true, 
064          * then this method will recursively call itself if the random
065          * <code>ID</code> is less than zero.</p>
066          *
067          * @return a random integer (converted to a string)
068          */
069        public String nextIdImpl() {
070            int next = random.nextInt();
071            if (onlyPositiveIds && next<0) {
072                // it's negative and we're ignoring them so get another
073                return nextIdImpl();
074            }
075            return Integer.toString(next);
076        }
077        
078        /** 
079         * Gets whether only positive <code>ID</code>'s should be generated 
080         *
081         * @return whether only positive IDs should be generated
082         */
083        public boolean getPositiveIds() {
084            return onlyPositiveIds;
085        }
086        
087        /** 
088         * Sets whether only positive <code>ID</code>'s should be generated 
089         *
090         * @param onlyPositiveIds pass true if only positive IDs should be generated
091         */
092        public void setPositiveIds(boolean onlyPositiveIds) {
093            this.onlyPositiveIds = onlyPositiveIds;
094        }
095    }