/** * Redistribution and use of this software and associated documentation * ("Software"), with or without modification, are permitted provided * that the following conditions are met: * * 1. Redistributions of source code must retain copyright * statements and notices. Redistributions must also contain a * copy of this document. * * 2. Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. The name "Exolab" must not be used to endorse or promote * products derived from this Software without prior written * permission of Intalio, Inc. For written permission, * please contact info@exolab.org. * * 4. Products derived from this Software may not be called "Exolab" * nor may "Exolab" appear in their names without prior written * permission of Intalio, Inc. Exolab is a registered * trademark of Intalio, Inc. * * 5. Due credit should be given to the Exolab Project * (http://www.exolab.org/). * * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL * INTALIO, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * Copyright 1999 (C) Intalio, Inc. All Rights Reserved. * * $Id$ */ package org.exolab.castor.mapping.loader; import java.util.Enumeration; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.ArrayList; import java.util.HashSet; import java.util.HashMap; import java.util.Iterator; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import org.exolab.castor.mapping.CollectionHandler; import org.exolab.castor.mapping.MapItem; /** * Implementation of various collection handlers for the Java 1.2 * libraries. * * @author <a href="arkin@intalio.com">Assaf Arkin</a> * @version $Revision$ $Date: 2006-04-26 13:08:15 -0600 (Wed, 26 Apr 2006) $ */ public final class J2CollectionHandlers { public static CollectionHandlers.Info[] getCollectionHandlersInfo() { return _colHandlers; } /** * List of all the default collection handlers. */ private static CollectionHandlers.Info[] _colHandlers = new CollectionHandlers.Info[] { new CollectionHandlers.Info("list", List.class, false, new CollectionHandler() { public Object add(Object collection, final Object object) { if (collection == null) { collection = new ArrayList(); ((Collection) collection).add(object); return collection; } ((Collection) collection).add(object); return null; } public Enumeration elements(final Object collection) { if (collection == null) { return new CollectionHandlers.EmptyEnumerator(); } return new IteratorEnumerator(((Collection) collection).iterator()); } public int size(final Object collection) { if (collection == null) { return 0; } return ((Collection) collection).size(); } public Object clear(final Object collection) { if (collection != null) { ((Collection) collection).clear(); } return null; } public String toString() { return "List"; } } ), new CollectionHandlers.Info( "arraylist", ArrayList.class, false, new CollectionHandler() { public Object add( Object collection, Object object ) { if ( collection == null ) { collection = new ArrayList(); ( (Collection) collection ).add( object ); return collection; } ( (Collection) collection ).add( object ); return null; } public Enumeration elements( Object collection ) { if ( collection == null ) return new CollectionHandlers.EmptyEnumerator(); return new IteratorEnumerator( ( (Collection) collection ).iterator() ); } public int size( Object collection ) { if ( collection == null ) return 0; return ( (Collection) collection ).size(); } public Object clear( Object collection ) { if ( collection != null ) ( (Collection) collection ).clear(); return null; } public String toString() { return "ArrayList"; } } ), // For Collection/ArrayList (1.2) new CollectionHandlers.Info( "collection", Collection.class, false, new CollectionHandler() { public Object add( Object collection, Object object ) { if ( collection == null ) { collection = new ArrayList(); ( (Collection) collection ).add( object ); return collection; } ( (Collection) collection ).add( object ); return null; } public Enumeration elements( Object collection ) { if ( collection == null ) return new CollectionHandlers.EmptyEnumerator(); return new IteratorEnumerator( ( (Collection) collection ).iterator() ); } public int size( Object collection ) { if ( collection == null ) return 0; return ( (Collection) collection ).size(); } public Object clear( Object collection ) { if ( collection != null ) ( (Collection) collection ).clear(); return null; } public String toString() { return "Collection"; } } ), // For Set/HashSet (1.2) new CollectionHandlers.Info( "set", Set.class, false, new CollectionHandler() { public Object add( Object collection, Object object ) { if ( collection == null ) { collection = new HashSet(); ( (Set) collection ).add( object ); return collection; } //if ( ! ( (Set) collection ).contains( object ) ) ( (Set) collection ).add( object ); return null; } public Enumeration elements( Object collection ) { if ( collection == null ) return new CollectionHandlers.EmptyEnumerator(); return new IteratorEnumerator( ( (Set) collection ).iterator() ); } public int size( Object collection ) { if ( collection == null ) return 0; return ( (Set) collection ).size(); } public Object clear( Object collection ) { if ( collection != null ) ( (Set) collection ).clear(); return null; } public String toString() { return "Set"; } } ), // For Map/HashMap (1.2) new CollectionHandlers.Info( "map", Map.class, false, new CollectionHandler() { public Object add( Object collection, Object object ) { Object key = object; Object value = object; if (object instanceof MapItem) { MapItem item = (MapItem)object; key = item.getKey(); value = item.getValue(); if (value == null) { value = object; } if (key == null) { key = value; } } if ( collection == null ) { collection = new HashMap(); ( (Map) collection ).put( key, value ); return collection; } ( (Map) collection ).put( key, value ); return null; } public Enumeration elements( Object collection ) { if ( collection == null ) return new CollectionHandlers.EmptyEnumerator(); return new IteratorEnumerator( ( (Map) collection ).values().iterator() ); } public int size( Object collection ) { if ( collection == null ) return 0; return ( (Map) collection ).size(); } public Object clear( Object collection ) { if ( collection != null ) ( (Map) collection ).clear(); return null; } public String toString() { return "Map"; } } ), // For SortedSet (1.2 aka 1.4) new CollectionHandlers.Info("sortedset", SortedSet.class, false, new SortedSetCollectionHandler()), // For SortedMap (1.2 aka 1.4) new CollectionHandlers.Info("sortedmap", SortedMap.class, false, new SortedMapCollectionHandler()), // For java.util.Iterator new CollectionHandlers.Info( "iterator", Iterator.class, false, new CollectionHandler() { public Object add(Object collection, Object object) { //-- do nothing, cannot add elements to an enumeration return null; } public Enumeration elements(Object collection) { if (collection == null) { return new CollectionHandlers.EmptyEnumerator(); } return new IteratorEnumerator((Iterator) collection); } public int size(Object collection) { //-- Nothing we can do without iterating over the iterator return 0; } public Object clear(Object collection) { return null; } public String toString() { return "Iterator"; } } ) }; private static final class SortedSetCollectionHandler implements CollectionHandler { /** * @inheritDoc */ public Object add(Object collection, final Object object) { if (collection == null) { collection = new TreeSet(); ((Set) collection).add(object); return collection; } // if (!((Set) collection).contains(object)) ((Set) collection).add(object); return null; } /** * @inheritDoc */ public Enumeration elements(final Object collection) { if (collection == null) { return new CollectionHandlers.EmptyEnumerator(); } return new IteratorEnumerator(((Set) collection).iterator()); } /** * @inheritDoc */ public int size(final Object collection) { if (collection == null) { return 0; } return ((Set) collection).size(); } /** * @inheritDoc */ public Object clear(final Object collection) { if (collection != null) { ((Set) collection).clear(); } return null; } /** * @inheritDoc */ public String toString() { return "SortedSet"; } } private static final class SortedMapCollectionHandler implements CollectionHandler { public Object add(Object collection, Object object) { Object key = object; Object value = object; if (object instanceof MapItem) { MapItem item = (MapItem) object; key = item.getKey(); value = item.getValue(); if (value == null) { value = object; } if (key == null) { key = value; } } if (collection == null) { collection = new TreeMap(); ((SortedMap) collection).put(key, value); return collection; } ((SortedMap) collection).put(key, value); return null; } public Enumeration elements(final Object collection) { if (collection == null) return new CollectionHandlers.EmptyEnumerator(); return new IteratorEnumerator(((SortedMap) collection).values() .iterator()); } public int size(final Object collection) { if (collection == null) return 0; return ((SortedMap) collection).size(); } public Object clear(final Object collection) { if (collection != null) ((SortedMap) collection).clear(); return null; } public String toString() { return "SortedMap"; } } /** * Enumerator for an iterator. */ static final class IteratorEnumerator implements Enumeration { private final Iterator _iterator; IteratorEnumerator( Iterator iterator ) { _iterator = iterator; } public boolean hasMoreElements() { return _iterator.hasNext(); } public Object nextElement() { return _iterator.next(); } } }