modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java | 2 + modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java | 16 ++++++++++ modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java | 15 ++++----- modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java | 4 +- 4 files changed, 28 insertions(+), 9 deletions(-)
New commits: commit 2ec54df504a1dea687c489c41e001d78f98bbdd9 Author: John Mazzitelli mazz@redhat.com Date: Fri Apr 30 16:18:11 2010 -0400
add some more tests to template engine/recipe parser; make sure we better support windows paths
diff --git a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java index a871e91..54ae226 100644 --- a/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java +++ b/modules/common/filetemplate-bundle/src/main/java/org/rhq/bundle/filetemplate/recipe/RecipeParser.java @@ -199,6 +199,8 @@ public class RecipeParser { }
protected String[] splitCommandLine(String cmdLine) { + cmdLine = cmdLine.replace('\', '/'); + ByteArrayInputStream in = new ByteArrayInputStream(cmdLine.getBytes()); StreamTokenizer strtok = new StreamTokenizer(new InputStreamReader(in)); List<String> args = new ArrayList<String>(); diff --git a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java index fc9acd3..dda85f4 100644 --- a/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java +++ b/modules/common/filetemplate-bundle/src/test/java/org/rhq/bundle/filetemplate/recipe/RecipeParserTest.java @@ -311,6 +311,22 @@ public class RecipeParserTest { assert files.get("tomcat.tar").equals("/opt/tomcat") : files; }
+ public void testSimpleRecipeWithBackslashes() throws Exception { + addRecipeCommand("deploy -f jboss1.zip -d "C:\opt\jboss1""); + addRecipeCommand("deploy -f tomcat.tar "--directory=C:\Documents and Settings\user\""); + addRecipeCommand("deploy -f jboss2.zip -d C:\opt\jboss1"); + RecipeParser parser = new RecipeParser(); + RecipeContext context = new RecipeContext(getRecipe()); + parser.parseRecipe(context); + Map<String, String> files = context.getDeployFiles(); + assert files.containsKey("jboss1.zip") : files; + assert files.get("jboss1.zip").equals("C:/opt/jboss1") : files; + assert files.containsKey("tomcat.tar") : files; + assert files.get("tomcat.tar").equals("C:/Documents and Settings/user/") : files; + assert files.containsKey("jboss2.zip") : files; + assert files.get("jboss2.zip").equals("C:/opt/jboss1") : files; + } + public void testSimpleRecipeError() throws Exception { addRecipeCommand("deploy -f jboss.tar"); RecipeParser parser = new RecipeParser(); diff --git a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java index 78e56e1..52deb7e 100644 --- a/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java +++ b/modules/core/util/src/main/java/org/rhq/core/template/TemplateEngine.java @@ -37,12 +37,7 @@ public class TemplateEngine implements Serializable { }
public String replaceTokens(String input) { - - // since our replacement strings may include \ and $ characters avoid the use of - // matcher.appendReplacement and like methods when doing this work. - - String result = input; - + StringBuffer buffer = new StringBuffer(); Matcher matcher = tokenPattern.matcher(input); while (matcher.find()) { String next = matcher.group(); @@ -51,10 +46,14 @@ public class TemplateEngine implements Serializable { String key = keyMatcher.group(); String value = tokens.get(key); if (value != null) { - result = result.replace(next, value); + next = value; } } + + // If we didn't find a replacement for the key, leave the original value unchanged + matcher.appendReplacement(buffer, Matcher.quoteReplacement(next)); } - return result; + matcher.appendTail(buffer); + return buffer.toString(); } } diff --git a/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java b/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java index 4402c6c..e215545 100644 --- a/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java +++ b/modules/core/util/src/test/java/org/rhq/core/template/TemplateEngineTest.java @@ -10,7 +10,7 @@ import org.testng.annotations.Test; public class TemplateEngineTest extends TestCase { private static final String IPADDR = "192.168.22.153"; private static final String SUCCESSTOKEN1 = "successtoken1"; - private static final String WINTEMPDIR = "C:\Users\JSHAUG~1\AppData\Local\Temp\"; + private static final String WINTEMPDIR = "C:\Users\JSHAUG~1\Documents and Settings\Local\Temp\"; String noTokens = "This string should come through unchanged"; String justOneToken = "@@rhq.token1@@"; String oneTokenWhiteSpace = "@@ rhq.token1 @@"; @@ -46,6 +46,8 @@ public class TemplateEngineTest extends TestCase {
public void testWinToken() { assertEquals(WINTEMPDIR, templateEngine.replaceTokens("@@rhq.system.sysprop.java.io.tmpdir@@")); + assertEquals(WINTEMPDIR + "-" + WINTEMPDIR, templateEngine + .replaceTokens("@@rhq.system.sysprop.java.io.tmpdir@@-@@ rhq.system.sysprop.java.io.tmpdir @@")); }
public void testOneTokenWhiteSpace() {
rhq-commits@lists.fedorahosted.org