001    /*
002     * $Id: MemberAccessTest.java 1104112 2011-05-17 10:25:53Z mcucchiara $
003     * Licensed to the Apache Software Foundation (ASF) under one
004     * or more contributor license agreements.  See the NOTICE file
005     * distributed with this work for additional information
006     * regarding copyright ownership.  The ASF licenses this file
007     * to you under the Apache License, Version 2.0 (the
008     * "License"); you may not use this file except in compliance
009     * with the License.  You may obtain a copy of the License at
010     *
011     * http://www.apache.org/licenses/LICENSE-2.0
012     *
013     * Unless required by applicable law or agreed to in writing,
014     * software distributed under the License is distributed on an
015     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016     * KIND, either express or implied.  See the License for the
017     * specific language governing permissions and limitations
018     * under the License.
019     */
020    package org.apache.commons.ognl.test;
021    
022    import org.apache.commons.ognl.DefaultMemberAccess;
023    import org.apache.commons.ognl.OgnlException;
024    import org.apache.commons.ognl.test.objects.Simple;
025    import org.junit.Before;
026    import org.junit.runner.RunWith;
027    import org.junit.runners.Parameterized;
028    import org.junit.runners.Parameterized.Parameters;
029    
030    import java.lang.reflect.Member;
031    import java.lang.reflect.Method;
032    import java.util.ArrayList;
033    import java.util.Collection;
034    import java.util.Map;
035    
036    @RunWith(value = Parameterized.class)
037    public class MemberAccessTest
038        extends OgnlTestCase
039    {
040    
041        private static Simple ROOT = new Simple();
042    
043        private static Object[][] TESTS = { { "@Runtime@getRuntime()", OgnlException.class },
044            { "@System@getProperty('java.specification.version')", System.getProperty( "java.specification.version" ) },
045            { "bigIntValue", OgnlException.class },
046            { "bigIntValue", OgnlException.class, 25, OgnlException.class },
047            { "getBigIntValue()", OgnlException.class }, { "stringValue", ROOT.getStringValue() }, };
048    
049        /*
050         * =================================================================== Public static methods
051         * ===================================================================
052         */
053        @Parameters
054        public static Collection<Object[]> data()
055        {
056            Collection<Object[]> data = new ArrayList<Object[]>(TESTS.length);
057            for ( Object[] TEST : TESTS )
058            {
059                Object[] tmp = new Object[6];
060                tmp[0] = TEST[0] + " (" + TEST[1] + ")";
061                tmp[1] = ROOT;
062                tmp[2] = TEST[0];
063                tmp[3] = TEST[1];
064                tmp[4] = null;
065                tmp[5] = null;
066    
067                data.add( tmp );
068            }
069            return data;
070        }
071    
072        /*
073         * =================================================================== Constructors
074         * ===================================================================
075         */
076        public MemberAccessTest( String name, Object root, String expressionString, Object expectedResult, Object setValue,
077                                 Object expectedAfterSetResult )
078        {
079            super( name, root, expressionString, expectedResult, setValue, expectedAfterSetResult );
080        }
081    
082        /*
083         * =================================================================== Overridden methods
084         * ===================================================================
085         */
086        @Override
087        @Before
088        public void setUp()
089        {
090            super.setUp();
091    
092            /* Should allow access at all to the Simple class except for the bigIntValue property */
093            _context.setMemberAccess( new DefaultMemberAccess( false )
094            {
095    
096                @Override
097                public boolean isAccessible( Map context, Object target, Member member, String propertyName )
098                {
099                    if ( target == Runtime.class )
100                    {
101                        return false;
102                    }
103                    if ( target instanceof Simple )
104                    {
105                        if ( propertyName != null )
106                        {
107                            return !propertyName.equals( "bigIntValue" )
108                                && super.isAccessible( context, target, member, propertyName );
109                        }
110                        if ( member instanceof Method )
111                        {
112                            return !member.getName().equals( "getBigIntValue" )
113                                && !member.getName().equals( "setBigIntValue" )
114                                && super.isAccessible( context, target, member, propertyName );
115                        }
116                    }
117                    return super.isAccessible( context, target, member, propertyName );
118                }
119            } );
120        }
121    }