Author: lhazlewood
Date: Thu Dec 22 02:11:47 2011
New Revision: 1221994

URL: http://svn.apache.org/viewvc?rev=1221994&view=rev
Log:
SHIRO-225: implementation complete w/ test cases.  Functionality was needed for 
the SHIRO-285 CAS module ('securityManager.rememberMeManager = null' support 
was desired for CAS environments)

Modified:
    
shiro/trunk/core/src/main/java/org/apache/shiro/config/ReflectionBuilder.java
    
shiro/trunk/core/src/test/java/org/apache/shiro/config/ReflectionBuilderTest.java

Modified: 
shiro/trunk/core/src/main/java/org/apache/shiro/config/ReflectionBuilder.java
URL: 
http://svn.apache.org/viewvc/shiro/trunk/core/src/main/java/org/apache/shiro/config/ReflectionBuilder.java?rev=1221994&r1=1221993&r2=1221994&view=diff
==============================================================================
--- 
shiro/trunk/core/src/main/java/org/apache/shiro/config/ReflectionBuilder.java 
(original)
+++ 
shiro/trunk/core/src/main/java/org/apache/shiro/config/ReflectionBuilder.java 
Thu Dec 22 02:11:47 2011
@@ -34,7 +34,7 @@ import java.util.*;
  * Object builder that uses reflection and Apache Commons BeanUtils to build 
objects given a
  * map of "property values".  Typically these come from the Shiro INI 
configuration and are used
  * to construct or modify the SecurityManager, its dependencies, and web-based 
