Author: scolebourne
Date: Mon Aug  7 16:06:41 2006
New Revision: 429507

URL: http://svn.apache.org/viewvc?rev=429507&view=rev
Log:
Give more power to StrSubstitutor subclasses

Modified:
    
jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/StrSubstitutor.java
    
jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java

Modified: 
jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/StrSubstitutor.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/StrSubstitutor.java?rev=429507&r1=429506&r2=429507&view=diff
==============================================================================
--- 
jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/StrSubstitutor.java
 (original)
+++ 
jakarta/commons/proper/lang/trunk/src/java/org/apache/commons/lang/text/StrSubstitutor.java
 Mon Aug  7 16:06:41 2006
@@ -126,8 +126,8 @@
      * Replaces all the occurrences of variables in the given source object 
with
      * their matching values from the map.
      *
-     * @param source  the source text containing the variables to substitute
-     * @param valueMap  the map with the values
+     * @param source  the source text containing the variables to substitute, 
null returns null
+     * @param valueMap  the map with the values, may be null
      * @return the result of the replace operation
      */
     public static String replace(Object source, Map valueMap) {
@@ -139,11 +139,12 @@
      * their matching values from the map. This method allows to specifiy a
      * custom variable prefix and suffix
      *
-     * @param source  the source text containing the variables to substitute
-     * @param valueMap  the map with the values
-     * @param prefix  the prefix of variables
-     * @param suffix  the suffix of variables
+     * @param source  the source text containing the variables to substitute, 
null returns null
+     * @param valueMap  the map with the values, may be null
+     * @param prefix  the prefix of variables, not null
+     * @param suffix  the suffix of variables, not null
      * @return the result of the replace operation
+     * @throws IllegalArgumentException if the prefix or suffix is null
      */
     public static String replace(Object source, Map valueMap, String prefix, 
String suffix) {
         return new StrSubstitutor(valueMap, prefix, suffix).replace(source);
@@ -153,7 +154,7 @@
      * Replaces all the occurrences of variables in the given source object 
with
      * their matching values from the system properties.
      *
-     * @param source  the source text containing the variables to substitute
+     * @param source  the source text containing the variables to substitute, 
null returns null
      * @return the result of the replace operation
      */
     public static String replaceSystemProperties(Object source) {
@@ -365,14 +366,20 @@
 
     //-----------------------------------------------------------------------
     /**
-     * Main method for substituting variables.
+     * Internal method that substitutes the variables.
+     * <p>
+     * Most users of this class do not need to call this method. This method 
will
+     * be called automatically by another (public) method.
+     * <p>
+     * Writers of subclasses can override this method if they need access to
+     * the substitution process at the start or end.
      *
      * @param buf  the string builder to substitute into, not null
      * @param offset  the start offset within the builder, must be valid
      * @param length  the length within the builder to be processed, must be 
valid
      * @return true if altered
      */
-    private boolean substitute(StrBuilder buf, int offset, int length) {
+    protected boolean substitute(StrBuilder buf, int offset, int length) {
         return substitute(buf, offset, length, null) > 0;
     }
 
@@ -439,7 +446,7 @@
                             priorVariables.add(varName);
                             
                             // resolve the variable
-                            String varValue = resolveVariable(varName);
+                            String varValue = resolveVariable(varName, buf, 
startPos, endPos);
                             if (varValue != null) {
                                 // recursive replace
                                 int varLen = varValue.length();
@@ -486,21 +493,28 @@
     }
 
     /**
-     * Resolves the specified variable. This method is called whenever a 
variable
-     * reference is detected in the source text. It is passed the variable's 
name
-     * and must return the corresponding value. This implementation accesses 
the
-     * value map using the variable's name as key. Derived classes may override
-     * this method to implement a different strategy for resolving variables.
-     *
-     * @param varName  the name of the variable
+     * Internal method that resolves the value of a variable.
+     * <p>
+     * Most users of this class do not need to call this method. This method is
+     * called automatically by the substitution process.
+     * <p>
+     * Writers of subclasses can override this method if they need to alter
+     * how each substitution occurs. The method is passed the variable's name
+     * and must return the corresponding value. This implementation uses the
+     * [EMAIL PROTECTED] #getVariableResolver()} with the variable's name as 
the key.
+     *
+     * @param variableName  the name of the variable, not null
+     * @param buf  the buffer where the substitution is occurring, not null
+     * @param startPos  the start position of the variable including the 
prefix, valid
+     * @param endPos  the end position of the variable including the suffix, 
valid
      * @return the variable's value or <b>null</b> if the variable is unknown
      */
-    protected String resolveVariable(String varName) {
+    protected String resolveVariable(String variableName, StrBuilder buf, int 
startPos, int endPos) {
         VariableResolver lookup = getVariableResolver();
         if (lookup == null) {
             return null;
         }
-        return lookup.resolveVariable(varName);
+        return lookup.resolveVariable(variableName);
     }
 
     // Escape

Modified: 
jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java?rev=429507&r1=429506&r2=429507&view=diff
==============================================================================
--- 
jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
 (original)
+++ 
jakarta/commons/proper/lang/trunk/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
 Mon Aug  7 16:06:41 2006
@@ -24,8 +24,6 @@
 import junit.framework.TestSuite;
 import junit.textui.TestRunner;
 
-import org.apache.commons.lang.text.StrSubstitutor.MapVariableResolver;
-
 /**
  * Test class for StrSubstitutor.
  * 
@@ -356,42 +354,60 @@
     }
 
     //-----------------------------------------------------------------------
-//    /**
-//     * Tests source texts with nothing to replace.
-//     */
-//    public void testReplaceNothing() {
-//        assertNull(this.getFormat().replace((char[]) null));
-//        assertNull(this.getFormat().replace((String) null));
-//        assertNull(this.getFormat().replace((Object) null));
-//        assertEquals("Nothing to replace.", 
this.getFormat().replace("Nothing to replace."));
-//        assertEquals("42", this.getFormat().replace(new Integer(42)));
-//        assertEquals(0, this.getFormat().replace((StrBuilder) null));
-//    }
-//
-////    /**
-////     * Tests operating on objects.
-////     */
-////    public void testReplaceObject() {
-////        this.getValueMap().put("value", new Integer(42));
-////        assertEquals(new Integer(42), 
this.getFormat().replaceObject("${value}"));
-////        assertEquals("The answer is 42.", 
this.getFormat().replaceObject("The answer is ${value}."));
-////    }
-//
-//    /**
-//     * Tests interpolation with system properties.
-//     */
-//    public void testReplaceSystemProperties() {
-//        StringBuffer buf = new StringBuffer();
-//        buf.append("Hi ").append(System.getProperty("user.name"));
-//        buf.append(", you are working with ");
-//        buf.append(System.getProperty("os.name"));
-//        buf.append(", your home directory is ");
-//        buf.append(System.getProperty("user.home")).append('.');
-//        assertEquals(buf.toString(), 
StrSubstitutor.replaceSystemProperties("Hi ${user.name}, you are "
-//            + "working with ${os.name}, your home "
-//            + "directory is ${user.home}."));
-//    }
-//
+    /**
+     * Tests protected.
+     */
+    public void testResolveVariable() {
+        final StrBuilder builder = new StrBuilder("Hi ${name}!");
+        Map map = new HashMap();
+        map.put("name", "commons");
+        StrSubstitutor sub = new StrSubstitutor(map) {
+            protected String resolveVariable(String variableName, StrBuilder 
buf, int startPos, int endPos) {
+                assertEquals("name", variableName);
+                assertSame(builder, buf);
+                assertEquals(3, startPos);
+                assertEquals(10, endPos);
+                return "jakarta";
+            }
+        };
+        sub.replace(builder);
+        assertEquals("Hi jakarta!", builder.toString());
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Tests static.
+     */
+    public void testStaticReplace() {
+        Map map = new HashMap();
+        map.put("name", "commons");
+        assertEquals("Hi commons!", StrSubstitutor.replace("Hi ${name}!", 
map));
+    }
+
+    /**
+     * Tests static.
+     */
+    public void testStaticReplacePrefixSuffix() {
+        Map map = new HashMap();
+        map.put("name", "commons");
+        assertEquals("Hi commons!", StrSubstitutor.replace("Hi <name>!", map, 
"<", ">"));
+    }
+
+    /**
+     * Tests interpolation with system properties.
+     */
+    public void testStaticReplaceSystemProperties() {
+        StrBuilder buf = new StrBuilder();
+        buf.append("Hi ").append(System.getProperty("user.name"));
+        buf.append(", you are working with ");
+        buf.append(System.getProperty("os.name"));
+        buf.append(", your home directory is ");
+        buf.append(System.getProperty("user.home")).append('.');
+        assertEquals(buf.toString(), 
StrSubstitutor.replaceSystemProperties("Hi ${user.name}, you are "
+            + "working with ${os.name}, your home "
+            + "directory is ${user.home}."));
+    }
+
     //-----------------------------------------------------------------------
     private void doTestReplace(String expectedResult, String replaceTemplate, 
boolean substring) {
         String expectedShortResult = expectedResult.substring(1, 
expectedResult.length() - 1);



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to