/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * 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.openoffice.xmerge.merger.diff; import org.openoffice.xmerge.merger.Iterator; /** *
This is an implementation of the Iterator
interface.
* It is based upon a simple Object
array.
Note: this class is not thread safe for performance reasons.
* * @author smak */ public final class ObjectArrayIterator implements Iterator { /** * TheObject
array.
*/
private Object [] objArray;
private int currentPosition;
/**
* Private default constructor.
*/
private ObjectArrayIterator() {
// do not allow user new a ObjectArrayIterator without argument
}
/**
* Standard constructor.
*
* @param objArray The Object
array.
*/
public ObjectArrayIterator(Object [] objArray) {
if (objArray != null) {
this.objArray = new Object[objArray.length];
System.arraycopy(objArray, 0, this.objArray, 0, objArray.length);
currentPosition = 0;
} else {
this.objArray = new Object[0];
}
}
public Object next() {
if (currentPosition < objArray.length - 1) {
currentPosition++;
return currentElement();
} else {
return null;
}
}
public Object previous() {
if (currentPosition > 0) {
currentPosition--;
return currentElement();
} else {
return null;
}
}
public Object start() {
currentPosition = 0;
return currentElement();
}
public Object end() {
if (objArray.length > 0) {
currentPosition = objArray.length - 1;
}
return currentElement();
}
public Object currentElement() {
if (objArray.length > 0) {
return objArray[currentPosition];
} else {
return null;
}
}
/**
* Replace current Object
.
*
* @param object Object
to replace.
*/
public void replace(Object object) {
objArray[currentPosition] = object;
}
/**
* Insert Object
after current Object
.
*
* @param object Object
to insert.
*/
public void insert(Object object) {
Object [] objArray2 = new Object[objArray.length+1];
// copy the array content up before the currentposition
if (currentPosition > 0) {
System.arraycopy(objArray, 0, objArray2, 0, currentPosition);
}
objArray2[currentPosition] = object;
// copy the array content up after the currentposition
System.arraycopy(objArray, currentPosition, objArray2,
currentPosition + 1, objArray.length - currentPosition);
objArray = objArray2;
currentPosition++;
}
/**
* Append Object
after current Object
.
*
* @param object Object
to append.
*/
public void append(Object object) {
Object [] objArray2 = new Object[objArray.length + 1];
int newPosition = currentPosition + 1;
// copy the array content up to the currentposition
System.arraycopy(objArray, 0, objArray2, 0, newPosition);
objArray2[newPosition] = object;
// copy the array content up after the currentposition
if (currentPosition < objArray.length - 1) {
System.arraycopy(objArray, newPosition, objArray2,
newPosition + 1, objArray.length - newPosition);
}
objArray = objArray2;
}
/**
* Remove current Object
.
*/
public void remove() {
Object [] objArray2 = new Object[objArray.length - 1];
// copy the array content up before the currentposition
if (currentPosition > 0) {
System.arraycopy(objArray, 0, objArray2, 0, currentPosition);
}
// copy the array content up after the currentposition
if (currentPosition < objArray.length - 1) {
System.arraycopy(objArray, currentPosition + 1, objArray2,
currentPosition, objArray.length - currentPosition - 1);
}
objArray = objArray2;
if (currentPosition == objArray.length)
currentPosition--;
}
public int elementCount() {
return objArray.length;
}
public boolean equivalent(Object obj1, Object obj2) {
return obj1.equals(obj2);
}
public void refresh() {
// do nothing
}
}