001: /**********************************************************************
002: Copyright (c) 2003 Erik Bengtson and others. All rights reserved.
003: Licensed under the Apache License, Version 2.0 (the "License");
004: you may not use this file except in compliance with the License.
005: You may obtain a copy of the License at
006:
007: http://www.apache.org/licenses/LICENSE-2.0
008:
009: Unless required by applicable law or agreed to in writing, software
010: distributed under the License is distributed on an "AS IS" BASIS,
011: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012: See the License for the specific language governing permissions and
013: limitations under the License.
014:
015:
016: Contributors:
017: 2003 Andy Jefferson - coding standards
018: ...
019: **********************************************************************/package org.jpox.store.poid;
020:
021: import java.io.Serializable;
022: import java.util.ArrayList;
023: import java.util.Arrays;
024: import java.util.List;
025: import java.util.NoSuchElementException;
026:
027: import org.jpox.util.StringUtils;
028:
029: /**
030: * Representation of a block of ids.
031: *
032: * @version $Revision: 1.3 $
033: */
034: public class PoidBlock implements Serializable {
035: /** The next id position. */
036: private int nextIndex = 0;
037:
038: /** The list of ids in this block. */
039: private final List poidBlock;
040:
041: /**
042: * Constructor for PoidBlock.
043: * @param oid The block of objects that will be considered the "IDs"
044: */
045: public PoidBlock(Object[] oid) {
046: poidBlock = Arrays.asList(oid);
047: }
048:
049: /**
050: * Constructor for PoIdBlock.
051: * @param oid The list of objects that will be considered the "IDs"
052: */
053: public PoidBlock(List oid) {
054: poidBlock = new ArrayList(oid);
055: }
056:
057: /**
058: * Accessor for the current Poid.
059: * @return The current poid
060: * @throws NoSuchElementException Thrown if no current poid
061: */
062: public Poid current() {
063: if (nextIndex == 0 || (nextIndex - 1) >= poidBlock.size()) {
064: throw new NoSuchElementException();
065: }
066: return new Poid(poidBlock.get(nextIndex - 1));
067: }
068:
069: /**
070: * Accessor for the next Poid, or null if block ids exhausted
071: * @return The next POID
072: */
073: public Poid next() {
074: if (nextIndex >= poidBlock.size()) {
075: throw new NoSuchElementException();
076: }
077:
078: return new Poid(poidBlock.get(nextIndex++));
079: }
080:
081: /**
082: * Accessor for whether there are more elements remaining in the block.
083: * @return True when has more elements
084: */
085: public boolean hasNext() {
086: return (nextIndex < poidBlock.size());
087: }
088:
089: /**
090: * Method to append a block onto this block.
091: * This is used where we have some ids left, and we want to allocate more
092: * to go into this block.
093: * @param block The other block
094: */
095: public void addBlock(PoidBlock block) {
096: if (block == null) {
097: return;
098: }
099:
100: while (block.hasNext()) {
101: poidBlock.add(block.next());
102: }
103: }
104:
105: /**
106: * Stringify method.
107: * @return A string version of this object
108: */
109: public String toString() {
110: return "PoidBlock : "
111: + StringUtils.collectionToString(poidBlock);
112: }
113: }
|