security filters.
- *
+ * <p/>
  * Recognizes {@link Factory} implementations and will call
  * {@link org.apache.shiro.util.Factory#getInstance() getInstance} to satisfy 
any reference to this bean.
  *
@@ -51,6 +51,9 @@ public class ReflectionBuilder {
     private static final String GLOBAL_PROPERTY_PREFIX = "shiro";
     private static final char MAP_KEY_VALUE_DELIMITER = ':';
     private static final String HEX_BEGIN_TOKEN = "0x";
+    private static final String NULL_VALUE_TOKEN = "null";
+    private static final String EMPTY_STRING_VALUE_TOKEN = "\"\"";
+    private static final char STRING_VALUE_DELIMETER = '"';
 
     private Map<String, ?> objects;
 
@@ -229,8 +232,8 @@ public class ReflectionBuilder {
         String id = getId(reference);
         log.debug("Encountered object reference '{}'.  Looking up object with 
id '{}'", reference, id);
         final Object referencedObject = getReferencedObject(id);
-        if(referencedObject instanceof Factory) {
-            return ((Factory)referencedObject).getInstance();
+        if (referencedObject instanceof Factory) {
+            return ((Factory) referencedObject).getInstance();
         }
         return referencedObject;
     }
@@ -343,12 +346,31 @@ public class ReflectionBuilder {
         return value;
     }
 
+    protected String checkForNullOrEmptyLiteral(String stringValue) {
+        if (stringValue == null) {
+            return null;
+        }
+        //check if the value is the actual literal string 'null' (expected to 
be wrapped in quotes):
+        if (stringValue.equals("\"null\"")) {
+            return NULL_VALUE_TOKEN;
+        }
+        //or the actual literal string of two quotes '""' (expected to be 
wrapped in quotes):
+        else if (stringValue.equals("\"\"\"\"")) {
+            return EMPTY_STRING_VALUE_TOKEN;
+        } else {
+            return stringValue;
+        }
+    }
 
     protected void applyProperty(Object object, String propertyName, String 
stringValue) {
 
         Object value;
 
-        if (isTypedProperty(object, propertyName, Set.class)) {
+        if (NULL_VALUE_TOKEN.equals(stringValue)) {
+            value = null;
+        } else if (EMPTY_STRING_VALUE_TOKEN.equals(stringValue)) {
+            value = StringUtils.EMPTY_STRING;
+        } else if (isTypedProperty(object, propertyName, Set.class)) {
             value = toSet(stringValue);
         } else if (isTypedProperty(object, propertyName, Map.class)) {
             value = toMap(stringValue);
@@ -361,7 +383,8 @@ public class ReflectionBuilder {
             byte[] bytes = toBytes(stringValue);
             value = ByteSource.Util.bytes(bytes);
         } else {
-            value = resolveValue(stringValue);
+            String checked = checkForNullOrEmptyLiteral(stringValue);
+            value = resolveValue(checked);
         }
 
         try {

Modified: 
shiro/trunk/core/src/test/java/org/apache/shiro/config/ReflectionBuilderTest.java
URL: 
http://svn.apache.org/viewvc/shiro/trunk/core/src/test/java/org/apache/shiro/config/ReflectionBuilderTest.java?rev=1221994&r1=1221993&r2=1221994&view=diff
==============================================================================
--- 
shiro/trunk/core/src/test/java/org/apache/shiro/config/ReflectionBuilderTest.java
 (original)
+++ 
shiro/trunk/core/src/test/java/org/apache/shiro/config/ReflectionBuilderTest.java
 Thu Dec 22 02:11:47 2011
@@ -21,7 +21,6 @@ package org.apache.shiro.config;
 import org.apache.shiro.codec.Base64;
 import org.apache.shiro.codec.CodecSupport;
 import org.apache.shiro.codec.Hex;
-import org.apache.shiro.jndi.JndiObjectFactory;
 import org.apache.shiro.util.CollectionUtils;
 import org.junit.Test;
 
@@ -53,6 +52,84 @@ public class ReflectionBuilderTest {
     }
 
     @Test
+    public void testWithConfiguredNullValue() {
+        Map<String,Object> defaults = new LinkedHashMap<String,Object>();
+        CompositeBean cBean = new CompositeBean();
+        cBean.setSimpleBean(new SimpleBean());
+        defaults.put("compositeBean", cBean);
+        
+        Map<String, String> defs = new LinkedHashMap<String, String>();
+        defs.put("compositeBean.intProp", "42");
+        defs.put("compositeBean.booleanProp", "true");
+        defs.put("compositeBean.stringProp", "test");
+        defs.put("compositeBean.simpleBean", "null");
+
+        ReflectionBuilder builder = new ReflectionBuilder(defaults);
+        Map beans = builder.buildObjects(defs);
+
+        CompositeBean compositeBean = (CompositeBean) 
beans.get("compositeBean");
+        assertNotNull(compositeBean);
+        assertTrue(compositeBean.isBooleanProp());
+        assertEquals(compositeBean.getIntProp(), 42);
+        assertEquals("test", compositeBean.getStringProp());
+        assertNull(compositeBean.getSimpleBean());
+    }
+
+    @Test
+    public void testWithConfiguredNullLiteralValue() {
+        Map<String, String> defs = new LinkedHashMap<String, String>();
+        defs.put("compositeBean", "org.apache.shiro.config.CompositeBean");
+        defs.put("compositeBean.intProp", "42");
+        defs.put("compositeBean.booleanProp", "true");
+        defs.put("compositeBean.stringProp", "\"null\"");
+
+        ReflectionBuilder builder = new ReflectionBuilder();
+        Map beans = builder.buildObjects(defs);
+
+        CompositeBean compositeBean = (CompositeBean) 
beans.get("compositeBean");
+        assertNotNull(compositeBean);
+        assertTrue(compositeBean.isBooleanProp());
+        assertEquals(compositeBean.getIntProp(), 42);
+        assertEquals("null", compositeBean.getStringProp());
+    }
+
+    @Test
+    public void testWithConfiguredEmptyStringValue() {
+        Map<String, String> defs = new LinkedHashMap<String, String>();
+        defs.put("compositeBean", "org.apache.shiro.config.CompositeBean");
+        defs.put("compositeBean.intProp", "42");
+        defs.put("compositeBean.booleanProp", "true");
+        defs.put("compositeBean.stringProp", "\"\"");
+
+        ReflectionBuilder builder = new ReflectionBuilder();
+        Map beans = builder.buildObjects(defs);
+
+        CompositeBean compositeBean = (CompositeBean) 
beans.get("compositeBean");
+        assertNotNull(compositeBean);
+        assertTrue(compositeBean.isBooleanProp());
+        assertEquals(compositeBean.getIntProp(), 42);
+        assertEquals("", compositeBean.getStringProp());
+    }
+
+    @Test
+    public void testWithConfiguredEmptyStringLiteralValue() {
+        Map<String, String> defs = new LinkedHashMap<String, String>();
+        defs.put("compositeBean", "org.apache.shiro.config.CompositeBean");
+        defs.put("compositeBean.intProp", "42");
+        defs.put("compositeBean.booleanProp", "true");
+        defs.put("compositeBean.stringProp", "\"\"\"\"");
+
+        ReflectionBuilder builder = new ReflectionBuilder();
+        Map beans = builder.buildObjects(defs);
+
+        CompositeBean compositeBean = (CompositeBean) 
beans.get("compositeBean");
+        assertNotNull(compositeBean);
+        assertTrue(compositeBean.isBooleanProp());
+        assertEquals(compositeBean.getIntProp(), 42);
+        assertEquals("\"\"", compositeBean.getStringProp());
+    }
+
+    @Test
     public void testSimpleConfigWithDollarSignStringValue() {
         Map<String, String> defs = new LinkedHashMap<String, String>();
         defs.put("compositeBean", "org.apache.shiro.config.CompositeBean");


Reply via email to