/jEdit/tags/jedit-4-3-pre5/bsh/CollectionManager.java
Java | 199 lines | 90 code | 23 blank | 86 comment | 11 complexity | 34c0fb949387d8a773ae2e77cf126dd7 MD5 | raw file
Possible License(s): BSD-3-Clause, AGPL-1.0, Apache-2.0, LGPL-2.0, LGPL-3.0, GPL-2.0, CC-BY-SA-3.0, LGPL-2.1, GPL-3.0, MPL-2.0-no-copyleft-exception, IPL-1.0
- /*****************************************************************************
- * *
- * This file is part of the BeanShell Java Scripting distribution. *
- * Documentation and updates may be found at http://www.beanshell.org/ *
- * *
- * Sun Public License Notice: *
- * *
- * The contents of this file are subject to the Sun Public License Version *
- * 1.0 (the "License"); you may not use this file except in compliance with *
- * the License. A copy of the License is available at http://www.sun.com *
- * *
- * The Original Code is BeanShell. The Initial Developer of the Original *
- * Code is Pat Niemeyer. Portions created by Pat Niemeyer are Copyright *
- * (C) 2000. All Rights Reserved. *
- * *
- * GNU Public License Notice: *
- * *
- * Alternatively, the contents of this file may be used under the terms of *
- * the GNU Lesser General Public License (the "LGPL"), in which case the *
- * provisions of LGPL are applicable instead of those above. If you wish to *
- * allow use of your version of this file only under the terms of the LGPL *
- * and not to allow others to use your version of this file under the SPL, *
- * indicate your decision by deleting the provisions above and replace *
- * them with the notice and other provisions required by the LGPL. If you *
- * do not delete the provisions above, a recipient may use your version of *
- * this file under either the SPL or the LGPL. *
- * *
- * Patrick Niemeyer (pat@pat.net) *
- * Author of Learning Java, O'Reilly & Associates *
- * http://www.pat.net/~pat/ *
- * *
- *****************************************************************************/
- package bsh;
- import java.util.Enumeration;
- import java.util.Vector;
- import java.util.Hashtable;
- import java.lang.reflect.Array;
- /**
- The default CollectionManager (which remains Java 1.1 compatible)
- supports iteration over objects of type:
- Enumeration, Vector, String, StringBuffer and array.
- The dynamically loaded CollectionManagerImpl supports additional types when
- it is present.
- @see BshIterable.java
- */
- public class CollectionManager
- {
- private static CollectionManager manager;
- public synchronized static CollectionManager getCollectionManager()
- {
- if ( manager == null
- && Capabilities.classExists("java.util.Collection") )
- {
- Class clas;
- try {
- clas = Class.forName( "bsh.collection.CollectionManagerImpl" );
- manager = (CollectionManager)clas.newInstance();
- } catch ( Exception e ) {
- Interpreter.debug("unable to load CollectionManagerImpl: "+e);
- }
- }
- if ( manager == null )
- manager = new CollectionManager(); // default impl
-
- return manager;
- }
- /**
- */
- public boolean isBshIterable( Object obj )
- {
- // This could be smarter...
- try {
- getBshIterator( obj );
- return true;
- } catch( IllegalArgumentException e ) {
- return false;
- }
- }
- public BshIterator getBshIterator( Object obj )
- throws IllegalArgumentException
- {
- return new BasicBshIterator( obj );
- }
- public boolean isMap( Object obj ) {
- return obj instanceof Hashtable;
- }
- public Object getFromMap( Object map, Object key ) {
- return ((Hashtable)map).get(key);
- }
- public Object putInMap( Object map, Object key, Object value )
- {
- return ((Hashtable)map).put(key, value);
- }
- /**
- Determine dynamically if the target is an iterator by the presence of a
- pair of next() and hasNext() methods.
- public static boolean isIterator() { }
- */
- /**
- * An implementation that works with JDK 1.1
- */
- public static class BasicBshIterator implements BshIterator
- {
- Enumeration enumeration;
-
- /**
- * Construct a basic BasicBshIterator
- *
- * @param The object over which we are iterating
- *
- * @throws java.lang.IllegalArgumentException If the argument is not a
- * supported (i.e. iterable) type.
- *
- * @throws java.lang.NullPointerException If the argument is null
- */
- public BasicBshIterator(Object iterateOverMe) {
- enumeration = createEnumeration(iterateOverMe);
- }
-
- /**
- * Create an enumeration over the given object
- *
- * @param iterateOverMe Object of type Enumeration, Vector, String,
- * StringBuffer or an array
- *
- * @return an enumeration
- *
- * @throws java.lang.IllegalArgumentException If the argument is not a
- * supported (i.e. iterable) type.
- *
- * @throws java.lang.NullPointerException If the argument is null
- */
- protected Enumeration createEnumeration( Object iterateOverMe )
- {
- if(iterateOverMe==null)
- throw new NullPointerException("Object arguments passed to " +
- "the BasicBshIterator constructor cannot be null.");
- if (iterateOverMe instanceof Enumeration)
- return (Enumeration)iterateOverMe;
- if (iterateOverMe instanceof Vector)
- return ((Vector)iterateOverMe).elements();
- if (iterateOverMe.getClass().isArray()) {
- final Object array = iterateOverMe;
- return new Enumeration() {
- int index = 0, length = Array.getLength(array);
- public Object nextElement() {
- return Array.get(array, index++);
- }
- public boolean hasMoreElements() { return index<length; }
- };
- }
-
- if (iterateOverMe instanceof String)
- return createEnumeration(((String)iterateOverMe).toCharArray());
-
- if (iterateOverMe instanceof StringBuffer)
- return createEnumeration(
- iterateOverMe.toString().toCharArray());
- throw new IllegalArgumentException(
- "Cannot enumerate object of type "+iterateOverMe.getClass());
- }
-
- /**
- * Fetch the next object in the iteration
- *
- * @return The next object
- */
- public Object next() {
- return enumeration.nextElement();
- }
-
- /**
- * Returns true if and only if there are more objects available
- * via the <code>next()</code> method
- *
- * @return The next object
- */
- public boolean hasNext() {
- return enumeration.hasMoreElements();
- }
- }
- }