package com.java110.service.smo.impl;
|
|
import org.apache.ibatis.ognl.MemberAccess;
|
|
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.
|
*
|
* @author Luke Blanshard (blanshlu@netscape.net)
|
* @author Drew Davidson (drew@ognl.org)
|
* @version 15 October 1999
|
*/
|
public class DefaultMemberAccess implements MemberAccess {
|
public boolean allowPrivateAccess = false;
|
public boolean allowProtectedAccess = false;
|
public boolean allowPackageProtectedAccess = false;
|
|
/*===================================================================
|
Constructors
|
===================================================================*/
|
public DefaultMemberAccess(boolean allowAllAccess) {
|
this(allowAllAccess, allowAllAccess, allowAllAccess);
|
}
|
|
public DefaultMemberAccess(boolean allowPrivateAccess, boolean allowProtectedAccess, boolean allowPackageProtectedAccess) {
|
super();
|
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 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.FALSE;
|
accessible.setAccessible(true);
|
}
|
}
|
return result;
|
}
|
|
public void restore(Map context, Object target, Member member, String propertyName, Object state) {
|
if (state != null) {
|
((AccessibleObject) member).setAccessible(((Boolean) state).booleanValue());
|
}
|
}
|
|
/**
|
* Returns true if the given member is accessible or can be made accessible
|
* by this object.
|
*/
|
public boolean isAccessible(Map 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;
|
}
|
|
}
|