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.jexl2.internal;
019    import java.lang.reflect.InvocationTargetException;
020    /**
021     * Specialized executor to get a boolean property from an object.
022     * @since 2.0
023     */
024    public final class BooleanGetExecutor extends AbstractExecutor.Get {
025        /** The property. */
026        private final String property;
027        /**
028         * Creates an instance by attempting discovery of the get method.
029         * @param is the introspector
030         * @param clazz the class to introspect
031         * @param key the property to get
032         */
033        public BooleanGetExecutor(Introspector is, Class<?> clazz, String key) {
034            super(clazz, discover(is, clazz, key));
035            property = key;
036        }
037    
038        /** {@inheritDoc} */
039        @Override
040        public Object getTargetProperty() {
041            return property;
042        }
043    
044        /** {@inheritDoc} */
045        @Override
046        public Object execute(Object obj)
047            throws IllegalAccessException, InvocationTargetException {
048            return method == null ? null : method.invoke(obj, (Object[]) null);
049        }
050        
051        /** {@inheritDoc} */
052        @Override
053        public Object tryExecute(Object obj, Object key) {
054            if (obj != null && method !=  null
055                // ensure method name matches the property name
056                && property.equals(key)
057                && objectClass.equals(obj.getClass())) {
058                try {
059                    return method.invoke(obj, (Object[]) null);
060                } catch (InvocationTargetException xinvoke) {
061                    return TRY_FAILED; // fail
062                } catch (IllegalAccessException xill) {
063                    return TRY_FAILED;// fail
064                }
065            }
066            return TRY_FAILED;
067        }
068    
069        /**
070         * Discovers the method for a {@link BooleanGet}.
071         * <p>The method to be found should be named "is{P,p}property and return a boolean.</p>
072         *@param is the introspector
073         *@param clazz the class to find the get method from
074         *@param property the the property name
075         *@return the method if found, null otherwise
076         */
077        static java.lang.reflect.Method discover(Introspector is, final Class<?> clazz, String property) {
078            java.lang.reflect.Method m = PropertyGetExecutor.discoverGet(is, "is", clazz, property);
079            return (m != null && m.getReturnType() == Boolean.TYPE) ? m : null;
080        }
081    
082    }