You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2005/12/01 07:04:00 UTC

svn commit: r350181 [123/198] - in /incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core: ./ depends/ depends/files/ depends/jars/ depends/libs/ depends/libs/linux.IA32/ depends/libs/win.IA32/ depends/oss/ depends/oss/linux.IA32/ depends/oss/win....

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/util/WeakHashMap.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/util/WeakHashMap.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/util/WeakHashMap.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/luni/src/java/util/WeakHashMap.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,615 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 java.util;
+
+
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+
+/**
+ * WeakHashMap is an implementation of Map with keys which are WeakReferences.
+ * The key/value mapping is removed when the key is no longer referenced. All
+ * optional operations are supported, adding and removing. Keys and values can
+ * be any objects.
+ */
+public class WeakHashMap extends AbstractMap implements Map {
+	
+	private ReferenceQueue referenceQueue;
+
+	int elementCount;
+
+	WeakHashMapEntry[] elementData;
+
+	private int loadFactor;
+
+	private int threshold;
+
+	transient int modCount = 0;
+
+	private static final int DEFAULT_SIZE = 16;
+
+	private static final class WeakHashMapEntry extends WeakReference {
+		int hash;
+
+		boolean isNull;
+
+		Object value;
+
+		WeakHashMapEntry next;
+
+		private WeakHashMapEntry(Object key, Object object, ReferenceQueue queue) {
+			super(key, queue);
+			isNull = key == null;
+			hash = isNull ? 0 : key.hashCode();
+			value = object;
+		}
+	}
+
+	private static final class KeyEntry implements Map.Entry {
+		private Object key;
+
+		private WeakHashMapEntry entry;
+
+		interface Type {
+			Object get(KeyEntry entry);
+		}
+
+		KeyEntry(Object key, WeakHashMapEntry entry) {
+			this.key = key;
+			this.entry = entry;
+		}
+
+		public Object getKey() {
+			return key;
+		}
+
+		public Object getValue() {
+			return entry.value;
+		}
+
+		public Object setValue(Object object) {
+			Object result = entry.value;
+			entry.value = object;
+			return result;
+		}
+	}
+
+	class HashIterator implements Iterator {
+		private int position = 0, expectedModCount;
+
+		private boolean canRemove = false;
+
+		private WeakHashMapEntry entry, lastEntry;
+
+		private KeyEntry next;
+
+		KeyEntry.Type type;
+
+		HashIterator(KeyEntry.Type type, WeakHashMap map) {
+			this.type = type;
+			expectedModCount = modCount;
+		}
+
+		public boolean hasNext() {
+			if (next != null)
+				return true;
+			while (true) {
+				if (entry == null) {
+					lastEntry = null;
+					while (position < elementData.length)
+						if ((entry = elementData[position++]) != null)
+							break;
+					if (entry == null)
+						return false;
+				}
+				Object key = entry.get();
+				if (key != null || entry.isNull) {
+					next = new KeyEntry(key, entry);
+					return true;
+				}
+				entry = entry.next;
+			}
+		}
+
+		public Object next() {
+			if (expectedModCount == modCount) {
+				if (hasNext()) {
+					if (lastEntry == null)
+						lastEntry = entry;
+					else if (lastEntry.next != entry)
+						lastEntry = lastEntry.next;
+					entry = entry.next;
+					canRemove = true;
+					KeyEntry result = next;
+					next = null;
+					return type.get(result);
+				} else
+					throw new NoSuchElementException();
+			} else
+				throw new ConcurrentModificationException();
+		}
+
+		public void remove() {
+			if (expectedModCount == modCount) {
+				if (canRemove) {
+					canRemove = false;
+					modCount++;
+					if (lastEntry.next == entry) {
+						while (elementData[--position] == null) {
+							// do nothing
+						}
+						elementData[position] = elementData[position].next;
+						entry = null;
+					} else
+						lastEntry.next = entry;
+					elementCount--;
+					expectedModCount++;
+					poll();
+				} else
+					throw new IllegalStateException();
+			} else
+				throw new ConcurrentModificationException();
+		}
+	}
+
+	/**
+	 * Contructs a new empty instance of WeakHashMap.
+	 */
+	public WeakHashMap() {
+		this(DEFAULT_SIZE);
+	}
+
+	/**
+	 * Constructs a new instance of WeakHashMap with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            the initial capacity of this WeakHashMap
+	 * 
+	 * @exception IllegalArgumentException
+	 *                when the capacity is less than zero
+	 */
+	public WeakHashMap(int capacity) {
+		if (capacity >= 0) {
+			elementCount = 0;
+			elementData = new WeakHashMapEntry[capacity == 0 ? 1 : capacity];
+			loadFactor = 7500; // Default load factor of 0.75
+			computeMaxSize();
+			referenceQueue = new ReferenceQueue();
+		} else
+			throw new IllegalArgumentException();
+	}
+
+	/**
+	 * Constructs a new instance of WeakHashMap with the specified capacity and
+	 * load factor.
+	 * 
+	 * @param capacity
+	 *            the initial capacity
+	 * @param loadFactor
+	 *            the initial load factor
+	 * 
+	 * @exception IllegalArgumentException
+	 *                when the capacity is less than zero or the load factor is
+	 *                less or equal to zero
+	 */
+	public WeakHashMap(int capacity, float loadFactor) {
+		if (capacity >= 0 && loadFactor > 0) {
+			elementCount = 0;
+			elementData = new WeakHashMapEntry[capacity == 0 ? 1 : capacity];
+			this.loadFactor = (int) (loadFactor * 10000);
+			computeMaxSize();
+			referenceQueue = new ReferenceQueue();
+		} else
+			throw new IllegalArgumentException();
+	}
+
+	/**
+	 * Constructs a new instance of HashMap containing the mappings from the
+	 * specified Map.
+	 * 
+	 * @param map
+	 *            the mappings to add
+	 */
+	public WeakHashMap(Map map) {
+		this(map.size() < 6 ? 11 : map.size() * 2);
+		putAll(map);
+	}
+
+	/**
+	 * Removes all mappings from this WeakHashMap, leaving it empty.
+	 * 
+	 * @see #isEmpty
+	 * @see #size
+	 */
+	public void clear() {
+		if (elementCount > 0) {
+			elementCount = 0;
+			Arrays.fill(elementData, null);
+			modCount++;
+			while (referenceQueue.poll() != null) {
+				// do nothing
+			}
+		}
+	}
+
+	private void computeMaxSize() {
+		threshold = (int) ((long) elementData.length * loadFactor / 10000);
+	}
+
+	/**
+	 * Searches this WeakHashMap for the specified key.
+	 * 
+	 * @param key
+	 *            the object to search for
+	 * @return true if <code>key</code> is a key of this WeakHashMap, false
+	 *         otherwise
+	 */
+	public boolean containsKey(Object key) {
+		return getEntry(key) != null;
+	}
+
+	/**
+	 * Answers a Set of the mappings contained in this WeakHashMap. Each element
+	 * in the set is a Map.Entry. The set is backed by this WeakHashMap so
+	 * changes to one are relected by the other. The set does not support
+	 * adding.
+	 * 
+	 * @return a Set of the mappings
+	 */
+	public Set entrySet() {
+		return new AbstractSet() {
+			public int size() {
+				return WeakHashMap.this.size();
+			}
+
+			public void clear() {
+				WeakHashMap.this.clear();
+			}
+
+			public boolean remove(Object object) {
+				if (contains(object)) {
+					WeakHashMap.this.remove(((Map.Entry) object).getKey());
+					return true;
+				}
+				return false;
+			}
+
+			public boolean contains(Object object) {
+				if (object instanceof Map.Entry) {
+					WeakHashMapEntry entry = getEntry(((Map.Entry) object)
+							.getKey());
+					return object.equals(entry);
+				}
+				return false;
+			}
+
+			public Iterator iterator() {
+				return new HashIterator(new KeyEntry.Type() {
+					public Object get(KeyEntry entry) {
+						return entry;
+					}
+				}, WeakHashMap.this);
+			}
+		};
+	}
+
+	/**
+	 * Answers a Set of the keys contained in this WeakHashMap. The set is
+	 * backed by this WeakHashMap so changes to one are reflected by the other.
+	 * The set does not support adding.
+	 * 
+	 * @return a Set of the keys
+	 */
+	public Set keySet() {
+		if (keySet == null) {
+			keySet = new AbstractSet() {
+				public boolean contains(Object object) {
+					return containsKey(object);
+				}
+
+				public int size() {
+					return WeakHashMap.this.size();
+				}
+
+				public void clear() {
+					WeakHashMap.this.clear();
+				}
+
+				public boolean remove(Object key) {
+					if (containsKey(key)) {
+						WeakHashMap.this.remove(key);
+						return true;
+					}
+					return false;
+				}
+
+				public Iterator iterator() {
+					return new HashIterator(new KeyEntry.Type() {
+						public Object get(KeyEntry entry) {
+							return entry.getKey();
+						}
+					}, WeakHashMap.this);
+				}
+			};
+		}
+		return keySet;
+	}
+
+	/**
+	 * Answers a Collection of the values contained in this WeakHashMap. The
+	 * collection is backed by this WeakHashMap so changes to one are reflected
+	 * by the other. The collection does not support adding.
+	 * 
+	 * @return a Collection of the values
+	 */
+	public Collection values() {
+		if (valuesCollection == null) {
+			valuesCollection = new AbstractCollection() {
+				public int size() {
+					return WeakHashMap.this.size();
+				}
+
+				public void clear() {
+					WeakHashMap.this.clear();
+				}
+
+				public boolean contains(Object object) {
+					return containsValue(object);
+				}
+
+				public Iterator iterator() {
+					return new HashIterator(new KeyEntry.Type() {
+						public Object get(KeyEntry entry) {
+							return entry.getValue();
+						}
+					}, WeakHashMap.this);
+				}
+			};
+		}
+		return valuesCollection;
+	}
+
+	/**
+	 * Answers the value of the mapping with the specified key.
+	 * 
+	 * @param key
+	 *            the key
+	 * @return the value of the mapping with the specified key
+	 */
+	public Object get(Object key) {
+		if (key != null) {
+			int index = (key.hashCode() & 0x7FFFFFFF) % elementData.length;
+			WeakHashMapEntry entry = elementData[index];
+			while (entry != null) {
+				if (key.equals(entry.get()))
+					return entry.value;
+				entry = entry.next;
+			}
+			return null;
+		}
+		WeakHashMapEntry entry = elementData[0];
+		while (entry != null) {
+			if (entry.isNull)
+				return entry.value;
+			entry = entry.next;
+		}
+		return null;
+	}
+
+	WeakHashMapEntry getEntry(Object key) {
+		if (key != null) {
+			int index = (key.hashCode() & 0x7FFFFFFF) % elementData.length;
+			WeakHashMapEntry entry = elementData[index];
+			while (entry != null) {
+				if (key.equals(entry.get()))
+					return entry;
+				entry = entry.next;
+			}
+			return null;
+		}
+		WeakHashMapEntry entry = elementData[0];
+		while (entry != null) {
+			if (entry.isNull)
+				return entry;
+			entry = entry.next;
+		}
+		return null;
+	}
+
+	/**
+	 * Searches this WeakHashMap for the specified value, and returns true, if
+	 * at least one entry has this object as its value.
+	 * 
+	 * @param value
+	 *            the object to search for
+	 * @return true if <code>value</code> is a value in this WeakHashMap,
+	 *         false otherwise
+	 */
+	public boolean containsValue(Object value) {
+		if (value != null) {
+			for (int i = elementData.length; --i >= 0;) {
+				WeakHashMapEntry entry = elementData[i];
+				while (entry != null) {
+					if (value.equals(entry.value))
+						return true;
+					entry = entry.next;
+				}
+			}
+		} else {
+			for (int i = elementData.length; --i >= 0;) {
+				WeakHashMapEntry entry = elementData[i];
+				while (entry != null) {
+					if (entry.value == null)
+						return true;
+					entry = entry.next;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Answers if this WeakHashMap has no elements, a size of zero.
+	 * 
+	 * @return true if this HashMap has no elements, false otherwise
+	 * 
+	 * @see #size
+	 */
+	public boolean isEmpty() {
+		return size() == 0;
+	}
+
+	void poll() {
+		WeakHashMapEntry toRemove;
+		while ((toRemove = (WeakHashMapEntry) referenceQueue.poll()) != null) {
+			WeakHashMapEntry entry, last = null;
+			int index = (toRemove.hash & 0x7FFFFFFF) % elementData.length;
+			entry = elementData[index];
+			// Ignore queued entries which cannot be found, the user could
+			// have removed them before they were queued, i.e. using clear()
+			while (entry != null) {
+				if (toRemove == entry) {
+					modCount++;
+					if (last == null)
+						elementData[index] = entry.next;
+					else
+						last.next = entry.next;
+					elementCount--;
+					break;
+				}
+				last = entry;
+				entry = entry.next;
+			}
+		}
+	}
+
+	/**
+	 * Maps the specified key to the specified value.
+	 * 
+	 * @param key
+	 *            the key
+	 * @param value
+	 *            the value
+	 * @return the value of any previous mapping with the specified key or null
+	 *         if there was no mapping
+	 */
+	public Object put(Object key, Object value) {
+		poll();
+		int index = 0;
+		WeakHashMapEntry entry;
+		if (key != null) {
+			index = (key.hashCode() & 0x7FFFFFFF) % elementData.length;
+			entry = elementData[index];
+			while (entry != null && !key.equals(entry.get()))
+				entry = entry.next;
+		} else {
+			entry = elementData[0];
+			while (entry != null && !entry.isNull)
+				entry = entry.next;
+		}
+		if (entry == null) {
+			modCount++;
+			if (++elementCount > threshold) {
+				rehash();
+				index = key == null ? 0 : (key.hashCode() & 0x7FFFFFFF)
+						% elementData.length;
+			}
+			entry = new WeakHashMapEntry(key, value, referenceQueue);
+			entry.next = elementData[index];
+			elementData[index] = entry;
+			return null;
+		}
+		Object result = entry.value;
+		entry.value = value;
+		return result;
+	}
+
+	private void rehash() {
+		int length = elementData.length << 1;
+		if (length == 0)
+			length = 1;
+		WeakHashMapEntry[] newData = new WeakHashMapEntry[length];
+		for (int i = 0; i < elementData.length; i++) {
+			WeakHashMapEntry entry = elementData[i];
+			while (entry != null) {
+				int index = entry.isNull ? 0 : (entry.hash & 0x7FFFFFFF)
+						% length;
+				WeakHashMapEntry next = entry.next;
+				entry.next = newData[index];
+				newData[index] = entry;
+				entry = next;
+			}
+		}
+		elementData = newData;
+		computeMaxSize();
+	}
+
+	/**
+	 * Removes a mapping with the specified key from this WeakHashMap.
+	 * 
+	 * @param key
+	 *            the key of the mapping to remove
+	 * @return the value of the removed mapping or null if key is not a key in
+	 *         this WeakHashMap
+	 */
+	public Object remove(Object key) {
+		poll();
+		int index = 0;
+		WeakHashMapEntry entry, last = null;
+		if (key != null) {
+			index = (key.hashCode() & 0x7FFFFFFF) % elementData.length;
+			entry = elementData[index];
+			while (entry != null && !key.equals(entry.get())) {
+				last = entry;
+				entry = entry.next;
+			}
+		} else {
+			entry = elementData[0];
+			while (entry != null && !entry.isNull) {
+				last = entry;
+				entry = entry.next;
+			}
+		}
+		if (entry != null) {
+			modCount++;
+			if (last == null)
+				elementData[index] = entry.next;
+			else
+				last.next = entry.next;
+			elementCount--;
+			return entry.value;
+		}
+		return null;
+	}
+
+	/**
+	 * Answers the number of mappings in this WeakHashMap.
+	 * 
+	 * @return the number of mappings in this WeakHashMap
+	 */
+	public int size() {
+		int size = 0;
+		for (int i = elementData.length; --i >= 0;) {
+			WeakHashMapEntry entry = elementData[i];
+			while (entry != null) {
+				if (entry.get() != null || entry.isNull)
+					size++;
+				entry = entry.next;
+			}
+		}
+		return size;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/META-INF/MANIFEST.MF?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/META-INF/MANIFEST.MF (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/META-INF/MANIFEST.MF Wed Nov 30 21:29:27 2005
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Harmony Math
+Bundle-SymbolicName: org.apache.harmony.math
+Bundle-Version: 1.0.0
+Bundle-ClassPath: .
+Eclipse-JREBundle: true
+Export-Package: java.math
+Import-Package: java.util
+Require-Bundle: org.apache.harmony.luni

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigDecimal.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigDecimal.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigDecimal.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigDecimal.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,371 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 java.math;
+
+/**
+ * BigDecimal objects represent an arbitrary precisioned decimal Number. They
+ * contain values that cannot be changed. Thus, most operations on the
+ * BigDecimal object yield new instances of BigDecimal.
+ * <p>
+ * BigDecimal is respresented by an unscaled BigInteger value and an integer
+ * representing the scale of the object. The scale of the BigDecimal is the
+ * number of digits after the decimal point. Eg. 1.234 would have a scale of 3
+ * and an unscaled value of 1234. Therefore, decimal representation of a
+ * BigDecimal is BigIntegerValue/10^scale.
+ * 
+ * @see java.math.BigInteger
+ */
+public class BigDecimal extends Number implements Comparable {
+
+	static final long serialVersionUID = 6108874887143696463L;
+
+	/**
+	 * Rounding mode Constants
+	 */
+	public final static int ROUND_UP = 0;
+
+	public final static int ROUND_DOWN = 1;
+
+	public final static int ROUND_CEILING = 2;
+
+	public final static int ROUND_FLOOR = 3;
+
+	public final static int ROUND_HALF_UP = 4;
+
+	public final static int ROUND_HALF_DOWN = 5;
+
+	public final static int ROUND_HALF_EVEN = 6;
+
+	public final static int ROUND_UNNECESSARY = 7;
+
+	/**
+	 * Constructs a BigDecimal with unscaled value initialized as bval and scale
+	 * as 0.
+	 */
+	public BigDecimal(BigInteger bval) {
+	}
+
+	/**
+	 * Constructs a BigDecimal with unscaled value initialized as bval and scale
+	 * as scale from the argument.
+	 */
+	public BigDecimal(BigInteger bval, int sc) {
+	}
+
+	/**
+	 * Constructs a BigDecimal with a double value as an arugment.
+	 * 
+	 * @exception NumberFormatException
+	 *                If the is Infinity, Negative Infinity or NaN.
+	 */
+	public BigDecimal(double bval) {
+	}
+
+	/**
+	 * Constructs a BigDecimal from the strong which can only contan digits of
+	 * 0-9, a decimal point and a negative sign.
+	 * 
+	 * @exception NumberFormatException
+	 *                If the argument contained characters other than digits.
+	 */
+	public BigDecimal(String bval) {
+	}
+
+	/**
+	 * Answers the absolute value of this BigDecimal.
+	 * 
+	 * @return BigDecimal absolute value of the receiver.
+	 */
+	public BigDecimal abs() {
+		return null;
+	}
+
+	/**
+	 * Answers the sum of the receiver and argument.
+	 * 
+	 * @return BigDecimal The sum of adding two BigDecimal.
+	 */
+	public BigDecimal add(BigDecimal bval) {
+		return null;
+	}
+
+	/**
+	 * Compares an receiver to the argument Object.
+	 * 
+	 * @return int 0 - equal; 1 - this > val; -1 - this < val
+	 * @exception ClassCastException
+	 *                if the argument is not of type BigDecimal
+	 */
+	public int compareTo(Object o) {
+		return 0;
+	}
+
+	/**
+	 * Compares the receiver BigDecimal and argument BigDecimal e.x 1.00 & 1.0
+	 * will return 0 in compareTo.
+	 * 
+	 * @return int 0 - equal; 1 - this > val; -1 - this < val.
+	 */
+	public int compareTo(BigDecimal bval) {
+		return 0;
+	}
+
+	/**
+	 * Answers the result of (this / val).
+	 * 
+	 * @return BigDecimal result of this/val.
+	 */
+	public BigDecimal divide(BigDecimal bval, int roundingMode) {
+		return null;
+	}
+
+	/**
+	 * Answers the result of (this / val) and whose scale is specified.
+	 * 
+	 * @return BigDecimal result of this/val.
+	 * @exception ArithmeticException
+	 *                division by zero.
+	 * @exception IllegalArgumentException
+	 *                roundingMode is not valid.
+	 */
+	public BigDecimal divide(BigDecimal bval, int bscale, int roundingMode) {
+		return null;
+	}
+
+	/**
+	 * Converts this BigDecimal to a double. If magnitude of the BigDecimal
+	 * value is larger than what can be represented by a double, either Infinity
+	 * or -Infinity is returned.
+	 * 
+	 * @return double the value of the receiver.
+	 */
+	public double doubleValue() {
+		return 0;
+	}
+
+	/**
+	 * Compares the argument to the receiver, and answers true if they represent
+	 * the <em>same</em> object using a class specific comparison. The
+	 * implementation in Object answers true only if the argument is the exact
+	 * same object as the receiver (==).
+	 * 
+	 * @param o
+	 *            Object the object to compare with this object.
+	 * @return boolean <code>true</code> if the object is the same as this
+	 *         object <code>false</code> if it is different from this object.
+	 * @see hashCode
+	 */
+	public boolean equals(Object obj) {
+		return false;
+	}
+
+	/**
+	 * Converts this BigDecimal to a float.If magnitude of the BigDecimal value
+	 * is larger than what can be represented by a float, either Infinity or
+	 * -Infinity is returned.
+	 * 
+	 * @return float the value of the receiver.
+	 */
+	public float floatValue() {
+		return 0;
+	}
+
+	/**
+	 * Answers an integer hash code for the receiver. Any two objects which
+	 * answer <code>true</code> when passed to <code>.equals</code> must
+	 * answer the same value for this method.
+	 * 
+	 * @return int the receiver's hash.
+	 * 
+	 * @see #equals(Object)
+	 */
+	public int hashCode() {
+		return 0;
+	}
+
+	/**
+	 * Converts this BigDecimal to an int.
+	 * 
+	 * @return int the value of the receiver.
+	 */
+	public int intValue() {
+		return 0;
+	}
+
+	/**
+	 * Converts this BigDecimal to a long.
+	 * 
+	 * @return long long representation of the receiver.
+	 */
+	public long longValue() {
+		return 0;
+	}
+
+	/**
+	 * Answers the max value between the receiver and this BigDecimal.
+	 * 
+	 * @return BigDecimal max BigDecimal.
+	 */
+	public BigDecimal max(BigDecimal bval) {
+		return null;
+	}
+
+	/**
+	 * Answers the min value between the receiver and argument.
+	 * 
+	 * @return BigDecimal max BigDecimal.
+	 */
+	public BigDecimal min(BigDecimal bval) {
+		return null;
+	}
+
+	/**
+	 * Moves the decimal point of this BigDecimal n places to the left.
+	 * 
+	 * @return BigDecimal new BigDecimal with decimal moved n places to the
+	 *         left.
+	 */
+	public BigDecimal movePointLeft(int n) {
+		return null;
+	}
+
+	/**
+	 * Moves the decimal point of this BigDecimal n places to the right.
+	 * 
+	 * @return BigDecimal new BigDecimal with decimal moved n places to the
+	 *         right.
+	 */
+	public BigDecimal movePointRight(int n) {
+		return null;
+	}
+
+	/**
+	 * Answers the multiplication result of the receiver and argument.
+	 * 
+	 * @return BigDecimal result of multiplying two bigDecimals.
+	 */
+	public BigDecimal multiply(BigDecimal bval) {
+		return null;
+	}
+
+	/**
+	 * Negates this BigDecimal value.
+	 * 
+	 * @return BigDecimal new BigDecimal with value negated.
+	 */
+	public BigDecimal negate() {
+		return null;
+	}
+
+	/**
+	 * Returns the scale of this BigDecimal.
+	 * 
+	 * @return int scale value.
+	 */
+	public int scale() {
+		return 0;
+	}
+
+	/**
+	 * Sets the scale of this BigDecimal.
+	 * 
+	 * @return BigDecimal a BigDecimal with the same value, but specified scale.
+	 */
+	public BigDecimal setScale(int newScale) {
+		return null;
+	}
+
+	/**
+	 * Sets the scale of this BigDecimal. The unscaled value is determined by
+	 * the rounding Mode
+	 * 
+	 * @return BigDecimal a BigDecimal with the same value, but specified cale.
+	 * @exception ArithmeticException
+	 *                rounding mode must be specified if lose of precision due
+	 *                to setting scale.
+	 * @exception IllegalArgumentException
+	 *                invalid rounding mode
+	 */
+	public BigDecimal setScale(int newScale, int roundingMode) {
+		return null;
+	}
+
+	/**
+	 * Answers the signum function of this instance.
+	 * 
+	 * @return int -1, 0, or 1 if the receiver is negative, zero, or positive.
+	 */
+	public int signum() {
+		return 0;
+	}
+
+	/**
+	 * Answers the subtract result of the receiver and argument.
+	 * 
+	 * @return BigDecimal The result of adding two BigDecimal.
+	 */
+	public BigDecimal subtract(BigDecimal bval) {
+		return null;
+	}
+
+	/**
+	 * Converts this to a BigInteger.
+	 * 
+	 * @return BigInteger BigDecimal equivalent of bigInteger.
+	 */
+	public BigInteger toBigInteger() {
+		return null;
+	}
+
+	/**
+	 * Answers a string containing a concise, human-readable description of the
+	 * receiver.
+	 * 
+	 * @return String a printable representation for the receiver.
+	 */
+	public String toString() {
+		return null;
+	}
+
+	/**
+	 * Returns an unscaled value of this BigDecimal.
+	 * 
+	 * @return BigInteger The unscaled value.
+	 */
+	public BigInteger unscaledValue() {
+		return null;
+	}
+
+	/**
+	 * Translate long value into a BigDecimal with scale of zero.
+	 * 
+	 * @return BigDecimal BigDecimal equivalence of a long value.
+	 */
+	public static BigDecimal valueOf(long bval) {
+		return null;
+	}
+
+	/**
+	 * Translate long unscaled value into a BigDecimal specified by the scale.
+	 * 
+	 * @return BigDecimal BigDecimal equalvalence of a long value.
+	 * @exception NumberFormatException
+	 *                the scale value is < 0;
+	 */
+	public static BigDecimal valueOf(long bval, int scale) {
+		return null;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigInteger.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigInteger.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigInteger.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/math/src/java/math/BigInteger.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,617 @@
+/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 java.math;
+
+import java.util.Random;
+
+
+/**
+ * BigInteger objects represent arbitrary precision decimal integers. They
+ * contain values that cannot be changed. Thus, most operations on the
+ * BigInteger objects yield new instances of BigInteger.
+ */
+public class BigInteger extends Number implements Comparable {
+	// Version ID indicating compatability with standard.
+	static final long serialVersionUID = -8287574255936472291L;
+
+	/**
+	 * Constant: 0 as represented by a BigInteger.
+	 */
+	public final static BigInteger ZERO = null;
+
+	/**
+	 * Constant: 1 as represented by a BigInteger.
+	 */
+	public final static BigInteger ONE = null;
+
+	/**
+	 * Answers a new instance of this class whose value is greater than zero,
+	 * length is the given number of bits, and whose likeyhood of being prime is
+	 * not less than 2 ^ -100.
+	 * 
+	 * @param bitLength
+	 *            the number of bits contained in the returned instance.
+	 * @param rnd
+	 *            a random source of bits for selection of the probable prime.
+	 * @return the probable prime number.
+	 */
+	public static BigInteger probablePrime(int bitLength, Random rnd) {
+		return null;
+	}
+
+	/**
+	 * Constructs a new instance of this class of the specified length, whose
+	 * content is produced by aquiring random bits from the specified random
+	 * number generator.
+	 * 
+	 * @param bitLength
+	 *            int the number of bits to have in the result.
+	 * @param rnd
+	 *            Random the generator to produce the bits.
+	 */
+	public BigInteger(int bitLength, Random rnd) {
+	}
+
+	/**
+	 * Constructs a new instance of this class of the specified length, whose
+	 * content is produced by aquiring random bits from the specified random
+	 * number generator. The result is guaranteed to be prime up to the given
+	 * degree of certainty.
+	 * 
+	 * @param bitLength
+	 *            int the number of bits to have in the result.
+	 * @param certainty
+	 *            int the degree of certainty required that the result is prime.
+	 * @param rnd
+	 *            Random the generator to produce the bits.
+	 */
+	public BigInteger(int bitLength, int certainty, Random rnd) {
+	}
+
+	/**
+	 * Constructs a new instance of this class given an array containing bytes
+	 * representing the bit pattern for the answer.
+	 * 
+	 * @param bytes
+	 *            byte[] the bits of the value of the new instance.
+	 */
+	public BigInteger(byte[] bytes) {
+	}
+
+	/**
+	 * Constructs a new instance of this class given an array containing bytes
+	 * representing the bit pattern for the answer, and a sign flag.
+	 * 
+	 * @param sign
+	 *            int the sign of the result.
+	 * @param bytes
+	 *            byte[] the bits of the value of the new instance.
+	 */
+	public BigInteger(int sign, byte[] bytes) {
+	}
+
+	/**
+	 * Answers an array of bytes containing the value of the receiver in the
+	 * same format used by the matching constructor.
+	 * 
+	 * @return byte[] the bits of the value of the receiver.
+	 */
+	public byte[] toByteArray() {
+		return null;
+	}
+
+	/**
+	 * Answers true if the receiver is probably prime to the given degree of
+	 * certainty.
+	 * 
+	 * @param certainty
+	 *            int the degree of certainty required.
+	 * @return boolean true if the receiver is prime and false otherwise.
+	 */
+	public boolean isProbablePrime(int certainty) {
+		return false;
+	}
+
+	/**
+	 * Compares the argument to the receiver, and answers true if they represent
+	 * the <em>same</em> object using a class specific comparison. In this
+	 * case the argument must also be a BigInteger which represents the same
+	 * number
+	 * 
+	 * @param o
+	 *            Object the object to compare with this object.
+	 * @return boolean <code>true</code> if the object is the same as this
+	 *         object <code>false</code> if it is different from this object.
+	 * @see #hashCode
+	 */
+	public boolean equals(Object o) {
+		return false;
+	}
+
+	/**
+	 * Answers an integer indicating the relative positions of the receiver and
+	 * the argument in the natural order of elements of the receiver's class.
+	 * 
+	 * @return int which should be <0 if the receiver should sort before the
+	 *         argument, 0 if the receiver should sort in the same position as
+	 *         the argument, and >0 if the receiver should sort after the
+	 *         argument.
+	 * @param val
+	 *            BigInteger an object to compare the receiver to
+	 * @exception ClassCastException
+	 *                if the argument can not be converted into something
+	 *                comparable with the receiver.
+	 */
+	public int compareTo(BigInteger val) {
+		return 0;
+	}
+
+	/**
+	 * Answers an integer indicating the relative positions of the receiver and
+	 * the argument in the natural order of elements of the receiver's class.
+	 * 
+	 * @return int which should be <0 if the receiver should sort before the
+	 *         argument, 0 if the receiver should sort in the same position as
+	 *         the argument, and >0 if the receiver should sort after the
+	 *         argument.
+	 * @param o
+	 *            Object an object to compare the receiver to
+	 * @exception ClassCastException
+	 *                if the argument can not be converted into something
+	 *                comparable with the receiver.
+	 */
+	public int compareTo(Object o) {
+		return 0;
+	}
+
+	/**
+	 * Answers the int value which the receiver represents
+	 * 
+	 * @return int the value of the receiver.
+	 */
+	public int intValue() {
+		return 0;
+	}
+
+	/**
+	 * Answers the long value which the receiver represents
+	 * 
+	 * @return long the value of the receiver.
+	 */
+	public long longValue() {
+		return 0;
+	}
+
+	/**
+	 * Answers a BigInteger with the same value as val
+	 * 
+	 * @return BigInteger (BigInteger) val
+	 */
+	public static BigInteger valueOf(long val) {
+		return null;
+	}
+
+	/**
+	 * Answers the sum of the receiver and a BigInteger
+	 * 
+	 * @param val
+	 *            a BigInteger to add
+	 * 
+	 * @return BigInteger this + val
+	 */
+	public BigInteger add(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the negative of the receiver
+	 * 
+	 * @return BigInteger (-1) * this
+	 */
+	public BigInteger negate() {
+		return null;
+	}
+
+	/**
+	 * Answers the sign of the receiver
+	 * 
+	 * @return BigInteger -1, 0, or 1 if the receiver is negative, zero, or
+	 *         positive
+	 */
+	public int signum() {
+		return 0;
+	}
+
+	/**
+	 * Answers the absolute value of the receiver
+	 * 
+	 * @return BigInteger absolute value of the receiver
+	 */
+	public BigInteger abs() {
+		return null;
+	}
+
+	/**
+	 * Answers the receiver to the power of exponent.
+	 * 
+	 * @exception ArithmeticException
+	 *                if the exponent is negative.
+	 * 
+	 * @return BigInteger this ^ exponent
+	 */
+	public BigInteger pow(int exponent) {
+		return null;
+	}
+
+	/**
+	 * Answers the receiver to the power of exponent modulo a BigInteger
+	 * 
+	 * @exception ArithmeticException
+	 *                modulo is <= 0
+	 * 
+	 * @return BigInteger this ^ exponent (mod modulo)
+	 */
+	public BigInteger modPow(BigInteger exponent, BigInteger modulo) {
+		return null;
+	}
+
+	/**
+	 * Answers the greatest common divisor of abs(this) and abs(val), zero if
+	 * this==val==0
+	 * 
+	 * @return BigInteger gcd(abs(this), abs(val))
+	 */
+	public BigInteger gcd(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the inverse of the receiver modulo a BigInteger, if it exists.
+	 * 
+	 * @param modulo
+	 *            BigInteger a BigInteger to divide
+	 * @return BigInteger this^(-1) (mod modulo)
+	 * 
+	 * @exception ArithmeticException
+	 *                if modulo is <= 0, or gcd(this,modulo) != 1
+	 */
+	public BigInteger modInverse(BigInteger modulo) {
+		return null;
+	}
+
+	/**
+	 * Answers the index of the lowest set bit in the receiver, or -1 if no bits
+	 * are set.
+	 * 
+	 * @return BigInteger the bit index of the least significant set bit in the
+	 *         receiver.
+	 */
+	public int getLowestSetBit() {
+		return 0;
+	}
+
+	/**
+	 * Answers a BigInteger with the value of the reciever divided by
+	 * 2^shiftval.
+	 * 
+	 * @param shiftval
+	 *            int the amount to shift the receiver.
+	 * @return BigInteger this >> val
+	 */
+	public BigInteger shiftRight(int shiftval) {
+		return null;
+	}
+
+	/**
+	 * Answers a BigInteger with the value of the reciever multiplied by
+	 * 2^shiftval.
+	 * 
+	 * @param shiftval
+	 *            int the amount to shift the receiver.
+	 * @return BigInteger this << val
+	 */
+	public BigInteger shiftLeft(int shiftval) {
+		return null;
+	}
+
+	/**
+	 * Answers the difference of the receiver and a BigInteger.
+	 * 
+	 * @param val
+	 *            BigInteger the value to subtract
+	 * @return BigInteger this - val
+	 */
+	public BigInteger subtract(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the product of the receiver and a BigInteger.
+	 * 
+	 * @param val
+	 *            BigInteger the value to multiply
+	 * @return BigInteger this * val
+	 */
+	public BigInteger multiply(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the quotient of the receiver and a BigInteger.
+	 * 
+	 * @param val
+	 *            BigInteger the value to divide
+	 * @return BigInteger this / val
+	 * 
+	 * @exception ArithmeticException
+	 *                if val is zero.
+	 */
+	public BigInteger divide(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the remainder of the receiver divided by a BigInteger
+	 * 
+	 * @param val
+	 *            a BigInteger to divide
+	 * 
+	 * @exception ArithmeticException
+	 *                if val is zero
+	 * 
+	 * @return BigInteger this % val
+	 */
+	public BigInteger remainder(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the remainder of the receiver modulo a BigInteger (a positive
+	 * value).
+	 * 
+	 * @param val
+	 *            the value to divide
+	 * @return BigInteger this (mod val)
+	 * 
+	 * @exception ArithmeticException
+	 *                if val is zero
+	 */
+	public BigInteger mod(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the quotient and remainder of the receiver divided by a
+	 * BigInteger.
+	 * 
+	 * @param val
+	 *            BigInteger the value to divide.
+	 * @return BigInteger[2] {this / val, this % val )}
+	 * 
+	 * @exception ArithmeticException
+	 *                if val is zero.
+	 */
+	public BigInteger[] divideAndRemainder(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Constructs a new instance of this class given a string containing a
+	 * representation of a decimal number.
+	 * 
+	 * @param val
+	 *            String the decimal digits of the answer.
+	 */
+	public BigInteger(String val) {
+	}
+
+	/**
+	 * Constructs a new instance of this class given a string containing digits
+	 * in the specified radix.
+	 * 
+	 * @param val
+	 *            String the digits of the answer.
+	 * @param radix
+	 *            int the radix to use for conversion.
+	 */
+	public BigInteger(String val, int radix) {
+	}
+
+	/**
+	 * Answers a string containing a concise, human-readable description of the
+	 * receiver. In this case, a string of decimal digits.
+	 * 
+	 * @return String a printable representation for the receiver.
+	 */
+	public String toString() {
+		return this.toString(10);
+	}
+
+	/**
+	 * Answers a string containing a concise, human-readable description of the
+	 * receiver as a sequence of digits in the specified radix.
+	 * 
+	 * @return String a printable representation for the receiver.
+	 */
+	public String toString(int radix) {
+		return null;
+	}
+
+	/**
+	 * Answers the most positive of either the receiver or the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to compare.
+	 * @return BigInteger the larger value.
+	 */
+	public BigInteger max(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the most negative of either the receiver or the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to compare.
+	 * @return BigInteger the smaller value.
+	 */
+	public BigInteger min(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers an integer hash code for the receiver. Any two objects which
+	 * answer <code>true</code> when passed to <code>.equals</code> must
+	 * answer the same value for this method.
+	 * 
+	 * @return int the receiver's hash.
+	 * 
+	 * @see #equals
+	 */
+	public int hashCode() {
+		return 0;
+	}
+
+	/**
+	 * Answers true if the specified bit is set in the receiver.
+	 * 
+	 * @param n
+	 *            int the bit to check.
+	 * @return boolean if the specified bit is set.
+	 */
+	public boolean testBit(int n) {
+		return false;
+	}
+
+	/**
+	 * Sets the specified bit in the receiver.
+	 * 
+	 * @param n
+	 *            int the bit to set.
+	 */
+	public BigInteger setBit(int n) {
+		return null;
+	}
+
+	/**
+	 * Unsets the specified bit in the receiver.
+	 * 
+	 * @param n
+	 *            int the bit to clear.
+	 */
+	public BigInteger clearBit(int n) {
+		return null;
+	}
+
+	/**
+	 * Toggles the specified bit in the receiver.
+	 * 
+	 * @param n
+	 *            int the bit to flip.
+	 */
+	public BigInteger flipBit(int n) {
+		return null;
+	}
+
+	/**
+	 * Answers the bitwise AND of the receiver and the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to AND.
+	 * @return BigInteger this & val
+	 */
+	public BigInteger and(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the bitwise OR of the receiver and the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to OR.
+	 * @return BigInteger this | val
+	 */
+	public BigInteger or(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the bitwise XOR of the receiver and the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to XOR.
+	 * @return BigInteger this XOR val
+	 */
+	public BigInteger xor(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the bitwise negation of the receiver.
+	 * 
+	 * @return BigInteger NOT(this)
+	 */
+	public BigInteger not() {
+		return null;
+	}
+
+	/**
+	 * Answers the bitwise NAND of the receiver and the argument.
+	 * 
+	 * @param val
+	 *            BigInteger the value to NAND.
+	 * @return BigInteger this & NOT(val)
+	 */
+	public BigInteger andNot(BigInteger val) {
+		return null;
+	}
+
+	/**
+	 * Answers the length in bits of the receiver.
+	 * 
+	 * @return int the receiver's bit length.
+	 */
+	public int bitLength() {
+		return 0;
+	}
+
+	/**
+	 * Answers the number of set bits in the receiver.
+	 * 
+	 * @return int the receiver's bit count.
+	 */
+	public int bitCount() {
+		return 0;
+	}
+
+	/**
+	 * Answers the double value which the receiver represents
+	 * 
+	 * @return double the value of the receiver.
+	 */
+	public double doubleValue() {
+		return 0;
+	}
+
+	/**
+	 * Answers the float value which the receiver represents
+	 * 
+	 * @return float the value of the receiver.
+	 */
+	public float floatValue() {
+		return 0;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/META-INF/MANIFEST.MF?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/META-INF/MANIFEST.MF (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/META-INF/MANIFEST.MF Wed Nov 30 21:29:27 2005
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Harmony NIO
+Bundle-SymbolicName: org.apache.harmony.nio
+Bundle-Version: 1.0.0
+Bundle-ClassPath: .
+Eclipse-JREBundle: true
+Export-Package: java.nio,
+ java.nio.channels,
+ java.nio.channels.spi,
+ com.ibm.io.nio.factory
+Import-Package: java.io,
+ java.lang,
+ java.lang.ref,
+ java.net,
+ java.nio.charset,
+ java.util
+Require-Bundle: org.apache.harmony.luni,
+ org.apache.harmony.nio_char
+

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BaseByteBuffer.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BaseByteBuffer.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BaseByteBuffer.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BaseByteBuffer.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,76 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.LongBuffer;
+import java.nio.ShortBuffer;
+
+/**
+ * Serves as the root of other byte buffer impl classes, implements common
+ * methods that can be shared by child classes.
+ * 
+ */
+abstract class BaseByteBuffer extends ByteBuffer {
+
+	protected BaseByteBuffer(int capacity) {
+		super(capacity);
+	}
+
+	public final CharBuffer asCharBuffer() {
+		return CharToByteBufferAdapter.wrap(this);
+	}
+
+	public final DoubleBuffer asDoubleBuffer() {
+		return DoubleToByteBufferAdapter.wrap(this);
+	}
+
+	public final FloatBuffer asFloatBuffer() {
+		return FloatToByteBufferAdapter.wrap(this);
+	}
+
+	public final IntBuffer asIntBuffer() {
+		return IntToByteBufferAdapter.wrap(this);
+	}
+
+	public final LongBuffer asLongBuffer() {
+		return LongToByteBufferAdapter.wrap(this);
+	}
+
+	public final ShortBuffer asShortBuffer() {
+		return ShortToByteBufferAdapter.wrap(this);
+	}
+
+	public final char getChar() {
+		return (char) getShort();
+	}
+
+	public final char getChar(int index) {
+		return (char) getShort(index);
+	}
+
+	public final ByteBuffer putChar(char value) {
+		return putShort((short) value);
+	}
+
+	public final ByteBuffer putChar(int index, char value) {
+		return putShort(index, (short) value);
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BufferFactory.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BufferFactory.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BufferFactory.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/BufferFactory.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,235 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.io.File;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.DoubleBuffer;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.LongBuffer;
+import java.nio.MappedByteBuffer;
+import java.nio.ShortBuffer;
+import java.nio.channels.FileChannel.MapMode;
+
+/**
+ * Provide factory service of buffer classes.
+ * <p>
+ * Since all buffer impl classes are package private (except DirectByteBuffer),
+ * this factory is the only entrance to access buffer functions from outside of
+ * the impl package.
+ * </p>
+ * 
+ */
+public final class BufferFactory {
+
+	/**
+	 * Returns a new byte buffer based on the specified byte array.
+	 * 
+	 * @param array
+	 *            The byte array
+	 * @return A new byte buffer based on the specified byte array.
+	 */
+	public static ByteBuffer newByteBuffer(byte array[]) {
+		return new ReadWriteHeapByteBuffer(array);
+	}
+
+	/**
+	 * Returns a new array based byte buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based byte buffer with the specified capacity.
+	 */
+	public static ByteBuffer newByteBuffer(int capacity) {
+		return new ReadWriteHeapByteBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new char buffer based on the specified char array.
+	 * 
+	 * @param array
+	 *            The char array
+	 * @return A new char buffer based on the specified char array.
+	 */
+	public static CharBuffer newCharBuffer(char array[]) {
+		return new ReadWriteCharArrayBuffer(array);
+	}
+
+	/**
+	 * Returns a new readonly char buffer based on the specified char sequence.
+	 * 
+	 * @param chseq
+	 *            The char sequence
+	 * @return A new readonly char buffer based on the specified char sequence.
+	 */
+	public static CharBuffer newCharBuffer(CharSequence chseq) {
+		return new CharSequenceAdapter(chseq);
+	}
+
+	/**
+	 * Returns a new array based char buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based char buffer with the specified capacity.
+	 */
+	public static CharBuffer newCharBuffer(int capacity) {
+		return new ReadWriteCharArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new direct byte buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new direct byte buffer with the specified capacity.
+	 */
+	public static ByteBuffer newDirectByteBuffer(int capacity) {
+		return new ReadWriteDirectByteBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new double buffer based on the specified double array.
+	 * 
+	 * @param array
+	 *            The double array
+	 * @return A new double buffer based on the specified double array.
+	 */
+	public static DoubleBuffer newDoubleBuffer(double array[]) {
+		return new ReadWriteDoubleArrayBuffer(array);
+	}
+
+	/**
+	 * Returns a new array based double buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based double buffer with the specified capacity.
+	 */
+	public static DoubleBuffer newDoubleBuffer(int capacity) {
+		return new ReadWriteDoubleArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new float buffer based on the specified float array.
+	 * 
+	 * @param array
+	 *            The float array
+	 * @return A new float buffer based on the specified float array.
+	 */
+	public static FloatBuffer newFloatBuffer(float array[]) {
+		return new ReadWriteFloatArrayBuffer(array);
+	}
+
+	/**
+	 * Returns a new array based float buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based float buffer with the specified capacity.
+	 */
+	public static FloatBuffer newFloatBuffer(int capacity) {
+		return new ReadWriteFloatArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new array based int buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based int buffer with the specified capacity.
+	 */
+	public static IntBuffer newIntBuffer(int capacity) {
+		return new ReadWriteIntArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new int buffer based on the specified int array.
+	 * 
+	 * @param array
+	 *            The int array
+	 * @return A new int buffer based on the specified int array.
+	 */
+	public static IntBuffer newIntBuffer(int array[]) {
+		return new ReadWriteIntArrayBuffer(array);
+	}
+
+	/**
+	 * Returns a new array based long buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based long buffer with the specified capacity.
+	 */
+	public static LongBuffer newLongBuffer(int capacity) {
+		return new ReadWriteLongArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new long buffer based on the specified long array.
+	 * 
+	 * @param array
+	 *            The long array
+	 * @return A new long buffer based on the specified long array.
+	 */
+	public static LongBuffer newLongBuffer(long array[]) {
+		return new ReadWriteLongArrayBuffer(array);
+	}
+
+	/**
+	 * Returns a new byte buffer mapped to the specified region of file.
+	 * 
+	 * @param mappedFile
+	 *            The file to be mapped
+	 * @param offset
+	 *            The offset of the region
+	 * @param size
+	 *            The size of the region
+	 * @param mapMode
+	 *            The map mode
+	 * @return A new byte buffer mapped to the specified region of file.
+	 */
+	public static MappedByteBuffer newMappedByteBuffer(File mappedFile,
+			long offset, int size, MapMode mapMode) {
+		return new MappedToByteBufferAdapter(mappedFile, offset, size, mapMode);
+	}
+
+	/**
+	 * Returns a new array based short buffer with the specified capacity.
+	 * 
+	 * @param capacity
+	 *            The capacity of the new buffer
+	 * @return A new array based short buffer with the specified capacity.
+	 */
+	public static ShortBuffer newShortBuffer(int capacity) {
+		return new ReadWriteShortArrayBuffer(capacity);
+	}
+
+	/**
+	 * Returns a new short buffer based on the specified short array.
+	 * 
+	 * @param array
+	 *            The short array
+	 * @return A new short buffer based on the specified short array.
+	 */
+	public static ShortBuffer newShortBuffer(short array[]) {
+		return new ReadWriteShortArrayBuffer(array);
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharArrayBuffer.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharArrayBuffer.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharArrayBuffer.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharArrayBuffer.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,93 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteOrder;
+import java.nio.CharBuffer;
+
+/**
+ * CharArrayBuffer, ReadWriteCharArrayBuffer and ReadOnlyCharArrayBuffer compose
+ * the implementation of array based char buffers.
+ * <p>
+ * CharArrayBuffer implements all the shared readonly methods and is extended by
+ * the other two classes.
+ * </p>
+ * <p>
+ * All methods are marked final for runtime performance.
+ * </p>
+ * 
+ */
+abstract class CharArrayBuffer extends CharBuffer {
+
+	protected final char[] backingArray;
+
+	protected final int offset;
+
+	CharArrayBuffer(char[] array) {
+		this(array.length, array, 0);
+	}
+
+	CharArrayBuffer(int capacity) {
+		this(capacity, new char[capacity], 0);
+	}
+
+	CharArrayBuffer(int capacity, char[] backingArray, int offset) {
+		super(capacity);
+		this.backingArray = backingArray;
+		this.offset = offset;
+	}
+
+	public final char get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return backingArray[offset + position++];
+	}
+
+	public final char get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return backingArray[offset + index];
+	}
+
+	public final boolean isDirect() {
+		return false;
+	}
+
+	public final ByteOrder order() {
+		return ByteOrder.nativeOrder();
+	}
+
+	public final CharSequence subSequence(int start, int end) {
+		if (start < 0 || start > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		if (end < start || end > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		CharBuffer result = duplicate();
+		result.limit(position + end);
+		result.position(position + start);
+		return result;
+	}
+
+	public final String toString() {
+		return String.copyValueOf(backingArray, offset + position, remaining());
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharSequenceAdapter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharSequenceAdapter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharSequenceAdapter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharSequenceAdapter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,125 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteOrder;
+import java.nio.CharBuffer;
+import java.nio.ReadOnlyBufferException;
+
+/**
+ * This class wraps a char sequence to be a char buffer.
+ * <p>
+ * Implementation notice:
+ * <ul>
+ * <li>Char sequence based buffer is always readonly.</li>
+ * </ul>
+ * </p>
+ * 
+ */
+final class CharSequenceAdapter extends CharBuffer {
+
+	static CharSequenceAdapter copy(CharSequenceAdapter other) {
+		CharSequenceAdapter buf = new CharSequenceAdapter(other.sequence);
+		buf.limit = other.limit;
+		buf.position = other.position;
+		buf.mark = other.mark;
+		return buf;
+	}
+
+	final CharSequence sequence;
+
+	CharSequenceAdapter(CharSequence chseq) {
+		super(chseq.length());
+		sequence = chseq;
+	}
+
+	public CharBuffer asReadOnlyBuffer() {
+		return duplicate();
+	}
+
+	public CharBuffer compact() {
+		throw new ReadOnlyBufferException();
+	}
+
+	public CharBuffer duplicate() {
+		return copy(this);
+	}
+
+	public char get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return sequence.charAt(position++);
+	}
+
+	public char get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return sequence.charAt(index);
+	}
+
+	public boolean isDirect() {
+		return false;
+	}
+
+	public boolean isReadOnly() {
+		return true;
+	}
+
+	public ByteOrder order() {
+		return ByteOrder.nativeOrder();
+	}
+
+	protected char[] protectedArray() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected int protectedArrayOffset() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected boolean protectedHasArray() {
+		return false;
+	}
+
+	public CharBuffer put(char c) {
+		throw new ReadOnlyBufferException();
+	}
+
+	public CharBuffer put(int index, char c) {
+		throw new ReadOnlyBufferException();
+	}
+
+	public CharBuffer slice() {
+		return new CharSequenceAdapter(sequence.subSequence(position, limit));
+	}
+
+	public CharSequence subSequence(int start, int end) {
+		if (start < 0 || start > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		if (end < start || end > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		CharSequenceAdapter result = copy(this);
+		result.position = position + start;
+		result.limit = position + end;
+		return result;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharToByteBufferAdapter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharToByteBufferAdapter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharToByteBufferAdapter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/CharToByteBufferAdapter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,159 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.nio.BufferOverflowException;
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.CharBuffer;
+import java.nio.ReadOnlyBufferException;
+
+/**
+ * This class wraps a byte buffer to be a char buffer.
+ * <p>
+ * Implementation notice:
+ * <ul>
+ * <li>After a byte buffer instance is wrapped, it becomes privately owned by
+ * the adapter. It must NOT be accessed outside the adapter any more.</li>
+ * <li>The byte buffer's position and limit are NOT linked with the adapter.
+ * The adapter extends Buffer, thus has its own position and limit.</li>
+ * </ul>
+ * </p>
+ * 
+ */
+final class CharToByteBufferAdapter extends CharBuffer {
+
+	static CharBuffer wrap(ByteBuffer byteBuffer) {
+		return new CharToByteBufferAdapter(byteBuffer.slice());
+	}
+
+	private final ByteBuffer byteBuffer;
+
+	CharToByteBufferAdapter(ByteBuffer byteBuffer) {
+		super((byteBuffer.capacity() >> 1));
+		this.byteBuffer = byteBuffer;
+		this.byteBuffer.clear();
+	}
+
+	public CharBuffer asReadOnlyBuffer() {
+		CharToByteBufferAdapter buf = new CharToByteBufferAdapter(byteBuffer
+				.asReadOnlyBuffer());
+		buf.limit = limit;
+		buf.position = position;
+		buf.mark = mark;
+		return buf;
+	}
+
+	public CharBuffer compact() {
+		if (byteBuffer.isReadOnly()) {
+			throw new ReadOnlyBufferException();
+		}
+		byteBuffer.limit(limit << 1);
+		byteBuffer.position(position << 1);
+		byteBuffer.compact();
+		byteBuffer.clear();
+		position = limit - position;
+		limit = capacity;
+		mark = UNSET_MARK;
+		return this;
+	}
+
+	public CharBuffer duplicate() {
+		CharToByteBufferAdapter buf = new CharToByteBufferAdapter(byteBuffer
+				.duplicate());
+		buf.limit = limit;
+		buf.position = position;
+		buf.mark = mark;
+		return buf;
+	}
+
+	public char get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return byteBuffer.getChar(position++ << 1);
+	}
+
+	public char get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return byteBuffer.getChar(index << 1);
+	}
+
+	public boolean isDirect() {
+		return byteBuffer.isDirect();
+	}
+
+	public boolean isReadOnly() {
+		return byteBuffer.isReadOnly();
+	}
+
+	public ByteOrder order() {
+		return byteBuffer.order();
+	}
+
+	protected char[] protectedArray() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected int protectedArrayOffset() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected boolean protectedHasArray() {
+		return false;
+	}
+
+	public CharBuffer put(char c) {
+		if (position == limit) {
+			throw new BufferOverflowException();
+		}
+		byteBuffer.putChar(position++ << 1, c);
+		return this;
+	}
+
+	public CharBuffer put(int index, char c) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		byteBuffer.putChar(index << 1, c);
+		return this;
+	}
+
+	public CharBuffer slice() {
+		byteBuffer.limit(limit << 1);
+		byteBuffer.position(position << 1);
+		CharBuffer result = new CharToByteBufferAdapter(byteBuffer.slice());
+		byteBuffer.clear();
+		return result;
+	}
+
+	public CharSequence subSequence(int start, int end) {
+		if (start < 0 || start > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		if (end < start || end > remaining()) {
+			throw new IndexOutOfBoundsException();
+		}
+		CharBuffer result = duplicate();
+		result.limit(position + end);
+		result.position(position + start);
+		return result;
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffer.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffer.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffer.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffer.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,231 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.nio.BufferUnderflowException;
+
+import com.ibm.platform.struct.PlatformAddress;
+
+/**
+ * DirectByteBuffer, ReadWriteDirectByteBuffer and ReadOnlyDirectByteBuffer
+ * compose the implementation of platform memory based byte buffers.
+ * <p>
+ * DirectByteBuffer implements all the shared readonly methods and is extended
+ * by the other two classes.
+ * </p>
+ * <p>
+ * All methods are marked final for runtime performance.
+ * </p>
+ * 
+ */
+abstract class DirectByteBuffer extends BaseByteBuffer {
+
+	// This private class will help us track whether the address is valid or
+	// not.
+	protected static final class SafeAddress {
+		protected boolean isValid = true;
+
+		protected final PlatformAddress address;
+
+		protected SafeAddress(PlatformAddress address) {
+			super();
+			this.address = address;
+		}
+	}
+
+	// This is a wrapped reference to the base address of the buffer memory.
+	protected final SafeAddress safeAddress;
+
+	// This is the offset from the base address at which this buffer logically
+	// starts.
+	protected final int offset;
+
+	DirectByteBuffer(int capacity) {
+		this(new SafeAddress(PlatformAddress.alloc(capacity)), capacity, 0);
+		safeAddress.address.autoFree();
+	}
+
+	DirectByteBuffer(SafeAddress address, int capacity, int offset) {
+		super(capacity);
+		this.safeAddress = address;
+		this.offset = offset;
+	}
+
+	public final byte get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return getBaseAddress().getByte(offset + position++);
+	}
+
+	public final byte get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getByte(offset + index);
+	}
+
+	public final double getDouble() {
+		int newPosition = position + 8;
+		if (newPosition > limit) {
+			throw new BufferUnderflowException();
+		}
+		double result = getBaseAddress().getDouble(offset + position, order);
+		position = newPosition;
+		return result;
+	}
+
+	public final double getDouble(int index) {
+		if (index < 0 || index + 8 > limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getDouble(offset + index, order);
+	}
+
+	public final float getFloat() {
+		int newPosition = position + 4;
+		if (newPosition > limit) {
+			throw new BufferUnderflowException();
+		}
+		float result = getBaseAddress().getFloat(offset + position, order);
+		position = newPosition;
+		return result;
+	}
+
+	public final float getFloat(int index) {
+		if (index < 0 || index + 4 > limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getFloat(offset + index, order);
+	}
+
+	public final int getInt() {
+		int newPosition = position + 4;
+		if (newPosition > limit) {
+			throw new BufferUnderflowException();
+		}
+		int result = getBaseAddress().getInt(offset + position, order);
+		position = newPosition;
+		return result;
+	}
+
+	public final int getInt(int index) {
+		if (index < 0 || index + 4 > limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getInt(offset + index, order);
+	}
+
+	public final long getLong() {
+		int newPosition = position + 8;
+		if (newPosition > limit) {
+			throw new BufferUnderflowException();
+		}
+		long result = getBaseAddress().getLong(offset + position, order);
+		position = newPosition;
+		return result;
+	}
+
+	public final long getLong(int index) {
+		if (index < 0 || index + 8 > limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getLong(offset + index, order);
+	}
+
+	public final short getShort() {
+		int newPosition = position + 2;
+		if (newPosition > limit) {
+			throw new BufferUnderflowException();
+		}
+		short result = getBaseAddress().getShort(offset + position, order);
+		position = newPosition;
+		return result;
+	}
+
+	public final short getShort(int index) {
+		if (index < 0 || index + 2 > limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return getBaseAddress().getShort(offset + index, order);
+	}
+
+	public final boolean isDirect() {
+		return true;
+	}
+
+	protected final boolean isAddressValid() {
+		return safeAddress.isValid;
+	}
+
+	protected final void addressValidityCheck() {
+		if (!isAddressValid()) {
+			throw new IllegalStateException(
+					"Cannot use the direct byte buffer after it has been explicitly freed."); //$NON-NLS-1$
+		}
+	}
+
+	private void markAddressInvalid() {
+		safeAddress.isValid = false;
+	}
+
+	/*
+	 * Answers the base address of the buffer (i.e. before offset).
+	 */
+	protected final PlatformAddress getBaseAddress() {
+		addressValidityCheck();
+		return safeAddress.address;
+	}
+
+	/**
+	 * Answers the platform address of the start of this buffer instance.
+	 * <em>You must not attempt to free the returned address!!</em> It may not
+	 * be an address that was explicitly malloc'ed (i.e. if this buffer is the
+	 * result of a split); and it may be memory shared by multiple buffers.
+	 * <p>
+	 * If you can guarantee that you want to free the underlying memory call the
+	 * #free() method on this instance -- generally applications will rely on
+	 * the garbage collector to autofree this memory.
+	 * </p>
+	 * 
+	 * @return the effective address of the start of the buffer.
+	 * @throws IllegalStateException
+	 *             if this buffer address is known to have been freed
+	 *             previously.
+	 */
+	final PlatformAddress getEffectiveAddress() {
+		return getBaseAddress().offsetBytes(offset);
+	}
+
+	/**
+	 * Explicitly free the memory used by this direct byte buffer. If the memory
+	 * has already been freed then this is a no-op. Once the memory has been
+	 * freed then operations requiring access to the memory will throw an
+	 * <code>IllegalStateException</code>.
+	 * <p>
+	 * Note this is is possible that the memory is freed by code that reaches
+	 * into the address and explicitly frees it 'beneith' us -- this is bad
+	 * form.
+	 * </p>
+	 */
+	final void free() {
+		if (isAddressValid()) {
+			markAddressInvalid();
+			safeAddress.address.free();
+		}
+	}
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffers.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffers.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffers.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DirectByteBuffers.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,86 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio; 
+
+
+import java.nio.ByteBuffer;
+
+import com.ibm.platform.struct.PlatformAddress;
+
+/**
+ * Helper class for operations on direct ByteBuffer
+ * 
+ * @see java.nio.ByteBuffer
+ */
+public class DirectByteBuffers {
+
+	/**
+	 * Explicitly frees the memory used by the given direct byte buffer.
+	 * <p>
+	 * If the memory is known to already have been freed then this is a no-op.
+	 * Once the memory has been freed then operations requiring access to the
+	 * memory will throw an <code>IllegalStateException</code>.
+	 * </p>
+	 * <p>
+	 * Note this is is possible that the memory is freed by code that reaches
+	 * into the address and explicitly frees it 'beneith' us -- this is bad
+	 * form.
+	 * </p>
+	 * 
+	 * @param directBuffer
+	 *            the direct byte buffer memory to free
+	 * @throws IllegalArgumentException
+	 *             if the buffer is <code>null</code> or is not a
+	 *             <em>direct</em> byte buffer.
+	 */
+	public static void free(ByteBuffer directBuffer) {
+		if ((directBuffer == null) || (!directBuffer.isDirect())) {
+			throw new IllegalArgumentException();
+		}
+		DirectByteBuffer buf = (DirectByteBuffer) directBuffer;
+		buf.free();
+	}
+
+	/**
+	 * Answers the platform address of the start of this buffer instance.
+	 * <em>You must not attempt to free the returned address!!</em> It may not
+	 * be an address that was explicitly malloc'ed (i.e. if this buffer is the
+	 * result of a split); and it may be memory shared by multiple buffers.
+	 * <p>
+	 * If you can guarantee that you want to free the underlying memory call the
+	 * #free() method on this instance -- generally applications will rely on
+	 * the garbage collector to autofree this memory.
+	 * </p>
+	 * 
+	 * @param directBuffer
+	 *            the direct byte buffer
+	 * @return the effective address of the start of the buffer.
+	 * @throws IllegalStateException
+	 *             if this buffer address is known to have been freed
+	 *             previously.
+	 */
+	public static PlatformAddress getEffectiveAddress(ByteBuffer directBuffer) {
+		return toDirectBuffer(directBuffer).getEffectiveAddress();
+	}
+
+	private static DirectByteBuffer toDirectBuffer(ByteBuffer directBuffer) {
+		if ((directBuffer == null) || (!directBuffer.isDirect())) {
+			throw new IllegalArgumentException();
+		}
+		return (DirectByteBuffer) directBuffer;
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleArrayBuffer.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleArrayBuffer.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleArrayBuffer.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleArrayBuffer.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,77 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio; 
+
+
+import java.nio.BufferUnderflowException;
+import java.nio.ByteOrder;
+import java.nio.DoubleBuffer;
+
+/**
+ * DoubleArrayBuffer, ReadWriteDoubleArrayBuffer and ReadOnlyDoubleArrayBuffer
+ * compose the implementation of array based double buffers.
+ * <p>
+ * DoubleArrayBuffer implements all the shared readonly methods and is extended
+ * by the other two classes.
+ * </p>
+ * <p>
+ * All methods are marked final for runtime performance.
+ * </p>
+ * 
+ */
+abstract class DoubleArrayBuffer extends DoubleBuffer {
+
+	protected final double[] backingArray;
+
+	protected final int offset;
+
+	DoubleArrayBuffer(double[] array) {
+		this(array.length, array, 0);
+	}
+
+	DoubleArrayBuffer(int capacity) {
+		this(capacity, new double[capacity], 0);
+	}
+
+	DoubleArrayBuffer(int capacity, double[] backingArray, int offset) {
+		super(capacity);
+		this.backingArray = backingArray;
+		this.offset = offset;
+	}
+
+	public final double get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return backingArray[offset + position++];
+	}
+
+	public final double get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return backingArray[offset + index];
+	}
+
+	public final boolean isDirect() {
+		return false;
+	}
+
+	public final ByteOrder order() {
+		return ByteOrder.nativeOrder();
+	}
+
+}

Added: incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleToByteBufferAdapter.java
URL: http://svn.apache.org/viewcvs/incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleToByteBufferAdapter.java?rev=350181&view=auto
==============================================================================
--- incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleToByteBufferAdapter.java (added)
+++ incubator/harmony/enhanced/trunk/sandbox/contribs/ibm_core/java-src/nio/src/com/ibm/io/nio/DoubleToByteBufferAdapter.java Wed Nov 30 21:29:27 2005
@@ -0,0 +1,147 @@
+/* Copyright 2004 The Apache Software Foundation or its licensors, as applicable
+ * 
+ * Licensed 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 com.ibm.io.nio;
+
+
+import java.nio.BufferOverflowException;
+import java.nio.BufferUnderflowException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.DoubleBuffer;
+import java.nio.ReadOnlyBufferException;
+
+/**
+ * This class wraps a byte buffer to be a double buffer.
+ * <p>
+ * Implementation notice:
+ * <ul>
+ * <li>After a byte buffer instance is wrapped, it becomes privately owned by
+ * the adapter. It must NOT be accessed outside the adapter any more.</li>
+ * <li>The byte buffer's position and limit are NOT linked with the adapter.
+ * The adapter extends Buffer, thus has its own position and limit.</li>
+ * </ul>
+ * </p>
+ * 
+ */
+final class DoubleToByteBufferAdapter extends DoubleBuffer {
+
+	static DoubleBuffer wrap(ByteBuffer byteBuffer) {
+		return new DoubleToByteBufferAdapter(byteBuffer.slice());
+	}
+
+	private final ByteBuffer byteBuffer;
+
+	DoubleToByteBufferAdapter(ByteBuffer byteBuffer) {
+		super((byteBuffer.capacity() >> 3));
+		this.byteBuffer = byteBuffer;
+		this.byteBuffer.clear();
+	}
+
+	public DoubleBuffer asReadOnlyBuffer() {
+		DoubleToByteBufferAdapter buf = new DoubleToByteBufferAdapter(
+				byteBuffer.asReadOnlyBuffer());
+		buf.limit = limit;
+		buf.position = position;
+		buf.mark = mark;
+		return buf;
+	}
+
+	public DoubleBuffer compact() {
+		if (byteBuffer.isReadOnly()) {
+			throw new ReadOnlyBufferException();
+		}
+		byteBuffer.limit(limit << 3);
+		byteBuffer.position(position << 3);
+		byteBuffer.compact();
+		byteBuffer.clear();
+		position = limit - position;
+		limit = capacity;
+		mark = UNSET_MARK;
+		return this;
+	}
+
+	public DoubleBuffer duplicate() {
+		DoubleToByteBufferAdapter buf = new DoubleToByteBufferAdapter(
+				byteBuffer.duplicate());
+		buf.limit = limit;
+		buf.position = position;
+		buf.mark = mark;
+		return buf;
+	}
+
+	public double get() {
+		if (position == limit) {
+			throw new BufferUnderflowException();
+		}
+		return byteBuffer.getDouble(position++ << 3);
+	}
+
+	public double get(int index) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		return byteBuffer.getDouble(index << 3);
+	}
+
+	public boolean isDirect() {
+		return byteBuffer.isDirect();
+	}
+
+	public boolean isReadOnly() {
+		return byteBuffer.isReadOnly();
+	}
+
+	public ByteOrder order() {
+		return byteBuffer.order();
+	}
+
+	protected double[] protectedArray() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected int protectedArrayOffset() {
+		throw new UnsupportedOperationException();
+	}
+
+	protected boolean protectedHasArray() {
+		return false;
+	}
+
+	public DoubleBuffer put(double c) {
+		if (position == limit) {
+			throw new BufferOverflowException();
+		}
+		byteBuffer.putDouble(position++ << 3, c);
+		return this;
+	}
+
+	public DoubleBuffer put(int index, double c) {
+		if (index < 0 || index >= limit) {
+			throw new IndexOutOfBoundsException();
+		}
+		byteBuffer.putDouble(index << 3, c);
+		return this;
+	}
+
+	public DoubleBuffer slice() {
+		byteBuffer.limit(limit << 3);
+		byteBuffer.position(position << 3);
+		DoubleBuffer result = new DoubleToByteBufferAdapter(byteBuffer.slice());
+		byteBuffer.clear();
+		return result;
+	}
+
+}