Author: henrib
Date: Wed Aug 24 15:13:39 2011
New Revision: 1161146
URL: http://svn.apache.org/viewvc?rev=1161146&view=rev
Log:
Improved usability
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/Sandbox.java
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/SandboxUberspectImpl.java
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/Sandbox.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/Sandbox.java?rev=1161146&r1=1161145&r2=1161146&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/Sandbox.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/Sandbox.java
Wed Aug 24 15:13:39 2011
@@ -56,38 +56,113 @@ import java.util.Set;
*
* @since 2.1
*/
-public class Sandbox {
+public final class Sandbox {
/**
* The map from class names to permissions.
*/
private final Map<String, Permissions> sandbox;
-
+
/**
* Creates a new default sandbox.
*/
public Sandbox() {
- sandbox = new HashMap<String, Permissions>();
+ this(new HashMap<String, Permissions>());
}
/**
* Creates a sandbox based on an existing permissions map.
* @param map the permissions map
*/
- private Sandbox(Map<String, Permissions> map) {
+ protected Sandbox(Map<String, Permissions> map) {
sandbox = map;
}
/**
+ * Gets the read permission value for a given property of a class.
+ * @param clazz the class
+ * @param name the property name
+ * @return null if not allowed, the name of the property to use otherwise
+ */
+ public String read(Class<?> clazz, String name) {
+ return read(clazz.getName(), name);
+ }
+
+ /**
+ * Gets the read permission value for a given property of a class.
+ * @param clazz the class name
+ * @param name the property name
+ * @return null if not allowed, the name of the property to use otherwise
+ */
+ public String read(String clazz, String name) {
+ Permissions permissions = sandbox.get(clazz);
+ if (permissions == null) {
+ return name;
+ } else {
+ return permissions.read().get(name);
+ }
+ }
+
+ /**
+ * Gets the write permission value for a given property of a class.
+ * @param clazz the class
+ * @param name the property name
+ * @return null if not allowed, the name of the property to use otherwise
+ */
+ public String write(Class<?> clazz, String name) {
+ return write(clazz.getName(), name);
+ }
+
+ /**
+ * Gets the write permission value for a given property of a class.
+ * @param clazz the class name
+ * @param name the property name
+ * @return null if not allowed, the name of the property to use otherwise
+ */
+ public String write(String clazz, String name) {
+ Permissions permissions = sandbox.get(clazz);
+ if (permissions == null) {
+ return name;
+ } else {
+ return permissions.write().get(name);
+ }
+ }
+
+ /**
+ * Gets the execute permission value for a given method of a class.
+ * @param clazz the class
+ * @param name the method name
+ * @return null if not allowed, the name of the method to use otherwise
+ */
+ public String execute(Class<?> clazz, String name) {
+ return execute(clazz.getName(), name);
+ }
+
+ /**
+ * Gets the execute permission value for a given method of a class.
+ * @param clazz the class name
+ * @param name the method name
+ * @return null if not allowed, the name of the method to use otherwise
+ */
+ public String execute(String clazz, String name) {
+ Permissions permissions = sandbox.get(clazz);
+ if (permissions == null) {
+ return name;
+ } else {
+ return permissions.execute().get(name);
+ }
+ }
+
+ /**
* A base set of names.
*/
public abstract static class Names {
/**
* Adds a name to this set.
* @param name the name to add
- * @return true if the name was really added, false if it was already
present
+ * @return true if the name was really added, false if not
*/
public abstract boolean add(String name);
-
+
/**
* Adds an alias to a name to this set.
* <p>This only has an effect on white lists.</p>
@@ -104,32 +179,43 @@ public class Sandbox {
* @param name the method/property name to check
* @return null if not allowed, the actual name to use otherwise
*/
- public abstract String get(String name);
+ public String get(String name) {
+ return name;
+ }
}
+ /**
+ * The pass-thru name set.
+ */
+ private static final Names WHITE_NAMES = new Names() {
+ @Override
+ public boolean add(String name) {
+ return false;
+ }
+ };
/**
* A white set of names.
*/
- public static class WhiteSet extends Names {
- /** The set of controlled names. */
- protected Map<String,String> names = null;
-
+ public static final class WhiteSet extends Names {
+ /** The map of controlled names and aliases. */
+ protected Map<String, String> names = null;
+
@Override
public boolean add(String name) {
if (names == null) {
- names = new HashMap<String,String>();
+ names = new HashMap<String, String>();
}
- return names.put(name,name) == null;
+ return names.put(name, name) == null;
}
-
+
@Override
public boolean alias(String name, String alias) {
if (names == null) {
- names = new HashMap<String,String>();
+ names = new HashMap<String, String>();
}
- return names.put(alias,name) == null;
+ return names.put(alias, name) == null;
}
-
+
@Override
public String get(String name) {
if (names == null) {
@@ -143,10 +229,10 @@ public class Sandbox {
/**
* A black set of names.
*/
- public static class BlackSet extends Names {
+ public static final class BlackSet extends Names {
/** The set of controlled names. */
protected Set<String> names = null;
-
+
@Override
public boolean add(String name) {
if (names == null) {
@@ -157,14 +243,14 @@ public class Sandbox {
@Override
public String get(String name) {
- return names != null && !names.contains(name)? name : null;
+ return names != null && !names.contains(name) ? name : null;
}
}
/**
* Contains the white or black lists for properties and methods for a
given class.
*/
- public static class Permissions {
+ public static final class Permissions {
/** The controlled readable properties. */
private final Names read;
/** The controlled writeable properties. */
@@ -179,9 +265,21 @@ public class Sandbox {
* @param executeFlag whether the method list is white of black
*/
Permissions(boolean readFlag, boolean writeFlag, boolean executeFlag) {
- this.read = readFlag ? new WhiteSet() : new BlackSet();
- this.write = writeFlag ? new WhiteSet() : new BlackSet();
- this.execute = executeFlag ? new WhiteSet() : new BlackSet();
+ this(readFlag ? new WhiteSet() : new BlackSet(),
+ writeFlag ? new WhiteSet() : new BlackSet(),
+ executeFlag ? new WhiteSet() : new BlackSet());
+ }
+
+ /**
+ * Creates a new permissions instance.
+ * @param nread the read set
+ * @param nwrite the write set
+ * @param nexecute the method set
+ */
+ Permissions(Names nread, Names nwrite, Names nexecute) {
+ this.read = nread != null ? nread : WHITE_NAMES;
+ this.write = nwrite != null ? nwrite : WHITE_NAMES;
+ this.execute = nexecute != null ? nexecute : WHITE_NAMES;
}
/**
@@ -195,7 +293,7 @@ public class Sandbox {
}
return this;
}
-
+
/**
* Adds a list of writeable property names to these permissions.
* @param pnames the property names
@@ -228,7 +326,7 @@ public class Sandbox {
public Names read() {
return read;
}
-
+
/**
* Gets the set of writeable property names in these permissions.
* @return the set of property names
@@ -236,7 +334,7 @@ public class Sandbox {
public Names write() {
return write;
}
-
+
/**
* Gets the set of method names in these permissions.
* @return the set of method names
@@ -244,16 +342,20 @@ public class Sandbox {
public Names execute() {
return execute;
}
-
}
+
+ /**
+ * The pass-thru permissions.
+ */
+ private static final Permissions ALL_WHITE = new Permissions(WHITE_NAMES,
WHITE_NAMES, WHITE_NAMES);
/**
* Creates the set of permissions for a given class.
* @param clazz the class for which these permissions apply
- * @param readFlag whether the readable property list is white or black
- * @param writeFlag whether the writeable property list is white or black
- * @param executeFlag whether the executable method list is white or black
- * @return the
+ * @param readFlag whether the readable property list is white - true - or
black - false -
+ * @param writeFlag whether the writeable property list is white - true -
or black - false -
+ * @param executeFlag whether the executable method list is white white -
true - or black - false -
+ * @return the set of permissions
*/
public Permissions permissions(String clazz, boolean readFlag, boolean
writeFlag, boolean executeFlag) {
Permissions box = new Permissions(readFlag, writeFlag, executeFlag);
@@ -282,9 +384,14 @@ public class Sandbox {
/**
* Gets the set of permissions associated to a class.
* @param clazz the class name
- * @return the permissions or null if none were defined
+ * @return the defined permissions or an all-white permission instance if
none were defined
*/
public Permissions get(String clazz) {
- return sandbox.get(clazz);
+ Permissions permissions = sandbox.get(clazz);
+ if (permissions == null) {
+ return ALL_WHITE;
+ } else {
+ return permissions;
+ }
}
}
Modified:
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/SandboxUberspectImpl.java
URL:
http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/SandboxUberspectImpl.java?rev=1161146&r1=1161145&r2=1161146&view=diff
==============================================================================
---
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/SandboxUberspectImpl.java
(original)
+++
commons/proper/jexl/trunk/src/main/java/org/apache/commons/jexl2/introspection/SandboxUberspectImpl.java
Wed Aug 24 15:13:39 2011
@@ -16,7 +16,6 @@
*/
package org.apache.commons.jexl2.introspection;
-import java.lang.reflect.Constructor;
import org.apache.commons.jexl2.JexlInfo;
import org.apache.commons.logging.Log;
@@ -53,20 +52,18 @@ public class SandboxUberspectImpl extend
* {@inheritDoc}
*/
@Override
- public Constructor<?> getConstructor(Object ctorHandle, Object[] args,
JexlInfo info) {
+ public JexlMethod getConstructor(Object ctorHandle, Object[] args,
JexlInfo info) {
String className = null;
- Class<?> clazz = null;
if (ctorHandle instanceof Class<?>) {
- clazz = (Class<?>) ctorHandle;
+ Class<?> clazz = (Class<?>) ctorHandle;
className = clazz.getName();
} else if (ctorHandle != null) {
className = ctorHandle.toString();
} else {
return null;
}
- Sandbox.Permissions box = sandbox.get(className);
- if (box == null || box.execute().get("") != null) {
- return getConstructor(className, args);
+ if (sandbox.execute(className, "") != null) {
+ return super.getConstructor(className, args, info);
}
return null;
}
@@ -77,11 +74,7 @@ public class SandboxUberspectImpl extend
@Override
public JexlMethod getMethod(Object obj, String method, Object[] args,
JexlInfo info) {
if (obj != null && method != null) {
- Sandbox.Permissions box = sandbox.get(obj.getClass().getName());
- String actual = method;
- if (box != null) {
- actual = box.execute().get(actual);
- }
+ String actual = sandbox.execute(obj.getClass().getName(), method);
if (actual != null) {
return getMethodExecutor(obj, actual, args);
}
@@ -95,11 +88,7 @@ public class SandboxUberspectImpl extend
@Override
public JexlPropertyGet getPropertyGet(Object obj, Object identifier,
JexlInfo info) {
if (obj != null && identifier != null) {
- Sandbox.Permissions box = sandbox.get(obj.getClass().getName());
- String actual = identifier.toString();
- if (box != null) {
- actual = box.read().get(actual);
- }
+ String actual = sandbox.read(obj.getClass().getName(),
identifier.toString());
if (actual != null) {
return super.getPropertyGet(obj, actual, info);
}
@@ -113,11 +102,7 @@ public class SandboxUberspectImpl extend
@Override
public JexlPropertySet getPropertySet(final Object obj, final Object
identifier, Object arg, JexlInfo info) {
if (obj != null && identifier != null) {
- Sandbox.Permissions box = sandbox.get(obj.getClass().getName());
- String actual = identifier.toString();
- if (box != null) {
- actual = box.write().get(actual);
- }
+ String actual = sandbox.write(obj.getClass().getName(),
identifier.toString());
if (actual != null) {
return super.getPropertySet(obj, actual, arg, info);
}