1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.id.serial;
19
20 import org.apache.commons.id.AbstractLongIdentifierGenerator;
21
22 import java.io.Serializable;
23
24 /**
25 * <code>LongGenerator</code> is an Identifier Generator
26 * that generates an incrementing number as a Long object.
27 *
28 * <p>If the <code>wrap</code> argument passed to the constructor is set to
29 * <code>true</code>, the sequence will wrap, returning negative values when
30 * {@link Long#MAX_VALUE} reached; otherwise an {@link IllegalStateException}
31 * will be thrown.</p>
32 *
33 * @author Commons-Id team
34 * @version $Id: LongGenerator.java 480488 2006-11-29 08:57:26Z bayard $
35 */
36 public class LongGenerator extends AbstractLongIdentifierGenerator implements Serializable {
37
38 /**
39 * <code>serialVersionUID</code> is the serializable UID for the binary version of the class.
40 */
41 private static final long serialVersionUID = 20060122L;
42
43 /** Should the counter wrap. */
44 private boolean wrapping;
45 /** The counter. */
46 private long count = 0;
47
48 /**
49 * Constructor.
50 *
51 * @param wrap should the factory wrap when it reaches the maximum
52 * long value (or throw an exception)
53 * @param initialValue the initial long value to start at
54 */
55 public LongGenerator(boolean wrap, long initialValue) {
56 super();
57 this.wrapping = wrap;
58 this.count = initialValue;
59 }
60
61 /**
62 * Getter for property wrap.
63 *
64 * @return <code>true</code> if this generator is set up to wrap.
65 *
66 */
67 public boolean isWrap() {
68 return wrapping;
69 }
70
71 /**
72 * Sets the wrap property.
73 *
74 * @param wrap value for the wrap property
75 *
76 */
77 public void setWrap(boolean wrap) {
78 this.wrapping = wrap;
79 }
80
81 public Long nextLongIdentifier() {
82 long value = 0;
83 if (wrapping) {
84 synchronized (this) {
85 value = count++;
86 }
87 } else {
88 synchronized (this) {
89 if (count == Long.MAX_VALUE) {
90 throw new IllegalStateException
91 ("The maximum number of identifiers has been reached");
92 }
93 value = count++;
94 }
95 }
96 return new Long(value);
97 }
98 }