001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.proxy.invoker;
019    
020    import org.apache.commons.proxy.Invoker;
021    
022    import java.io.Serializable;
023    import java.lang.reflect.Method;
024    import java.util.HashMap;
025    import java.util.Map;
026    
027    /**
028     * An {@link Invoker} implementation which merely returns null for all method invocations.  This class is
029     * useful for scenarios where the "null object" design pattern is needed.
030     *
031     * @author James Carman
032     * @since 1.0
033     */
034    public class NullInvoker implements Invoker, Serializable
035    {
036    //**********************************************************************************************************************
037    // Fields
038    //**********************************************************************************************************************
039    
040        private static Map primitiveValueMap = new HashMap();
041    
042    //**********************************************************************************************************************
043    // Static Methods
044    //**********************************************************************************************************************
045    
046        static
047        {
048            primitiveValueMap.put(Integer.TYPE, new Integer(0));
049            primitiveValueMap.put(Long.TYPE, new Long(0));
050            primitiveValueMap.put(Short.TYPE, new Short(( short ) 0));
051            primitiveValueMap.put(Byte.TYPE, new Byte(( byte ) 0));
052            primitiveValueMap.put(Float.TYPE, new Float(0.0f));
053            primitiveValueMap.put(Double.TYPE, new Double(0.0));
054            primitiveValueMap.put(Character.TYPE, new Character(( char ) 0));
055            primitiveValueMap.put(Boolean.TYPE, Boolean.FALSE);
056        }
057    
058    //**********************************************************************************************************************
059    // Invoker Implementation
060    //**********************************************************************************************************************
061    
062        public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable
063        {
064            final Class returnType = method.getReturnType();
065            if( returnType.isPrimitive() )
066            {
067                return primitiveValueMap.get(returnType);
068            }
069            else
070            {
071                return null;
072            }
073        }
074    }
075