001    package org.apache.commons.ognl;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.lang.reflect.AccessibleObject;
023    import java.lang.reflect.Member;
024    import java.lang.reflect.Modifier;
025    import java.util.Map;
026    
027    /**
028     * This class provides methods for setting up and restoring access in a Field. Java 2 provides access utilities for
029     * setting and getting fields that are non-public. This object provides coarse-grained access controls to allow access
030     * to private, protected and package protected members. This will apply to all classes and members.
031     *
032     * @author Luke Blanshard (blanshlu@netscape.net)
033     * @author Drew Davidson (drew@ognl.org)
034     * @version 15 October 1999
035     */
036    public class DefaultMemberAccess
037        implements MemberAccess
038    {
039        private boolean allowPrivateAccess = false;
040    
041        private boolean allowProtectedAccess = false;
042    
043        private boolean allowPackageProtectedAccess = false;
044    
045        /*
046         * =================================================================== Constructors
047         * ===================================================================
048         */
049        public DefaultMemberAccess( boolean allowAllAccess )
050        {
051            this( allowAllAccess, allowAllAccess, allowAllAccess );
052        }
053    
054        public DefaultMemberAccess( boolean allowPrivateAccess, boolean allowProtectedAccess,
055                                    boolean allowPackageProtectedAccess )
056        {
057            super();
058            this.allowPrivateAccess = allowPrivateAccess;
059            this.allowProtectedAccess = allowProtectedAccess;
060            this.allowPackageProtectedAccess = allowPackageProtectedAccess;
061        }
062    
063        /*
064         * =================================================================== Public methods
065         * ===================================================================
066         */
067        public boolean getAllowPrivateAccess()
068        {
069            return allowPrivateAccess;
070        }
071    
072        public void setAllowPrivateAccess( boolean value )
073        {
074            allowPrivateAccess = value;
075        }
076    
077        public boolean getAllowProtectedAccess()
078        {
079            return allowProtectedAccess;
080        }
081    
082        public void setAllowProtectedAccess( boolean value )
083        {
084            allowProtectedAccess = value;
085        }
086    
087        public boolean getAllowPackageProtectedAccess()
088        {
089            return allowPackageProtectedAccess;
090        }
091    
092        public void setAllowPackageProtectedAccess( boolean value )
093        {
094            allowPackageProtectedAccess = value;
095        }
096    
097        /*
098         * =================================================================== MemberAccess interface
099         * ===================================================================
100         */
101        public Object setup( Map<String, Object> context, Object target, Member member, String propertyName )
102        {
103            Object result = null;
104    
105            if ( isAccessible( context, target, member, propertyName ) )
106            {
107                AccessibleObject accessible = (AccessibleObject) member;
108    
109                if ( !accessible.isAccessible() )
110                {
111                    result = Boolean.TRUE;
112                    accessible.setAccessible( true );
113                }
114            }
115            return result;
116        }
117    
118        public void restore( Map<String, Object> context, Object target, Member member, String propertyName, Object state )
119        {
120            if ( state != null )
121            {
122                ( (AccessibleObject) member ).setAccessible( (Boolean) state );
123            }
124        }
125    
126        /**
127         * Returns true if the given member is accessible or can be made accessible by this object.
128         */
129        public boolean isAccessible( Map<String, Object> context, Object target, Member member, String propertyName )
130        {
131            int modifiers = member.getModifiers();
132            boolean result = Modifier.isPublic( modifiers );
133    
134            if ( !result )
135            {
136                if ( Modifier.isPrivate( modifiers ) )
137                {
138                    result = getAllowPrivateAccess();
139                }
140                else
141                {
142                    if ( Modifier.isProtected( modifiers ) )
143                    {
144                        result = getAllowProtectedAccess();
145                    }
146                    else
147                    {
148                        result = getAllowPackageProtectedAccess();
149                    }
150                }
151            }
152            return result;
153        }
154    }