001    /*
002     * Copyright 2002-2004 the original author or authors.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005     * use this file except in compliance with the License. You may obtain a copy of
006     * the License at
007     * 
008     * http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012     * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013     * License for the specific language governing permissions and limitations under
014     * the License.
015     */
016    package org.springframework.rules.closure;
017    
018    import org.springframework.rules.closure.Closure;
019    import org.springframework.rules.closure.support.AbstractClosure;
020    
021    /**
022     * Returns the Integer length of an object's string form, or zero if the object
023     * is null.
024     * 
025     * @author Keith Donald
026     */
027    public class StringLength extends AbstractClosure {
028        private static final StringLength INSTANCE = new StringLength();
029    
030        /**
031         * Returns the shared StringLength instance--this is possible as the default
032         * instance is immutable and stateless.
033         * 
034         * @return the shared instance
035         */
036        public static Closure instance() {
037            return INSTANCE;
038        }
039    
040        /**
041         * Evaluate the string form of the object returning an Integer representing
042         * the string length.
043         * 
044         * @return The string length Integer.
045         * @see Closure#call(java.lang.Object)
046         */
047        public Object call(Object value) {
048            if (value == null) { return new Integer(0); }
049            return new Integer(String.valueOf(value).length());
050        }
051    
052        public String toString() {
053            return "strLength(arg)";
054        }
055    
056    }