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.lang.reflect.Method;
023    import java.util.HashMap;
024    import java.util.Map;
025    
026    /**
027     * An {@link Invoker} implementation which merely returns null for all method invocations.  This class is
028     * useful for scenarios where the "null object" design pattern is needed.
029     *
030     * @author James Carman
031     * @since 1.0
032     */
033    public class NullInvoker implements Invoker
034    {
035        private static Map primitiveValueMap = new HashMap();
036        static
037        {
038            primitiveValueMap.put( Integer.TYPE, new Integer( 0 ) );
039            primitiveValueMap.put( Long.TYPE, new Long( 0 ) );
040            primitiveValueMap.put( Short.TYPE, new Short( ( short )0 ) );
041            primitiveValueMap.put( Byte.TYPE, new Byte( ( byte )0 ) );
042            primitiveValueMap.put( Float.TYPE, new Float( 0.0f ) );
043            primitiveValueMap.put( Double.TYPE, new Double( 0.0 ) );
044            primitiveValueMap.put( Character.TYPE, new Character( ( char )0 ) );
045            primitiveValueMap.put( Boolean.TYPE, Boolean.FALSE );
046        }
047    //----------------------------------------------------------------------------------------------------------------------
048    // InvocationHandler Implementation
049    //----------------------------------------------------------------------------------------------------------------------
050    
051        public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable
052        {
053            final Class returnType = method.getReturnType();
054            if( returnType.isPrimitive() )
055            {
056                return primitiveValueMap.get( returnType );
057            }
058            else
059            {
060                return null;
061            }
062        }
063    }
064