blob: a44c4910d5a80562c62540f04d4998f1e99220bf [file] [log] [blame]
package org.apache.commons.ognl;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Member;
import java.lang.reflect.Modifier;
import java.util.Map;
/**
* This class provides methods for setting up and restoring access in a Field. Java 2 provides access utilities for
* setting and getting fields that are non-public. This object provides coarse-grained access controls to allow access
* to private, protected and package protected members. This will apply to all classes and members.
*/
public class DefaultMemberAccess
implements MemberAccess
{
private boolean allowPrivateAccess = false;
private boolean allowProtectedAccess = false;
private boolean allowPackageProtectedAccess = false;
/*
* =================================================================== Constructors
* ===================================================================
*/
public DefaultMemberAccess( boolean allowAllAccess )
{
this( allowAllAccess, allowAllAccess, allowAllAccess );
}
public DefaultMemberAccess( boolean allowPrivateAccess, boolean allowProtectedAccess,
boolean allowPackageProtectedAccess )
{
this.allowPrivateAccess = allowPrivateAccess;
this.allowProtectedAccess = allowProtectedAccess;
this.allowPackageProtectedAccess = allowPackageProtectedAccess;
}
/*
* =================================================================== Public methods
* ===================================================================
*/
public boolean getAllowPrivateAccess()
{
return allowPrivateAccess;
}
public void setAllowPrivateAccess( boolean value )
{
allowPrivateAccess = value;
}
public boolean getAllowProtectedAccess()
{
return allowProtectedAccess;
}
public void setAllowProtectedAccess( boolean value )
{
allowProtectedAccess = value;
}
public boolean getAllowPackageProtectedAccess()
{
return allowPackageProtectedAccess;
}
public void setAllowPackageProtectedAccess( boolean value )
{
allowPackageProtectedAccess = value;
}
/*
* =================================================================== MemberAccess interface
* ===================================================================
*/
public Object setup( Map<String, Object> context, Object target, Member member, String propertyName )
{
Object result = null;
if ( isAccessible( context, target, member, propertyName ) )
{
AccessibleObject accessible = (AccessibleObject) member;
if ( !accessible.isAccessible() )
{
result = Boolean.TRUE;
accessible.setAccessible( true );
}
}
return result;
}
public void restore( Map<String, Object> context, Object target, Member member, String propertyName, Object state )
{
if ( state != null )
{
( (AccessibleObject) member ).setAccessible( (Boolean) state );
}
}
/**
* Returns true if the given member is accessible or can be made accessible by this object.
*/
public boolean isAccessible( Map<String, Object> context, Object target, Member member, String propertyName )
{
int modifiers = member.getModifiers();
boolean result = Modifier.isPublic( modifiers );
if ( !result )
{
if ( Modifier.isPrivate( modifiers ) )
{
result = getAllowPrivateAccess();
}
else
{
if ( Modifier.isProtected( modifiers ) )
{
result = getAllowProtectedAccess();
}
else
{
result = getAllowPackageProtectedAccess();
}
}
}
return result;
}
}