Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/BooleanUtils.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/BooleanUtils.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/BooleanUtils.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/BooleanUtils.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,1051 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * 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 org.apache.asn1.util; + + +/** + * <p>Operations on boolean primitives and Boolean objects.</p> + * <p/> + * <p>This class tries to handle <code>null</code> input gracefully. An + * exception will not be thrown for a <code>null</code> input. Each method + * documents its behaviour in more detail.</p> + * + * @author Stephen Colebourne + * @author Matthew Hawthorne + * @author Gary Gregory + * @version $Id: BooleanUtils.java,v 1.18 2004/02/18 22:59:50 ggregory Exp $ + * @since 2.0 + */ +public class BooleanUtils +{ + private static final Integer INTEGER_ZERO = new Integer( 0 ); + private static final Integer INTEGER_ONE = new Integer( 1 ); + + + /** + * <p><code>BooleanUtils</code> instances should NOT be constructed in + * standard programming. Instead, the class should be used as + * <code>BooleanUtils.toBooleanObject(true);</code>.</p> + * <p/> + * <p>This constructor is public to permit tools that require a JavaBean + * instance to operate.</p> + */ + public BooleanUtils() + { + } + + // Boolean utilities + //-------------------------------------------------------------------------- + /** + * <p>Negates the specified boolean.</p> + * <p/> + * <p>If <code>null</code> is passed in, <code>null</code> will be + * returned.</p> + * <p/> + * <pre> + * BooleanUtils.negate(Boolean.TRUE) = Boolean.FALSE; + * BooleanUtils.negate(Boolean.FALSE) = Boolean.TRUE; + * BooleanUtils.negate(null) = null; + * </pre> + * + * @param bool the Boolean to negate, may be null + * @return the negated Boolean, or <code>null</code> if <code>null</code> + * input + */ + public static Boolean negate( Boolean bool ) + { + if ( bool == null ) + { + return null; + } + return ( bool.booleanValue() ? Boolean.FALSE : Boolean.TRUE ); + } + + // boolean Boolean methods + //----------------------------------------------------------------------- + /** + * <p>Boolean factory that avoids creating new Boolean objecs all the + * time.</p> + * <p/> + * <p>This method was added to JDK1.4 but is available here for earlier + * JDKs.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanObject(false) = Boolean.FALSE + * BooleanUtils.toBooleanObject(true) = Boolean.TRUE + * </pre> + * + * @param bool the boolean to convert + * @return Boolean.TRUE or Boolean.FALSE as appropriate + */ + public static Boolean toBooleanObject( boolean bool ) + { + return ( bool ? Boolean.TRUE : Boolean.FALSE ); + } + + + /** + * <p>Converts a Boolean to a boolean handling <code>null</code> by + * returning <code>false</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(Boolean.TRUE) = true + * BooleanUtils.toBoolean(Boolean.FALSE) = false + * BooleanUtils.toBoolean(null) = false + * </pre> + * + * @param bool the boolean to convert + * @return <code>true</code> or <code>false</code>, <code>null</code> + * returns <code>false</code> + */ + public static boolean toBoolean( Boolean bool ) + { + if ( bool == null ) + { + return false; + } + return ( bool.booleanValue() ? true : false ); + } + + + /** + * <p>Converts a Boolean to a boolean handling <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanDefaultIfNull(Boolean.TRUE, false) = true + * BooleanUtils.toBooleanDefaultIfNull(Boolean.FALSE, true) = false + * BooleanUtils.toBooleanDefaultIfNull(null, true) = true + * </pre> + * + * @param bool the boolean to convert + * @param valueIfNull the boolean value to return if <code>null</code> + * @return <code>true</code> or <code>false</code> + */ + public static boolean toBooleanDefaultIfNull( Boolean bool, boolean valueIfNull ) + { + if ( bool == null ) + { + return valueIfNull; + } + return ( bool.booleanValue() ? true : false ); + } + + // Integer to Boolean methods + //----------------------------------------------------------------------- + /** + * <p>Converts an int to a boolean using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(0) = false + * BooleanUtils.toBoolean(1) = true + * BooleanUtils.toBoolean(2) = true + * </pre> + * + * @param value the int to convert + * @return <code>true</code> if non-zero, <code>false</code> if zero + */ + public static boolean toBoolean( int value ) + { + return ( value == 0 ? false : true ); + } + + + /** + * <p>Converts an int to a Boolean using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(0) = Boolean.FALSE + * BooleanUtils.toBoolean(1) = Boolean.TRUE + * BooleanUtils.toBoolean(2) = Boolean.TRUE + * </pre> + * + * @param value the int to convert + * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero, + * <code>null</code> if <code>null</code> + */ + public static Boolean toBooleanObject( int value ) + { + return ( value == 0 ? Boolean.FALSE : Boolean.TRUE ); + } + + + /** + * <p>Converts an Integer to a Boolean using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <p><code>null</code> will be converted to <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(new Integer(0)) = Boolean.FALSE + * BooleanUtils.toBoolean(new Integer(1)) = Boolean.TRUE + * BooleanUtils.toBoolean(new Integer(null)) = null + * </pre> + * + * @param value the Integer to convert + * @return Boolean.TRUE if non-zero, Boolean.FALSE if zero, + * <code>null</code> if <code>null</code> input + */ + public static Boolean toBooleanObject( Integer value ) + { + if ( value == null ) + { + return null; + } + return ( value.intValue() == 0 ? Boolean.FALSE : Boolean.TRUE ); + } + + + /** + * <p>Converts an int to a boolean specifying the conversion values.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(0, 1, 0) = false + * BooleanUtils.toBoolean(1, 1, 0) = true + * BooleanUtils.toBoolean(2, 1, 2) = false + * BooleanUtils.toBoolean(2, 2, 0) = true + * </pre> + * + * @param value the Integer to convert + * @param trueValue the value to match for <code>true</code> + * @param falseValue the value to match for <code>false</code> + * @return <code>true</code> or <code>false</code> + * @throws IllegalArgumentException if no match + */ + public static boolean toBoolean( int value, int trueValue, int falseValue ) + { + if ( value == trueValue ) + { + return true; + } + else if ( value == falseValue ) + { + return false; + } + // no match + throw new IllegalArgumentException( "The Integer did not match either specified value" ); + } + + + /** + * <p>Converts an Integer to a boolean specifying the conversion + * values.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean(new Integer(0), new Integer(1), new Integer(0)) + * = false + * BooleanUtils.toBoolean(new Integer(1), new Integer(1), new Integer(0)) + * = true + * BooleanUtils.toBoolean(new Integer(2), new Integer(1), new Integer(2)) + * = false + * BooleanUtils.toBoolean(new Integer(2), new Integer(2), new Integer(0)) + * = true + * BooleanUtils.toBoolean(null, null, new Integer(0)) + * = true + * </pre> + * + * @param value the Integer to convert + * @param trueValue the value to match for <code>true</code>, may be + * <code>null</code> + * @param falseValue the value to match for <code>false</code>, may be + * <code>null</code> + * @return <code>true</code> or <code>false</code> + * @throws IllegalArgumentException if no match + */ + public static boolean toBoolean( Integer value, Integer trueValue, Integer falseValue ) + { + if ( value == null ) + { + if ( trueValue == null ) + { + return true; + } + else if ( falseValue == null ) + { + return false; + } + } + else if ( value.equals( trueValue ) ) + { + return true; + } + else if ( value.equals( falseValue ) ) + { + return false; + } + // no match + throw new IllegalArgumentException( "The Integer did not match either specified value" ); + } + + + /** + * <p>Converts an int to a Boolean specifying the conversion values.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanObject(0, 0, 2, 3) = Boolean.TRUE + * BooleanUtils.toBooleanObject(2, 1, 2, 3) = Boolean.FALSE + * BooleanUtils.toBooleanObject(3, 1, 2, 3) = null + * </pre> + * + * @param value the Integer to convert + * @param trueValue the value to match for <code>true</code> + * @param falseValue the value to match for <code>false</code> + * @param nullValue the value to to match for <code>null</code> + * @return Boolean.TRUE, Boolean.FALSE, or <code>null</code> + * @throws IllegalArgumentException if no match + */ + public static Boolean toBooleanObject( int value, int trueValue, int falseValue, int nullValue ) + { + if ( value == trueValue ) + { + return Boolean.TRUE; + } + else if ( value == falseValue ) + { + return Boolean.FALSE; + } + else if ( value == nullValue ) + { + return null; + } + // no match + throw new IllegalArgumentException( "The Integer did not match any specified value" ); + } + + + /** + * <p>Converts an Integer to a Boolean specifying the conversion + * values.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanObject(new Integer(0), new Integer(0), new + * Integer(2), new Integer(3)) = Boolean.TRUE + * BooleanUtils.toBooleanObject(new Integer(2), new Integer(1), new + * Integer(2), new Integer(3)) = Boolean.FALSE + * BooleanUtils.toBooleanObject(new Integer(3), new Integer(1), new + * Integer(2), new Integer(3)) = null + * </pre> + * + * @param value the Integer to convert + * @param trueValue the value to match for <code>true</code>, may be + * <code>null</code> + * @param falseValue the value to match for <code>false</code>, may be + * <code>null</code> + * @param nullValue the value to to match for <code>null</code>, may be + * <code>null</code> + * @return Boolean.TRUE, Boolean.FALSE, or <code>null</code> + * @throws IllegalArgumentException if no match + */ + public static Boolean toBooleanObject( Integer value, Integer trueValue, Integer falseValue, Integer nullValue ) + { + if ( value == null ) + { + if ( trueValue == null ) + { + return Boolean.TRUE; + } + else if ( falseValue == null ) + { + return Boolean.FALSE; + } + else if ( nullValue == null ) + { + return null; + } + } + else if ( value.equals( trueValue ) ) + { + return Boolean.TRUE; + } + else if ( value.equals( falseValue ) ) + { + return Boolean.FALSE; + } + else if ( value.equals( nullValue ) ) + { + return null; + } + // no match + throw new IllegalArgumentException( "The Integer did not match any specified value" ); + } + + // Boolean to Integer methods + //----------------------------------------------------------------------- + /** + * <p>Converts a boolean to an int using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toInteger(true) = 1 + * BooleanUtils.toInteger(false) = 0 + * </pre> + * + * @param bool the boolean to convert + * @return one if <code>true</code>, zero if <code>false</code> + */ + public static int toInteger( boolean bool ) + { + return ( bool ? 1 : 0 ); + } + + + /** + * <p>Converts a boolean to an Integer using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toIntegerObject(true) = new Integer(1) + * BooleanUtils.toIntegerObject(false) = new Integer(0) + * </pre> + * + * @param bool the boolean to convert + * @return one if <code>true</code>, zero if <code>false</code> + */ + public static Integer toIntegerObject( boolean bool ) + { + return ( bool ? INTEGER_ONE : INTEGER_ZERO ); + } + + + /** + * <p>Converts a Boolean to a Integer using the convention that + * <code>zero</code> is <code>false</code>.</p> + * <p/> + * <p><code>null</code> will be converted to <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toIntegerObject(Boolean.TRUE) = new Integer(1) + * BooleanUtils.toIntegerObject(Boolean.FALSE) = new Integer(0) + * </pre> + * + * @param bool the Boolean to convert + * @return one if Boolean.TRUE, zero if Boolean.FALSE, <code>null</code> if + * <code>null</code> + */ + public static Integer toIntegerObject( Boolean bool ) + { + if ( bool == null ) + { + return null; + } + return ( bool.booleanValue() ? INTEGER_ONE : INTEGER_ZERO ); + } + + + /** + * <p>Converts a boolean to an int specifying the conversion values.</p> + * <p/> + * <pre> + * BooleanUtils.toInteger(true, 1, 0) = 1 + * BooleanUtils.toInteger(false, 1, 0) = 0 + * </pre> + * + * @param bool the to convert + * @param trueValue the value to return if <code>true</code> + * @param falseValue the value to return if <code>false</code> + * @return the appropriate value + */ + public static int toInteger( boolean bool, int trueValue, int falseValue ) + { + return ( bool ? trueValue : falseValue ); + } + + + /** + * <p>Converts a Boolean to an int specifying the conversion values.</p> + * <p/> + * <pre> + * BooleanUtils.toInteger(Boolean.TRUE, 1, 0, 2) = 1 + * BooleanUtils.toInteger(Boolean.FALSE, 1, 0, 2) = 0 + * BooleanUtils.toInteger(null, 1, 0, 2) = 2 + * </pre> + * + * @param bool the Boolean to convert + * @param trueValue the value to return if <code>true</code> + * @param falseValue the value to return if <code>false</code> + * @param nullValue the value to return if <code>null</code> + * @return the appropriate value + */ + public static int toInteger( Boolean bool, int trueValue, int falseValue, int nullValue ) + { + if ( bool == null ) + { + return nullValue; + } + return ( bool.booleanValue() ? trueValue : falseValue ); + } + + + /** + * <p>Converts a boolean to an Integer specifying the conversion + * values.</p> + * <p/> + * <pre> + * BooleanUtils.toIntegerObject(true, new Integer(1), new Integer(0)) = + * new Integer(1) + * BooleanUtils.toIntegerObject(false, new Integer(1), new Integer(0)) = + * new Integer(0) + * </pre> + * + * @param bool the to convert + * @param trueValue the value to return if <code>true</code>, may be + * <code>null</code> + * @param falseValue the value to return if <code>false</code>, may be + * <code>null</code> + * @return the appropriate value + */ + public static Integer toIntegerObject( boolean bool, Integer trueValue, Integer falseValue ) + { + return ( bool ? trueValue : falseValue ); + } + + + /** + * <p>Converts a Boolean to an Integer specifying the conversion + * values.</p> + * <p/> + * <pre> + * BooleanUtils.toIntegerObject(Boolean.TRUE, new Integer(1), new + * Integer(0), new Integer(2)) = new Integer(1) + * BooleanUtils.toIntegerObject(Boolean.FALSE, new Integer(1), new + * Integer(0), new Integer(2)) = new Integer(0) + * BooleanUtils.toIntegerObject(null, new Integer(1), new Integer(0), new + * Integer(2)) = new Integer(2) + * </pre> + * + * @param bool the Boolean to convert + * @param trueValue the value to return if <code>true</code>, may be + * <code>null</code> + * @param falseValue the value to return if <code>false</code>, may be + * <code>null</code> + * @param nullValue the value to return if <code>null</code>, may be + * <code>null</code> + * @return the appropriate value + */ + public static Integer toIntegerObject( Boolean bool, Integer trueValue, Integer falseValue, Integer nullValue ) + { + if ( bool == null ) + { + return nullValue; + } + return ( bool.booleanValue() ? trueValue : falseValue ); + } + + // String to Boolean methods + //----------------------------------------------------------------------- + /** + * <p>Converts a String to a Boolean.</p> + * <p/> + * <p><code>'true'</code>, <code>'on'</code> or <code>'yes'</code> (case + * insensitive) will return <code>true</code>. <code>'false'</code>, + * <code>'off'</code> or <code>'no'</code> (case insensitive) will return + * <code>false</code>. Otherwise, <code>null</code> is returned.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanObject(null) = null + * BooleanUtils.toBooleanObject("true") = Boolean.TRUE + * BooleanUtils.toBooleanObject("false") = Boolean.FALSE + * BooleanUtils.toBooleanObject("on") = Boolean.TRUE + * BooleanUtils.toBooleanObject("ON") = Boolean.TRUE + * BooleanUtils.toBooleanObject("off") = Boolean.FALSE + * BooleanUtils.toBooleanObject("oFf") = Boolean.FALSE + * BooleanUtils.toBooleanObject("blue") = null + * </pre> + * + * @param str the String to check + * @return the Boolean value of the string, <code>null</code> if no match or + * <code>null</code> input + */ + public static Boolean toBooleanObject( String str ) + { + if ( "true".equalsIgnoreCase( str ) ) + { + return Boolean.TRUE; + } + else if ( "false".equalsIgnoreCase( str ) ) + { + return Boolean.FALSE; + } + else if ( "on".equalsIgnoreCase( str ) ) + { + return Boolean.TRUE; + } + else if ( "off".equalsIgnoreCase( str ) ) + { + return Boolean.FALSE; + } + else if ( "yes".equalsIgnoreCase( str ) ) + { + return Boolean.TRUE; + } + else if ( "no".equalsIgnoreCase( str ) ) + { + return Boolean.FALSE; + } + // no match + return null; + } + + + /** + * <p>Converts a String to a Boolean throwing an exception if no match.</p> + * <p/> + * <pre> + * BooleanUtils.toBooleanObject("true", "true", "false", "null") = + * Boolean.TRUE + * BooleanUtils.toBooleanObject("false", "true", "false", "null") = + * Boolean.FALSE + * BooleanUtils.toBooleanObject("null", "true", "false", "null") = null + * </pre> + * + * @param str the String to check + * @param trueString the String to match for <code>true</code> (case + * sensitive), may be <code>null</code> + * @param falseString the String to match for <code>false</code> (case + * sensitive), may be <code>null</code> + * @param nullString the String to match for <code>null</code> (case + * sensitive), may be <code>null</code> + * @return the Boolean value of the string, <code>null</code> if no match or + * <code>null</code> input + */ + public static Boolean toBooleanObject( String str, String trueString, String falseString, String nullString ) + { + if ( str == null ) + { + if ( trueString == null ) + { + return Boolean.TRUE; + } + else if ( falseString == null ) + { + return Boolean.FALSE; + } + else if ( nullString == null ) + { + return null; + } + } + else if ( str.equals( trueString ) ) + { + return Boolean.TRUE; + } + else if ( str.equals( falseString ) ) + { + return Boolean.FALSE; + } + else if ( str.equals( nullString ) ) + { + return null; + } + // no match + throw new IllegalArgumentException( "The String did not match any specified value" ); + } + + // String to boolean methods + //----------------------------------------------------------------------- + /** + * <p>Converts a String to a boolean (optimised for performance).</p> + * <p/> + * <p><code>'true'</code>, <code>'on'</code> or <code>'yes'</code> (case + * insensitive) will return <code>true</code>. Otherwise, <code>false</code> + * is returned.</p> + * <p/> + * <p>This method performs 4 times faster (JDK1.4) than + * <code>Boolean.valueOf(String)</code>. However, this method accepts 'on' + * and 'yes' as true values. + * <p/> + * <pre> + * BooleanUtils.toBoolean(null) = false + * BooleanUtils.toBoolean("true") = true + * BooleanUtils.toBoolean("TRUE") = true + * BooleanUtils.toBoolean("tRUe") = true + * BooleanUtils.toBoolean("on") = true + * BooleanUtils.toBoolean("yes") = true + * BooleanUtils.toBoolean("false") = false + * BooleanUtils.toBoolean("x gti") = false + * </pre> + * + * @param str the String to check + * @return the boolean value of the string, <code>false</code> if no match + */ + public static boolean toBoolean( String str ) + { + // Previously used equalsIgnoreCase, which was fast for interned 'true'. + // Non interned 'true' matched 15 times slower. + // + // Optimisation provides same performance as before for interned 'true'. + // Similar performance for null, 'false', and other strings not length 2/3/4. + // 'true'/'TRUE' match 4 times slower, 'tRUE'/'True' 7 times slower. + if ( str == "true" ) + { + return true; + } + if ( str == null ) + { + return false; + } + switch ( str.length() ) + { + case 2: + { + char ch0 = str.charAt( 0 ); + char ch1 = str.charAt( 1 ); + return + ( ch0 == 'o' || ch0 == 'O' ) && + ( ch1 == 'n' || ch1 == 'N' ); + } + case 3: + { + char ch = str.charAt( 0 ); + if ( ch == 'y' ) + { + return + ( str.charAt( 1 ) == 'e' || str.charAt( 1 ) == 'E' ) && + ( str.charAt( 2 ) == 's' || str.charAt( 2 ) == 'S' ); + } + if ( ch == 'Y' ) + { + return + ( str.charAt( 1 ) == 'E' || str.charAt( 1 ) == 'e' ) && + ( str.charAt( 2 ) == 'S' || str.charAt( 2 ) == 's' ); + } + } + case 4: + { + char ch = str.charAt( 0 ); + if ( ch == 't' ) + { + return + ( str.charAt( 1 ) == 'r' || str.charAt( 1 ) == 'R' ) && + ( str.charAt( 2 ) == 'u' || str.charAt( 2 ) == 'U' ) && + ( str.charAt( 3 ) == 'e' || str.charAt( 3 ) == 'E' ); + } + if ( ch == 'T' ) + { + return + ( str.charAt( 1 ) == 'R' || str.charAt( 1 ) == 'r' ) && + ( str.charAt( 2 ) == 'U' || str.charAt( 2 ) == 'u' ) && + ( str.charAt( 3 ) == 'E' || str.charAt( 3 ) == 'e' ); + } + } + } + return false; + } + + + /** + * <p>Converts a String to a Boolean throwing an exception if no match + * found.</p> + * <p/> + * <p>null is returned if there is no match.</p> + * <p/> + * <pre> + * BooleanUtils.toBoolean("true", "true", "false") = true + * BooleanUtils.toBoolean("false", "true", "false") = false + * </pre> + * + * @param str the String to check + * @param trueString the String to match for <code>true</code> (case + * sensitive), may be <code>null</code> + * @param falseString the String to match for <code>false</code> (case + * sensitive), may be <code>null</code> + * @return the boolean value of the string + * @throws IllegalArgumentException if the String doesn't match + */ + public static boolean toBoolean( String str, String trueString, String falseString ) + { + if ( str == null ) + { + if ( trueString == null ) + { + return true; + } + else if ( falseString == null ) + { + return false; + } + } + else if ( str.equals( trueString ) ) + { + return true; + } + else if ( str.equals( falseString ) ) + { + return false; + } + // no match + throw new IllegalArgumentException( "The String did not match either specified value" ); + } + + // Boolean to String methods + //----------------------------------------------------------------------- + /** + * <p>Converts a Boolean to a String returning <code>'true'</code>, + * <code>'false'</code>, or <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringTrueFalse(Boolean.TRUE) = "true" + * BooleanUtils.toStringTrueFalse(Boolean.FALSE) = "false" + * BooleanUtils.toStringTrueFalse(null) = null; + * </pre> + * + * @param bool the Boolean to check + * @return <code>'true'</code>, <code>'false'</code>, or <code>null</code> + */ + public static String toStringTrueFalse( Boolean bool ) + { + return toString( bool, "true", "false", null ); + } + + + /** + * <p>Converts a Boolean to a String returning <code>'on'</code>, + * <code>'off'</code>, or <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringOnOff(Boolean.TRUE) = "on" + * BooleanUtils.toStringOnOff(Boolean.FALSE) = "off" + * BooleanUtils.toStringOnOff(null) = null; + * </pre> + * + * @param bool the Boolean to check + * @return <code>'on'</code>, <code>'off'</code>, or <code>null</code> + */ + public static String toStringOnOff( Boolean bool ) + { + return toString( bool, "on", "off", null ); + } + + + /** + * <p>Converts a Boolean to a String returning <code>'yes'</code>, + * <code>'no'</code>, or <code>null</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringYesNo(Boolean.TRUE) = "yes" + * BooleanUtils.toStringYesNo(Boolean.FALSE) = "no" + * BooleanUtils.toStringYesNo(null) = null; + * </pre> + * + * @param bool the Boolean to check + * @return <code>'yes'</code>, <code>'no'</code>, or <code>null</code> + */ + public static String toStringYesNo( Boolean bool ) + { + return toString( bool, "yes", "no", null ); + } + + + /** + * <p>Converts a Boolean to a String returning one of the input + * Strings.</p> + * <p/> + * <pre> + * BooleanUtils.toString(Boolean.TRUE, "true", "false", null) = "true" + * BooleanUtils.toString(Boolean.FALSE, "true", "false", null) = "false" + * BooleanUtils.toString(null, "true", "false", null) = null; + * </pre> + * + * @param bool the Boolean to check + * @param trueString the String to return if <code>true</code>, may be + * <code>null</code> + * @param falseString the String to return if <code>false</code>, may be + * <code>null</code> + * @param nullString the String to return if <code>null</code>, may be + * <code>null</code> + * @return one of the three input Strings + */ + public static String toString( Boolean bool, String trueString, String falseString, String nullString ) + { + if ( bool == null ) + { + return nullString; + } + return ( bool.booleanValue() ? trueString : falseString ); + } + + // boolean to String methods + //----------------------------------------------------------------------- + /** + * <p>Converts a boolean to a String returning <code>'true'</code> or + * <code>'false'</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringTrueFalse(true) = "true" + * BooleanUtils.toStringTrueFalse(false) = "false" + * </pre> + * + * @param bool the Boolean to check + * @return <code>'true'</code>, <code>'false'</code>, or <code>null</code> + */ + public static String toStringTrueFalse( boolean bool ) + { + return toString( bool, "true", "false" ); + } + + + /** + * <p>Converts a boolean to a String returning <code>'on'</code> or + * <code>'off'</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringOnOff(true) = "on" + * BooleanUtils.toStringOnOff(false) = "off" + * </pre> + * + * @param bool the Boolean to check + * @return <code>'on'</code>, <code>'off'</code>, or <code>null</code> + */ + public static String toStringOnOff( boolean bool ) + { + return toString( bool, "on", "off" ); + } + + + /** + * <p>Converts a boolean to a String returning <code>'yes'</code> or + * <code>'no'</code>.</p> + * <p/> + * <pre> + * BooleanUtils.toStringYesNo(true) = "yes" + * BooleanUtils.toStringYesNo(false) = "no" + * </pre> + * + * @param bool the Boolean to check + * @return <code>'yes'</code>, <code>'no'</code>, or <code>null</code> + */ + public static String toStringYesNo( boolean bool ) + { + return toString( bool, "yes", "no" ); + } + + + /** + * <p>Converts a boolean to a String returning one of the input + * Strings.</p> + * <p/> + * <pre> + * BooleanUtils.toString(true, "true", "false") = "true" + * BooleanUtils.toString(false, "true", "false") = "false" + * </pre> + * + * @param bool the Boolean to check + * @param trueString the String to return if <code>true</code>, may be + * <code>null</code> + * @param falseString the String to return if <code>false</code>, may be + * <code>null</code> + * @return one of the two input Strings + */ + public static String toString( boolean bool, String trueString, String falseString ) + { + return ( bool ? trueString : falseString ); + } + + // xor methods + // ---------------------------------------------------------------------- + /** + * <p>Performs an xor on a set of booleans.</p> + * <p/> + * <pre> + * BooleanUtils.xor(new boolean[] { true, true }) = false + * BooleanUtils.xor(new boolean[] { false, false }) = false + * BooleanUtils.xor(new boolean[] { true, false }) = true + * </pre> + * + * @param array an array of <code>boolean<code>s + * @return <code>true</code> if the xor is successful. + * @throws IllegalArgumentException if <code>array</code> is <code>null</code> + * @throws IllegalArgumentException if <code>array</code> is empty. + */ + public static boolean xor( boolean[] array ) + { + // Validates input + if ( array == null ) + { + throw new IllegalArgumentException( "The Array must not be null" ); + } + else if ( array.length == 0 ) + { + throw new IllegalArgumentException( "Array is empty" ); + } + + // Loops through array, comparing each item + int trueCount = 0; + for ( int i = 0; i < array.length; i++ ) + { + // If item is true, and trueCount is < 1, increments count + // Else, xor fails + if ( array[i] ) + { + if ( trueCount < 1 ) + { + trueCount++; + } + else + { + return false; + } + } + } + + // Returns true if there was exactly 1 true item + return trueCount == 1; + } + + + /** + * <p>Performs an xor on an array of Booleans.</p> + * <p/> + * <pre> + * BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.TRUE }) = + * Boolean.FALSE + * BooleanUtils.xor(new Boolean[] { Boolean.FALSE, Boolean.FALSE }) = + * Boolean.FALSE + * BooleanUtils.xor(new Boolean[] { Boolean.TRUE, Boolean.FALSE }) = + * Boolean.TRUE + * </pre> + * + * @param array an array of <code>Boolean<code>s + * @return <code>true</code> if the xor is successful. + * @throws IllegalArgumentException if <code>array</code> is <code>null</code> + * @throws IllegalArgumentException if <code>array</code> is empty. + * @throws IllegalArgumentException if <code>array</code> contains a + * <code>null</code> + */ + public static Boolean xor( Boolean[] array ) + { + if ( array == null ) + { + throw new IllegalArgumentException( "The Array must not be null" ); + } + else if ( array.length == 0 ) + { + throw new IllegalArgumentException( "Array is empty" ); + } + boolean[] primitive = null; + try + { + primitive = ArrayUtils.toPrimitive( array ); + } + catch ( NullPointerException ex ) + { + throw new IllegalArgumentException( "The array must not contain any null elements" ); + } + return ( xor( primitive ) ? Boolean.TRUE : Boolean.FALSE ); + } + +}
Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/Enum.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/Enum.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/Enum.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/Enum.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,720 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * 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 org.apache.asn1.util; + + +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.*; + + +/** + * <p>Abstract superclass for type-safe enums.</p> + * <p/> + * <p>One feature of the C programming language lacking in Java is enumerations. + * The C implementation based on ints was poor and open to abuse. The original + * Java recommendation and most of the JDK also uses int constants. It has been + * recognised however that a more robust type-safe class-based solution can be + * designed. This class follows the basic Java type-safe enumeration + * pattern.</p> + * <p/> + * <p><em>NOTE:</em>Due to the way in which Java ClassLoaders work, comparing + * Enum objects should always be done using <code>equals()</code>, not + * <code>==</code>. The equals() method will try == first so in most cases the + * effect is the same.</p> + * <p/> + * <p>Of course, if you actually want (or don't mind) Enums in different class + * loaders being non-equal, then you can use <code>==</code>.</p> + * <p/> + * <h4>Simple Enums</h4> + * <p/> + * <p>To use this class, it must be subclassed. For example:</p> + * <p/> + * <pre> + * public final class ColorEnum extends Enum { + * public static final ColorEnum RED = new ColorEnum("Red"); + * public static final ColorEnum GREEN = new ColorEnum("Green"); + * public static final ColorEnum BLUE = new ColorEnum("Blue"); + * <p/> + * private ColorEnum(String color) { + * super(color); + * } + * <p/> + * public static ColorEnum getEnum(String color) { + * return (ColorEnum) getEnum(ColorEnum.class, color); + * } + * <p/> + * public static Map getEnumMap() { + * return getEnumMap(ColorEnum.class); + * } + * <p/> + * public static List getEnumList() { + * return getEnumList(ColorEnum.class); + * } + * <p/> + * public static Iterator iterator() { + * return iterator(ColorEnum.class); + * } + * } + * </pre> + * <p/> + * <p>As shown, each enum has a name. This can be accessed using + * <code>getName</code>.</p> + * <p/> + * <p>The <code>getEnum</code> and <code>iterator</code> methods are + * recommended. Unfortunately, Java restrictions require these to be coded as + * shown in each subclass. An alternative choice is to use the [EMAIL PROTECTED] EnumUtils} + * class.</p> + * <p/> + * <h4>Subclassed Enums</h4> <p>A hierarchy of Enum classes can be built. In + * this case, the superclass is unaffected by the addition of subclasses (as per + * normal Java). The subclasses may add additional Enum constants <em>of the + * type of the superclass</em>. The query methods on the subclass will return + * all of the Enum constants from the superclass and subclass.</p> + * <p/> + * <pre> + * public final class ExtraColorEnum extends ColorEnum { + * // NOTE: Color enum declared above is final, change that to get this + * // example to compile. + * public static final ColorEnum YELLOW = new ExtraColorEnum("Yellow"); + * <p/> + * private ExtraColorEnum(String color) { + * super(color); + * } + * <p/> + * public static ColorEnum getEnum(String color) { + * return (ColorEnum) getEnum(ExtraColorEnum.class, color); + * } + * <p/> + * public static Map getEnumMap() { + * return getEnumMap(ExtraColorEnum.class); + * } + * <p/> + * public static List getEnumList() { + * return getEnumList(ExtraColorEnum.class); + * } + * <p/> + * public static Iterator iterator() { + * return iterator(ExtraColorEnum.class); + * } + * } + * </pre> + * <p/> + * <p>This example will return RED, GREEN, BLUE, YELLOW from the List and + * iterator methods in that order. The RED, GREEN and BLUE instances will be the + * same (==) as those from the superclass ColorEnum. Note that YELLOW is + * declared as a ColorEnum and not an ExtraColorEnum.</p> + * <p/> + * <h4>Functional Enums</h4> + * <p/> + * <p>The enums can have functionality by defining subclasses and overriding the + * <code>getEnumClass()</code> method:</p> + * <p/> + * <pre> + * public static final OperationEnum PLUS = new PlusOperation(); + * private static final class PlusOperation extends OperationEnum { + * private PlusOperation() { + * super("Plus"); + * } + * public int eval(int a, int b) { + * return (a + b); + * } + * } + * public static final OperationEnum MINUS = new MinusOperation(); + * private static final class MinusOperation extends OperationEnum { + * private MinusOperation() { + * super("Minus"); + * } + * public int eval(int a, int b) { + * return (a - b); + * } + * } + * <p/> + * private OperationEnum(String color) { + * super(color); + * } + * <p/> + * public final Class getEnumClass() { // NOTE: new method! + * return OperationEnum.class; + * } + * <p/> + * public abstract double eval(double a, double b); + * <p/> + * public static OperationEnum getEnum(String name) { + * return (OperationEnum) getEnum(OperationEnum.class, name); + * } + * <p/> + * public static Map getEnumMap() { + * return getEnumMap(OperationEnum.class); + * } + * <p/> + * public static List getEnumList() { + * return getEnumList(OperationEnum.class); + * } + * <p/> + * public static Iterator iterator() { + * return iterator(OperationEnum.class); + * } + * } + * </pre> + * <p>The code above will work on JDK 1.2. If JDK1.3 and later is used, the + * subclasses may be defined as anonymous.</p> + * <p/> + * <h4>Nested class Enums</h4> + * <p/> + * <p>Care must be taken with class loading when defining a static nested class + * for enums. The static nested class can be loaded without the surrounding + * outer class being loaded. This can result in an empty list/map/iterator being + * returned. One solution is to define a static block that references the outer + * class where the constants are defined. For example:</p> + * <p/> + * <pre> + * public final class Outer { + * public static final BWEnum BLACK = new BWEnum("Black"); + * public static final BWEnum WHITE = new BWEnum("White"); + * <p/> + * // static nested enum class + * public static final class BWEnum extends Enum { + * <p/> + * static { + * // explicitly reference BWEnum class to force constants to load + * Object obj = Outer.BLACK; + * } + * <p/> + * // ... other methods omitted + * } + * } + * </pre> + * <p/> + * <p>Although the above solves the problem, it is not recommended. The best + * solution is to define the constants in the enum class, and hold references in + * the outer class: + * <p/> + * <pre> + * public final class Outer { + * public static final BWEnum BLACK = BWEnum.BLACK; + * public static final BWEnum WHITE = BWEnum.WHITE; + * <p/> + * // static nested enum class + * public static final class BWEnum extends Enum { + * // only define constants in enum classes - private if desired + * private static final BWEnum BLACK = new BWEnum("Black"); + * private static final BWEnum WHITE = new BWEnum("White"); + * <p/> + * // ... other methods omitted + * } + * } + * </pre> + * <p/> + * <p>For more details, see the 'Nested' test cases. + * + * @author Apache Avalon project + * @author Stephen Colebourne + * @author Chris Webb + * @author Mike Bowler + * @version $Id: Enum.java,v 1.28 2004/02/23 04:34:20 ggregory Exp $ + * @since 1.0 + */ +public abstract class Enum implements Comparable, Serializable +{ + + // After discussion, the default size for HashMaps is used, as the + // sizing algorithm changes across the JDK versions + /** + * An empty <code>Map</code>, as JDK1.2 didn't have an empty map. + */ + private static final Map EMPTY_MAP = Collections.unmodifiableMap( new HashMap( 0 ) ); + + /** + * <code>Map</code>, key of class name, value of <code>Entry</code>. + */ + private static final Map cEnumClasses = new HashMap(); + + /** + * The string representation of the Enum. + */ + private final String iName; + + /** + * The hashcode representation of the Enum. + */ + private transient final int iHashCode; + + /** + * The toString representation of the Enum. + * + * @since 2.0 + */ + protected transient String iToString = null; + + /** + * <p>Enable the iterator to retain the source code order.</p> + */ + private static class Entry + { + /** + * Map of Enum name to Enum. + */ + final Map map = new HashMap(); + /** + * Map of Enum name to Enum. + */ + final Map unmodifiableMap = Collections.unmodifiableMap( map ); + /** + * List of Enums in source code order. + */ + final List list = new ArrayList( 25 ); + /** + * Map of Enum name to Enum. + */ + final List unmodifiableList = Collections.unmodifiableList( list ); + + + /** + * <p>Restrictive constructor.</p> + */ + private Entry() + { + } + } + + + /** + * <p>Constructor to add a new named item to the enumeration.</p> + * + * @param name the name of the enum object, must not be empty or + * <code>null</code> + * @throws IllegalArgumentException if the name is <code>null</code> or an + * empty string + * @throws IllegalArgumentException if the getEnumClass() method returns a + * null or invalid Class + */ + protected Enum( String name ) + { + super(); + + init( name ); + + iName = name; + iHashCode = 7 + getEnumClass().hashCode() + 3 * name.hashCode(); + + // cannot create toString here as subclasses may want to include other data + } + + + private static boolean isEmpty( String str ) + { + return ( str == null || str.length() == 0 ); + } + + + /** + * Initializes the enumeration. + * + * @param name the enum name + * @throws IllegalArgumentException if the name is null or empty or + * duplicate + * @throws IllegalArgumentException if the enumClass is null or invalid + */ + private void init( String name ) + { + if ( isEmpty( name ) ) + { + throw new IllegalArgumentException( "The Enum name must not be empty or null" ); + } + + Class enumClass = getEnumClass(); + + if ( enumClass == null ) + { + throw new IllegalArgumentException( "getEnumClass() must not be null" ); + } + + Class cls = getClass(); + + boolean ok = false; + + while ( cls != null && cls != Enum.class && cls != ValuedEnum.class ) + { + if ( cls == enumClass ) + { + ok = true; + + break; + } + + cls = cls.getSuperclass(); + } + + if ( ok == false ) + { + throw new IllegalArgumentException( "getEnumClass() must return a superclass of this class" ); + } + + // create entry + Entry entry = ( Entry ) cEnumClasses.get( enumClass ); + + if ( entry == null ) + { + entry = createEntry( enumClass ); + + cEnumClasses.put( enumClass, entry ); + } + if ( entry.map.containsKey( name ) ) + { + throw new IllegalArgumentException( "The Enum name must be unique, '" + name + "' has already been added" ); + } + + entry.map.put( name, this ); + + entry.list.add( this ); + } + + + /** + * <p>Handle the deserialization of the class to ensure that multiple copies + * are not wastefully created, or illegal enum types created.</p> + * + * @return the resolved object + */ + protected Object readResolve() + { + Entry entry = ( Entry ) cEnumClasses.get( getEnumClass() ); + + if ( entry == null ) + { + return null; + } + + return ( Enum ) entry.map.get( getName() ); + } + + //-------------------------------------------------------------------------------- + + /** + * <p>Gets an <code>Enum</code> object by class and name.</p> + * + * @param enumClass the class of the Enum to get, must not be + * <code>null</code> + * @param name the name of the <code>Enum</code> to get, may be + * <code>null</code> + * @return the enum object, or null if the enum does not exist + * @throws IllegalArgumentException if the enum class is <code>null</code> + */ + protected static Enum getEnum( Class enumClass, String name ) + { + Entry entry = getEntry( enumClass ); + + if ( entry == null ) + { + return null; + } + + return ( Enum ) entry.map.get( name ); + } + + + /** + * <p>Gets the <code>Map</code> of <code>Enum</code> objects by name using + * the <code>Enum</code> class.</p> + * <p/> + * <p>If the requested class has no enum objects an empty <code>Map</code> + * is returned.</p> + * + * @param enumClass the class of the <code>Enum</code> to get, must not be + * <code>null</code> + * @return the enum object Map + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * Enum + */ + protected static Map getEnumMap( Class enumClass ) + { + Entry entry = getEntry( enumClass ); + + if ( entry == null ) + { + return EMPTY_MAP; + } + + return entry.unmodifiableMap; + } + + + /** + * <p>Gets the <code>List</code> of <code>Enum</code> objects using the + * <code>Enum</code> class.</p> + * <p/> + * <p>The list is in the order that the objects were created (source code + * order). If the requested class has no enum objects an empty + * <code>List</code> is returned.</p> + * + * @param enumClass the class of the <code>Enum</code> to get, must not be + * <code>null</code> + * @return the enum object Map + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * Enum + */ + protected static List getEnumList( Class enumClass ) + { + Entry entry = getEntry( enumClass ); + + if ( entry == null ) + { + return Collections.EMPTY_LIST; + } + + return entry.unmodifiableList; + } + + + /** + * <p>Gets an <code>Iterator</code> over the <code>Enum</code> objects in an + * <code>Enum</code> class.</p> + * <p/> + * <p>The <code>Iterator</code> is in the order that the objects were + * created (source code order). If the requested class has no enum objects + * an empty <code>Iterator</code> is returned.</p> + * + * @param enumClass the class of the <code>Enum</code> to get, must not be + * <code>null</code> + * @return an iterator of the Enum objects + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * Enum + */ + protected static Iterator iterator( Class enumClass ) + { + return Enum.getEnumList( enumClass ).iterator(); + } + + //----------------------------------------------------------------------- + /** + * <p>Gets an <code>Entry</code> from the map of Enums.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @return the enum entry + */ + private static Entry getEntry( Class enumClass ) + { + if ( enumClass == null ) + { + throw new IllegalArgumentException( "The Enum Class must not be null" ); + } + if ( Enum.class.isAssignableFrom( enumClass ) == false ) + { + throw new IllegalArgumentException( "The Class must be a subclass of Enum" ); + } + + Entry entry = ( Entry ) cEnumClasses.get( enumClass ); + + return entry; + } + + + /** + * <p>Creates an <code>Entry</code> for storing the Enums.</p> + * <p/> + * <p>This accounts for subclassed Enums.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @return the enum entry + */ + private static Entry createEntry( Class enumClass ) + { + Entry entry = new Entry(); + + Class cls = enumClass.getSuperclass(); + + while ( cls != null && cls != Enum.class && cls != ValuedEnum.class ) + { + Entry loopEntry = ( Entry ) cEnumClasses.get( cls ); + + if ( loopEntry != null ) + { + entry.list.addAll( loopEntry.list ); + + entry.map.putAll( loopEntry.map ); + + break; // stop here, as this will already have had superclasses added + } + cls = cls.getSuperclass(); + } + + return entry; + } + + + //----------------------------------------------------------------------- + /** + * <p>Retrieve the name of this Enum item, set in the constructor.</p> + * + * @return the <code>String</code> name of this Enum item + */ + public final String getName() + { + return iName; + } + + + /** + * <p>Retrieves the Class of this Enum item, set in the constructor.</p> + * <p/> + * <p>This is normally the same as <code>getClass()</code>, but for advanced + * Enums may be different. If overridden, it must return a constant + * value.</p> + * + * @return the <code>Class</code> of the enum + * @since 2.0 + */ + public Class getEnumClass() + { + return getClass(); + } + + + /** + * <p>Tests for equality.</p> + * <p/> + * <p>Two Enum objects are considered equal if they have the same class + * names and the same names. Identity is tested for first, so this method + * usually runs fast.</p> + * <p/> + * <p>If the parameter is in a different class loader than this instance, + * reflection is used to compare the names.</p> + * + * @param other the other object to compare for equality + * @return <code>true</code> if the Enums are equal + */ + public final boolean equals( Object other ) + { + if ( other == this ) + { + return true; + } + else if ( other == null ) + { + return false; + } + else if ( other.getClass() == this.getClass() ) + { + // Ok to do a class cast to Enum here since the test above + // guarantee both + // classes are in the same class loader. + return iName.equals( ( ( Enum ) other ).iName ); + } + else + { + // This and other are in different class loaders, we must use reflection. + try + { + Method mth = other.getClass().getMethod( "getName", null ); + + String name = ( String ) mth.invoke( other, null ); + + return iName.equals( name ); + } + catch ( NoSuchMethodException e ) + { + // ignore - should never happen + } + catch ( IllegalAccessException e ) + { + // ignore - should never happen + } + catch ( InvocationTargetException e ) + { + // ignore - should never happen + } + + return false; + } + } + + + /** + * <p>Returns a suitable hashCode for the enumeration.</p> + * + * @return a hashcode based on the name + */ + public final int hashCode() + { + return iHashCode; + } + + + /** + * <p>Tests for order.</p> + * <p/> + * <p>The default ordering is alphabetic by name, but this can be overridden + * by subclasses.</p> + * + * @param other the other object to compare to + * @return -ve if this is less than the other object, +ve if greater than, + * <code>0</code> of equal + * @throws ClassCastException if other is not an Enum + * @throws NullPointerException if other is <code>null</code> + * @see java.lang.Comparable#compareTo(Object) + */ + public int compareTo( Object other ) + { + if ( other == this ) + { + return 0; + } + + return iName.compareTo( ( ( Enum ) other ).iName ); + } + + + /** + * <p>Human readable description of this Enum item.</p> + * + * @return String in the form <code>type[name]</code>, for example: + * <code>Color[Red]</code>. Note that the package name is stripped + * from the type name. + */ + public String toString() + { + if ( iToString == null ) + { + String shortName = getShortName( getEnumClass() ); + + iToString = shortName + "[" + getName() + "]"; + } + return iToString; + } + + + protected String getShortName( Class c ) + { + String[] comps = c.getName().split( "." ); + + if ( comps.length - 1 > 0 ) + { + return comps[comps.length - 1]; + } + + if ( comps.length == 1 ) + { + return comps[0]; + } + + return "ENUM"; + } +} Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/EnumUtils.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/EnumUtils.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/EnumUtils.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/EnumUtils.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,138 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * 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 org.apache.asn1.util; + + +import java.util.Iterator; +import java.util.List; +import java.util.Map; + + +/** + * <p>Utility class for accessing and manipulating [EMAIL PROTECTED] Enum}s.</p> + * + * @author Stephen Colebourne + * @author Gary Gregory + * @version $Id: EnumUtils.java,v 1.12 2004/02/23 04:34:20 ggregory Exp $ + * @see Enum + * @see ValuedEnum + * @since 1.0 + */ +public class EnumUtils +{ + + /** + * Public constructor. This class should not normally be instantiated. + * + * @since 2.0 + */ + public EnumUtils() + { + } + + + /** + * <p>Gets an <code>Enum</code> object by class and name.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @param name the name of the Enum to get, may be <code>null</code> + * @return the enum object + * @throws IllegalArgumentException if the enum class is <code>null</code> + */ + public static Enum getEnum( Class enumClass, String name ) + { + return Enum.getEnum( enumClass, name ); + } + + + /** + * <p>Gets a <code>ValuedEnum</code> object by class and value.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @param value the value of the <code>Enum</code> to get + * @return the enum object, or null if the enum does not exist + * @throws IllegalArgumentException if the enum class is <code>null</code> + */ + public static ValuedEnum getEnum( Class enumClass, int value ) + { + return ( ValuedEnum ) ValuedEnum.getEnum( enumClass, value ); + } + + + /** + * <p>Gets the <code>Map</code> of <code>Enum</code> objects by name using + * the <code>Enum</code> class.</p> + * <p/> + * <p>If the requested class has no enum objects an empty <code>Map</code> + * is returned. The <code>Map</code> is unmodifiable.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @return the enum object Map + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * <code>Enum</code> + */ + public static Map getEnumMap( Class enumClass ) + { + return Enum.getEnumMap( enumClass ); + } + + + /** + * <p>Gets the <code>List</code> of <code>Enum</code> objects using the + * <code>Enum</code> class.</p> + * <p/> + * <p>The list is in the order that the objects were created (source code + * order).</p> + * <p/> + * <p>If the requested class has no enum objects an empty <code>List</code> + * is returned. The <code>List</code> is unmodifiable.</p> + * + * @param enumClass the class of the Enum to get + * @return the enum object Map + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * <code>Enum</code> + */ + public static List getEnumList( Class enumClass ) + { + return Enum.getEnumList( enumClass ); + } + + + /** + * <p>Gets an <code>Iterator</code> over the <code>Enum</code> objects in an + * <code>Enum</code> class.</p> + * <p/> + * <p>The iterator is in the order that the objects were created (source + * code order).</p> + * <p/> + * <p>If the requested class has no enum objects an empty + * <code>Iterator</code> is returned. The <code>Iterator</code> is + * unmodifiable.</p> + * + * @param enumClass the class of the <code>Enum</code> to get + * @return an <code>Iterator</code> of the <code>Enum</code> objects + * @throws IllegalArgumentException if the enum class is <code>null</code> + * @throws IllegalArgumentException if the enum class is not a subclass of + * <code>Enum</code> + */ + public static Iterator iterator( Class enumClass ) + { + return Enum.getEnumList( enumClass ).iterator(); + } + +}
