From 80f68cc0c4f7bba91432f1ca3a0eeac80152a99d Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Wed, 6 Nov 2002 19:09:00 +0000 Subject: [PATCH] Closure deemed to be a bad name. Bye bye. git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/lang/trunk@137113 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/lang/functor/Closure.java | 75 -- .../lang/functor/ClosureException.java | 107 --- .../commons/lang/functor/ClosureUtils.java | 689 ------------------ .../lang/functor/TestClosureUtils.java | 498 ------------- 4 files changed, 1369 deletions(-) delete mode 100644 src/java/org/apache/commons/lang/functor/Closure.java delete mode 100644 src/java/org/apache/commons/lang/functor/ClosureException.java delete mode 100644 src/java/org/apache/commons/lang/functor/ClosureUtils.java delete mode 100644 src/test/org/apache/commons/lang/functor/TestClosureUtils.java diff --git a/src/java/org/apache/commons/lang/functor/Closure.java b/src/java/org/apache/commons/lang/functor/Closure.java deleted file mode 100644 index 26f82262f..000000000 --- a/src/java/org/apache/commons/lang/functor/Closure.java +++ /dev/null @@ -1,75 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 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 end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Commons", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.commons.lang.functor; - -/** - * Closure defines an interface implemented by classes that - * do something. - * - * @author Nicola Ken Barozzi - * @version $Id: Closure.java,v 1.1 2002/11/05 16:44:28 bayard Exp $ - */ -public interface Closure { - - /** - * Does what it has to. - * - * @param description the extra information needed to execute the - * command - * - * @throws ClosureException (runtime) if the execution fails - */ - public void execute(Object description); - -} diff --git a/src/java/org/apache/commons/lang/functor/ClosureException.java b/src/java/org/apache/commons/lang/functor/ClosureException.java deleted file mode 100644 index 07d65eff0..000000000 --- a/src/java/org/apache/commons/lang/functor/ClosureException.java +++ /dev/null @@ -1,107 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 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 end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Commons", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.commons.lang.functor; - -import org.apache.commons.lang.exception.NestableRuntimeException; -/** - * Exception thrown when the Comand fails to execute. - * If required, a root cause error can be wrapped within this one. - * - * @author Nicola Ken Barozzi - * @version $Id: ClosureException.java,v 1.1 2002/11/05 16:44:28 bayard Exp $ - */ -public class ClosureException extends NestableRuntimeException { - - /** - * Constructs a new ClosureException without specified - * detail message. - */ - public ClosureException() { - super(); - } - - /** - * Constructs a new ClosureException with specified - * detail message. - * - * @param msg the error message. - */ - public ClosureException(String msg) { - super(msg); - } - - /** - * Constructs a new ClosureException with specified - * nested Throwable root cause. - * - * @param rootCause the exception or error that caused this exception - * to be thrown. - */ - public ClosureException(Throwable rootCause) { - super(rootCause); - } - - /** - * Constructs a new ClosureException with specified - * detail message and nested Throwable root cause. - * - * @param msg the error message. - * @param rootCause the exception or error that caused this exception - * to be thrown. - */ - public ClosureException(String msg, Throwable rootCause) { - super(msg, rootCause); - } - -} diff --git a/src/java/org/apache/commons/lang/functor/ClosureUtils.java b/src/java/org/apache/commons/lang/functor/ClosureUtils.java deleted file mode 100644 index daa369f7b..000000000 --- a/src/java/org/apache/commons/lang/functor/ClosureUtils.java +++ /dev/null @@ -1,689 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 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 end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Commons", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.commons.lang.functor; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -import org.apache.commons.lang.functor.Predicate; -import org.apache.commons.lang.functor.PredicateUtils; -import org.apache.commons.lang.functor.Transformer; -import org.apache.commons.lang.functor.TransformerException; -import org.apache.commons.lang.functor.TransformerUtils; -/** - * ClosureUtils provides reference implementations and utilities - * for the Closure pattern interface. The supplied commands are: - *
    - *
  • Invoker - invokes a method on the input object - *
  • For - repeatedly calls a command for a fixed number of times - *
  • While - repeatedly calls a command while a predicate is true - *
  • DoWhile - repeatedly calls a command while a predicate is true - *
  • Chained - chains two or more commands together - *
  • Switch - calls one command based on one or more predicates - *
  • SwitchMap - calls one command looked up from a Map - *
  • Transformer - wraps a Transformer as a Predicate - *
  • NOP - does nothing - *
  • Exception - always throws an exception - *
- * All the supplied commands are Serializable. - * - * @author Stephen Colebourne - * @version $Id: ClosureUtils.java,v 1.1 2002/11/05 16:44:28 bayard Exp $ - */ -public class ClosureUtils { - - /** - * A Closure that always throws an exception - */ - private static final Closure EXCEPTION_COMMAND = new ExceptionClosure(); - /** - * A Closure that does nothing - */ - private static final Closure NOP_COMMAND = new NOPClosure(); - - /** - * Restrictive constructor - */ - protected ClosureUtils() { - super(); - } - - /** - * Gets a Closure that always throws an exception. - * This could be useful during testing as a placeholder. - * - * @return the command - */ - public static Closure exceptionClosure() { - return EXCEPTION_COMMAND; - } - - /** - * Gets a Closure that will do nothing. - * This could be useful during testing as a placeholder. - * - * @return the command - */ - public static Closure nopClosure() { - return NOP_COMMAND; - } - - /** - * Creates a Closure that calls a Factory each time the transformer is used. - * The transformer will return the value returned by the factory. - * - * @param transformer the transformer to run each time in the command - * @return the command. - */ - public static Closure asClosure(Transformer transformer) { - if (transformer == null) { - throw new IllegalArgumentException("TransformerClosure: The transformer must not be null"); - } - return new TransformerClosure(transformer); - } - - /** - * Creates a Closure that will call the command count times. - * - * @param count the number of times to loop - * @param command the command to call repeatedly - * @return the command - * @throws IllegalArgumentException if either argument is null - */ - public static Closure forClosure(int count, Closure command) { - if (count < 0) { - throw new IllegalArgumentException("ForClosure: The loop count must not be less than zero, it was " + count); - } - if (command == null) { - throw new IllegalArgumentException("ForClosure: The command must not be null"); - } - return new ForClosure(count, command); - } - - /** - * Creates a Closure that will call the command repeatedly until the - * predicate returns false. - * - * @param predicate the predicate to use as an end of loop test - * @param command the command to call repeatedly - * @return the command - * @throws IllegalArgumentException if either argument is null - */ - public static Closure whileClosure(Predicate predicate, Closure command) { - if (predicate == null) { - throw new IllegalArgumentException("WhileClosure: The predicate must not be null"); - } - if (command == null) { - throw new IllegalArgumentException("WhileClosure: The command must not be null"); - } - return new WhileClosure(predicate, command, false); - } - - /** - * Creates a Closure that will call the command once and then repeatedly - * until the predicate returns false. - * - * @param command the command to call repeatedly - * @param predicate the predicate to use as an end of loop test - * @return the command - * @throws IllegalArgumentException if either argument is null - */ - public static Closure doWhileClosure(Closure command, Predicate predicate) { - if (command == null) { - throw new IllegalArgumentException("DoWhileClosure: The command must not be null"); - } - if (predicate == null) { - throw new IllegalArgumentException("DoWhileClosure: The predicate must not be null"); - } - return new WhileClosure(predicate, command, true); - } - - /** - * Creates a Closure that will invoke a specific method on the command's - * input object by reflection. - * - * @param methodName the name of the method - * @return the command - * @throws IllegalArgumentException if the method name is null - */ - public static Closure invokerClosure(String methodName) { - return asClosure(TransformerUtils.invokerTransformer(methodName, null, null)); - } - - /** - * Creates a Closure that will invoke a specific method on the command's - * input object by reflection. - * - * @param methodName the name of the method - * @param paramTypes the parameter types - * @param args the arguments - * @return the command - * @throws IllegalArgumentException if the method name is null - * @throws IllegalArgumentException if the paramTypes and args don't match - */ - public static Closure invokerClosure(String methodName, Class[] paramTypes, Object[] args) { - return asClosure(TransformerUtils.invokerTransformer(methodName, paramTypes, args)); - } - - /** - * Create a new Closure that calls two Closures, passing the result of - * the first into the second. - * - * @param command1 the first command - * @param command2 the second command - * @return the command - * @throws IllegalArgumentException if either command is null - */ - public static Closure chainedClosure(Closure command1, Closure command2) { - Closure[] commands = new Closure[] { command1, command2 }; - validate(commands); - return new ChainedClosure(commands); - } - - /** - * Create a new Closure that calls each command in turn, passing the - * result into the next command. - * - * @param commands an array of commands to chain - * @return the command - * @throws IllegalArgumentException if the commands array is null - * @throws IllegalArgumentException if the commands array has 0 elements - * @throws IllegalArgumentException if any command in the array is null - */ - public static Closure chainedClosure(Closure[] commands) { - commands = copy(commands); - validate(commands); - return new ChainedClosure(commands); - } - - /** - * Create a new Closure that calls each command in turn, passing the - * result into the next command. The ordering is that of the iterator() - * method on the collection. - * - * @param commands a collection of commands to chain - * @return the command - * @throws IllegalArgumentException if the commands collection is null - * @throws IllegalArgumentException if the commands collection is empty - * @throws IllegalArgumentException if any command in the collection is null - */ - public static Closure chainedClosure(Collection commands) { - if (commands == null) { - throw new IllegalArgumentException("ChainedClosure: The command collection must not be null"); - } - // convert to array like this to guarantee iterator() ordering - Closure[] cmds = new Closure[commands.size()]; - int i = 0; - for (Iterator it = commands.iterator(); it.hasNext();) { - cmds[i++] = (Closure) it.next(); - } - validate(cmds); - return new ChainedClosure(cmds); - } - - /** - * Create a new Closure that calls one of two commands depending - * on the specified predicate. - * - * @param predicate the predicate to switch on - * @param trueClosure the command called if the predicate is true - * @param falseClosure the command called if the predicate is false - * @return the command - * @throws IllegalArgumentException if the predicate is null - * @throws IllegalArgumentException if either command is null - */ - public static Closure switchClosure(Predicate predicate, Closure trueClosure, Closure falseClosure) { - return switchClosureInternal(new Predicate[] { predicate }, new Closure[] { trueClosure }, falseClosure); - } - - /** - * Create a new Closure that calls one of the commands depending - * on the predicates. The command at array location 0 is called if the - * predicate at array location 0 returned true. Each predicate is evaluated - * until one returns true. - * - * @param predicates an array of predicates to check - * @param commands an array of commands to call - * @return the command - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if the either array has 0 elements - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Closure switchClosure(Predicate[] predicates, Closure[] commands) { - return switchClosureInternal(copy(predicates), copy(commands), null); - } - - /** - * Create a new Closure that calls one of the commands depending - * on the predicates. The command at array location 0 is called if the - * predicate at array location 0 returned true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * command is called. - * - * @param predicates an array of predicates to check - * @param commands an array of commands to call - * @param defaultClosure the default to call if no predicate matches - * @return the command - * @throws IllegalArgumentException if the either array is null - * @throws IllegalArgumentException if the either array has 0 elements - * @throws IllegalArgumentException if any element in the arrays is null - * @throws IllegalArgumentException if the arrays are different sizes - */ - public static Closure switchClosure(Predicate[] predicates, Closure[] commands, Closure defaultClosure) { - return switchClosureInternal(copy(predicates), copy(commands), defaultClosure); - } - - /** - * Create a new Closure that calls one of the commands depending - * on the predicates. - *

- * The Map consists of Predicate keys and Closure values. A command - * is called if its matching predicate returns true. Each predicate is evaluated - * until one returns true. If no predicates evaluate to true, the default - * command is called. The default command is set in the map with a - * null key. The ordering is that of the iterator() method on the entryset - * collection of the map. - * - * @param predicatesAndClosures a map of predicates to commands - * @return the command - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any command in the map is null - * @throws ClassCastException if the map elements are of the wrong type - */ - public static Closure switchClosure(Map predicatesAndClosures) { - Closure[] trs = null; - Predicate[] preds = null; - if (predicatesAndClosures == null) { - throw new IllegalArgumentException("SwitchClosure: The predicate and command map must not be null"); - } - // convert to array like this to guarantee iterator() ordering - Closure def = (Closure) predicatesAndClosures.remove(null); - int size = predicatesAndClosures.size(); - trs = new Closure[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = predicatesAndClosures.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = (Predicate) entry.getKey(); - trs[i] = (Closure) entry.getValue(); - i++; - } - return switchClosureInternal(preds, trs, def); - } - - /** - * Validate input and create command - */ - private static Closure switchClosureInternal(Predicate[] predicates, Closure[] commands, Closure defaultClosure) { - validate(predicates); - validate(commands); - if (predicates.length != commands.length) { - throw new IllegalArgumentException("SwitchClosure: The predicate and command arrays must be the same size"); - } - if (defaultClosure == null) { - defaultClosure = nopClosure(); - } - return new SwitchClosure(predicates, commands, defaultClosure); - } - - /** - * Create a new Closure that uses the input object as a key to find the - * command to call. - *

- * The Map consists of object keys and Closure values. A command - * is called if the input object equals the key. If there is no match, the - * default command is called. The default command is set in the map - * using a null key. - * - * @param objectsAndClosures a map of objects to commands - * @return the command - * @throws IllegalArgumentException if the map is null - * @throws IllegalArgumentException if the map is empty - * @throws IllegalArgumentException if any command in the map is null - */ - public static Closure switchMapClosure(Map objectsAndClosures) { - Closure[] trs = null; - Predicate[] preds = null; - if (objectsAndClosures == null) { - throw new IllegalArgumentException("SwitchEqualsClosure: The obejct and command map must not be null"); - } - Closure def = (Closure) objectsAndClosures.remove(null); - int size = objectsAndClosures.size(); - trs = new Closure[size]; - preds = new Predicate[size]; - int i = 0; - for (Iterator it = objectsAndClosures.entrySet().iterator(); it.hasNext();) { - Map.Entry entry = (Map.Entry) it.next(); - preds[i] = PredicateUtils.equalPredicate(entry.getKey()); - trs[i] = (Closure) entry.getValue(); - i++; - } - return switchClosure(preds, trs, def); - } - - /** - * Copy method - * - * @param predicates the predicates to copy - */ - private static Predicate[] copy(Predicate[] predicates) { - if (predicates == null) { - return null; - } - return (Predicate[]) predicates.clone(); - } - - /** - * Validate method - * - * @param predicates the predicates to validate - */ - private static void validate(Predicate[] predicates) { - if (predicates == null) { - throw new IllegalArgumentException("ClosureUtils: The predicate array must not be null"); - } - if (predicates.length < 1) { - throw new IllegalArgumentException( - "ClosureUtils: At least 1 predicate must be specified in the predicate array, size was " + predicates.length); - } - for (int i = 0; i < predicates.length; i++) { - if (predicates[i] == null) { - throw new IllegalArgumentException("ClosureUtils: The predicate array must not contain a null predicate, index " + i + " was null"); - } - } - } - - /** - * Copy method - * - * @param commands the commands to copy - */ - private static Closure[] copy(Closure[] commands) { - if (commands == null) { - return null; - } - return (Closure[]) commands.clone(); - } - - /** - * Validate method - * - * @param commands the commands to validate - */ - private static void validate(Closure[] commands) { - if (commands == null) { - throw new IllegalArgumentException("ClosureUtils: The command array must not be null"); - } - if (commands.length < 1) { - throw new IllegalArgumentException( - "ClosureUtils: At least 1 command must be specified in the command array, size was " + commands.length); - } - for (int i = 0; i < commands.length; i++) { - if (commands[i] == null) { - throw new IllegalArgumentException("ClosureUtils: The command array must not contain a null command, index " + i + " was null"); - } - } - } - - // ExceptionClosure - //---------------------------------------------------------------------------------- - - /** - * ExceptionClosure always throws an exception - */ - private static class ExceptionClosure implements Closure, Serializable { - - /** - * Constructor - */ - private ExceptionClosure() { - super(); - } - - /** - * Always throw an exception - */ - public void execute(Object input) { - throw new ClosureException("ExceptionClosure invoked"); - } - } - - // NOPClosure - //---------------------------------------------------------------------------------- - - /** - * NOPClosure does nothing - */ - private static class NOPClosure implements Closure, Serializable { - - /** - * Constructor - */ - private NOPClosure() { - super(); - } - - /** - * Do nothing - */ - public void execute(Object input) { - // do nothing - } - } - - // TransformerClosure - //---------------------------------------------------------------------------------- - - /** - * TransformerClosure returns the result of calling a Transformer. - */ - private static class TransformerClosure implements Closure, Serializable { - - private final Transformer iTransformer; - - /** - * Constructor to store factory - */ - private TransformerClosure(Transformer transformer) { - super(); - iTransformer = transformer; - } - - /** - * Return the result of calling the factory - */ - public void execute(Object input) { - try { - iTransformer.transform(input); - - } catch (TransformerException ex) { - throw new ClosureException("TransformerClosure: " + ex.getMessage(), ex); - } - } - } - - // ChainedClosure - //---------------------------------------------------------------------------------- - - /** - * ChainedClosure calls a list of commands. - */ - private static class ChainedClosure implements Closure, Serializable { - - private final Closure[] iClosures; - - /** - * Constructor to store params - */ - private ChainedClosure(Closure[] commands) { - super(); - iClosures = commands; - } - - /** - * Execute a list of commands - */ - public void execute(Object input) { - for (int i = 0; i < iClosures.length; i++) { - iClosures[i].execute(input); - } - } - } - - // SwitchClosure - //---------------------------------------------------------------------------------- - - /** - * SwitchClosure calls the command whose predicate returns true. - */ - private static class SwitchClosure implements Closure, Serializable { - - private final Predicate[] iPredicates; - private final Closure[] iClosures; - private final Closure iDefault; - - /** - * Constructor to store params - */ - private SwitchClosure(Predicate[] predicates, Closure[] commands, Closure defaultClosure) { - super(); - iPredicates = predicates; - iClosures = commands; - iDefault = defaultClosure; - } - - /** - * Execute the command whose predicate returns true - */ - public void execute(Object input) { - for (int i = 0; i < iPredicates.length; i++) { - if (iPredicates[i].evaluate(input) == true) { - iClosures[i].execute(input); - return; - } - } - iDefault.execute(input); - } - } - - // ForClosure - //---------------------------------------------------------------------------------- - - /** - * ForClosure calls the command a fixed nunmber of times. - */ - private static class ForClosure implements Closure, Serializable { - - private final int iCount; - private final Closure iClosure; - - /** - * Constructor to store params - */ - private ForClosure(int count, Closure command) { - super(); - iCount = count; - iClosure = command; - } - - /** - * Execute the command count times - */ - public void execute(Object input) { - for (int i = 0; i < iCount; i++) { - iClosure.execute(input); - } - } - } - - // WhileClosure - //---------------------------------------------------------------------------------- - - /** - * WhileClosure calls the command until the predicate is false. - */ - private static class WhileClosure implements Closure, Serializable { - - private final Predicate iPredicate; - private final Closure iClosure; - private final boolean iDoLoop; - - /** - * Constructor to store params - */ - private WhileClosure(Predicate predicate, Closure command, boolean doLoop) { - super(); - iPredicate = predicate; - iClosure = command; - iDoLoop = doLoop; - } - - /** - * Execute the command until the predicate is false - */ - public void execute(Object input) { - if (iDoLoop) { - iClosure.execute(input); - } - while (iPredicate.evaluate(input)) { - iClosure.execute(input); - } - } - } - -} diff --git a/src/test/org/apache/commons/lang/functor/TestClosureUtils.java b/src/test/org/apache/commons/lang/functor/TestClosureUtils.java deleted file mode 100644 index b8d4d6c1b..000000000 --- a/src/test/org/apache/commons/lang/functor/TestClosureUtils.java +++ /dev/null @@ -1,498 +0,0 @@ -/* ==================================================================== - * The Apache Software License, Version 1.1 - * - * Copyright (c) 2002 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 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 end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Commons", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION 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. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * . - */ -package org.apache.commons.lang.functor; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -import junit.framework.Test; -import junit.framework.TestSuite; - -import org.apache.commons.lang.functor.Predicate; -import org.apache.commons.lang.functor.PredicateUtils; -/** - * Tests the org.apache.commons.lang.functor.ClosureUtils class. - * - * @author Stephen Colebourne - * @version $Id: TestClosureUtils.java,v 1.1 2002/11/05 16:45:13 bayard Exp $ - */ -public class TestClosureUtils extends junit.framework.TestCase { - - private static final Object cObject = new Object(); - private static final Object cString = "Hello"; - private static final Object cInteger = new Integer(6); - - /** - * Construct - */ - public TestClosureUtils(String name) { - super(name); - } - - /** - * Return class aa a test suite. - */ - public static Test suite() { - return new TestSuite(TestClosureUtils.class); - } - - /** - * Set up instance variables required by this test case. - */ - public void setUp() { - } - - /** - * Tear down instance variables required by this test case. - */ - public void tearDown() { - } - - static class MockClosure implements Closure { - int count = 0; - - /** - * @see org.apache.commons.lang.functor.Closure#execute(Object) - */ - public void execute(Object object) { - count++; - } - - } - - // exceptionClosure - //------------------------------------------------------------------ - - public void testExceptionClosure() { - assertNotNull(ClosureUtils.exceptionClosure()); - assertSame(ClosureUtils.exceptionClosure(), ClosureUtils.exceptionClosure()); - try { - ClosureUtils.exceptionClosure().execute(null); - } catch (ClosureException ex) { - try { - ClosureUtils.exceptionClosure().execute(cString); - } catch (ClosureException ex2) { - return; - } - } - fail(); - } - - // nopClosure - //------------------------------------------------------------------ - - public void testNopClosure() { - StringBuffer buf = new StringBuffer("Hello"); - ClosureUtils.nopClosure().execute(null); - assertEquals("Hello", buf.toString()); - ClosureUtils.nopClosure().execute("Hello"); - assertEquals("Hello", buf.toString()); - } - - // invokeClosure - //------------------------------------------------------------------ - - public void testInvokeClosure() { - StringBuffer buf = new StringBuffer("Hello"); - ClosureUtils.invokerClosure("reverse").execute(buf); - assertEquals("olleH", buf.toString()); - buf = new StringBuffer("Hello"); - ClosureUtils.invokerClosure("setLength", new Class[] {Integer.TYPE}, new Object[] {new Integer(2)}).execute(buf); - assertEquals("He", buf.toString()); - } - - // forClosure - //------------------------------------------------------------------ - - public void testForClosure() { - MockClosure cmd = new MockClosure(); - ClosureUtils.forClosure(5, cmd).execute(null); - assertEquals(5, cmd.count); - try { - ClosureUtils.forClosure(-1, new MockClosure()); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - // whileClosure - //------------------------------------------------------------------ - - public void testWhileClosure() { - MockClosure cmd = new MockClosure(); - ClosureUtils.whileClosure(PredicateUtils.falsePredicate(), cmd).execute(null); - assertEquals(0, cmd.count); - try { - ClosureUtils.whileClosure(null, null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - // doWhileClosure - //------------------------------------------------------------------ - - public void testDoWhileClosure() { - MockClosure cmd = new MockClosure(); - ClosureUtils.doWhileClosure(cmd, PredicateUtils.falsePredicate()).execute(null); - assertEquals(1, cmd.count); - try { - ClosureUtils.doWhileClosure(null, null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - // chainedClosure - //------------------------------------------------------------------ - - public void testChainedClosure() { - MockClosure a = new MockClosure(); - MockClosure b = new MockClosure(); - ClosureUtils.chainedClosure(a, b).execute(null); - assertEquals(1, a.count); - assertEquals(1, b.count); - - a = new MockClosure(); - b = new MockClosure(); - ClosureUtils.chainedClosure(new Closure[] {a, b, a}).execute(null); - assertEquals(2, a.count); - assertEquals(1, b.count); - - a = new MockClosure(); - b = new MockClosure(); - Collection coll = new ArrayList(); - coll.add(b); - coll.add(a); - coll.add(b); - ClosureUtils.chainedClosure(coll).execute(null); - assertEquals(1, a.count); - assertEquals(2, b.count); - } - - public void testChainedClosureEx1a() { - try { - ClosureUtils.chainedClosure(null, null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx1b() { - try { - ClosureUtils.chainedClosure((Closure[]) null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx1c() { - try { - ClosureUtils.chainedClosure((Collection) null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx2() { - try { - ClosureUtils.chainedClosure(new Closure[0]); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx3() { - try { - ClosureUtils.chainedClosure(new Closure[] {null, null}); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx4() { - try { - ClosureUtils.chainedClosure(Collections.EMPTY_LIST); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testChainedClosureEx5() { - try { - Collection coll = new ArrayList(); - coll.add(null); - coll.add(null); - ClosureUtils.chainedClosure(coll); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - // switchClosure - //------------------------------------------------------------------ - - public void testSwitchClosure() { - MockClosure a = new MockClosure(); - MockClosure b = new MockClosure(); - ClosureUtils.switchClosure(PredicateUtils.truePredicate(), a, b).execute(null); - assertEquals(1, a.count); - assertEquals(0, b.count); - - a = new MockClosure(); - b = new MockClosure(); - ClosureUtils.switchClosure(PredicateUtils.falsePredicate(), a, b).execute(null); - assertEquals(0, a.count); - assertEquals(1, b.count); - - a = new MockClosure(); - b = new MockClosure(); - ClosureUtils.switchClosure( - new Predicate[] {PredicateUtils.equalPredicate("HELLO"), PredicateUtils.equalPredicate("THERE")}, - new Closure[] {a, b}).execute("WELL"); - assertEquals(0, a.count); - assertEquals(0, b.count); - - a = new MockClosure(); - b = new MockClosure(); - ClosureUtils.switchClosure( - new Predicate[] {PredicateUtils.equalPredicate("HELLO"), PredicateUtils.equalPredicate("THERE")}, - new Closure[] {a, b}).execute("HELLO"); - assertEquals(1, a.count); - assertEquals(0, b.count); - - a = new MockClosure(); - b = new MockClosure(); - MockClosure c = new MockClosure(); - ClosureUtils.switchClosure( - new Predicate[] {PredicateUtils.equalPredicate("HELLO"), PredicateUtils.equalPredicate("THERE")}, - new Closure[] {a, b}, c).execute("WELL"); - assertEquals(0, a.count); - assertEquals(0, b.count); - assertEquals(1, c.count); - - a = new MockClosure(); - b = new MockClosure(); - Map map = new HashMap(); - map.put(PredicateUtils.equalPredicate("HELLO"), a); - map.put(PredicateUtils.equalPredicate("THERE"), b); - ClosureUtils.switchClosure(map).execute(null); - assertEquals(0, a.count); - assertEquals(0, b.count); - - a = new MockClosure(); - b = new MockClosure(); - map = new HashMap(); - map.put(PredicateUtils.equalPredicate("HELLO"), a); - map.put(PredicateUtils.equalPredicate("THERE"), b); - ClosureUtils.switchClosure(map).execute("THERE"); - assertEquals(0, a.count); - assertEquals(1, b.count); - - a = new MockClosure(); - b = new MockClosure(); - c = new MockClosure(); - map = new HashMap(); - map.put(PredicateUtils.equalPredicate("HELLO"), a); - map.put(PredicateUtils.equalPredicate("THERE"), b); - map.put(null, c); - ClosureUtils.switchClosure(map).execute("WELL"); - assertEquals(0, a.count); - assertEquals(0, b.count); - assertEquals(1, c.count); - } - - public void testSwitchClosureEx1a() { - try { - ClosureUtils.switchClosure(null, null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx1b() { - try { - ClosureUtils.switchClosure((Predicate[]) null, (Closure[]) null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx1c() { - try { - ClosureUtils.switchClosure((Map) null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx2() { - try { - ClosureUtils.switchClosure(new Predicate[0], new Closure[0]); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx3() { - try { - ClosureUtils.switchClosure(new Predicate[2], new Closure[2]); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx4() { - try { - ClosureUtils.switchClosure(Collections.EMPTY_MAP); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx5() { - try { - Map map = new HashMap(); - map.put(null, null); - map.put(null, null); - ClosureUtils.switchClosure(map); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchClosureEx6() { - try { - ClosureUtils.switchClosure(new Predicate[2], new Closure[1]); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - // switchMapClosure - //------------------------------------------------------------------ - - public void testSwitchMapClosure() { - MockClosure a = new MockClosure(); - MockClosure b = new MockClosure(); - Map map = new HashMap(); - map.put("HELLO", a); - map.put("THERE", b); - ClosureUtils.switchMapClosure(map).execute(null); - assertEquals(0, a.count); - assertEquals(0, b.count); - - a = new MockClosure(); - b = new MockClosure(); - map = new HashMap(); - map.put("HELLO", a); - map.put("THERE", b); - ClosureUtils.switchMapClosure(map).execute("THERE"); - assertEquals(0, a.count); - assertEquals(1, b.count); - - a = new MockClosure(); - b = new MockClosure(); - MockClosure c = new MockClosure(); - map = new HashMap(); - map.put("HELLO", a); - map.put("THERE", b); - map.put(null, c); - ClosureUtils.switchMapClosure(map).execute("WELL"); - assertEquals(0, a.count); - assertEquals(0, b.count); - assertEquals(1, c.count); - } - - public void testSwitchMapClosureEx1() { - try { - ClosureUtils.switchMapClosure(null); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - public void testSwitchMapClosureEx2() { - try { - ClosureUtils.switchMapClosure(Collections.EMPTY_MAP); - } catch (IllegalArgumentException ex) { - return; - } - fail(); - } - - -}