[571063] Capture preferences encodes dollar literal one time too often

Improve style and remove dead code
diff --git a/plugins/org.eclipse.oomph.setup.editor/src/org/eclipse/oomph/setup/presentation/PreferenceCaptureDialog.java b/plugins/org.eclipse.oomph.setup.editor/src/org/eclipse/oomph/setup/presentation/PreferenceCaptureDialog.java
index a1bc4e7..cdeee6e 100644
--- a/plugins/org.eclipse.oomph.setup.editor/src/org/eclipse/oomph/setup/presentation/PreferenceCaptureDialog.java
+++ b/plugins/org.eclipse.oomph.setup.editor/src/org/eclipse/oomph/setup/presentation/PreferenceCaptureDialog.java
@@ -20,7 +20,6 @@
 import org.eclipse.oomph.setup.SetupTask;
 import org.eclipse.oomph.setup.ui.recorder.RecorderTransaction;
 import org.eclipse.oomph.setup.util.SetupUtil;
-import org.eclipse.oomph.setup.util.StringExpander;
 import org.eclipse.oomph.util.IORuntimeException;
 import org.eclipse.oomph.util.Pair;
 import org.eclipse.oomph.util.PropertiesUtil;
@@ -407,29 +406,8 @@
     for (Object object : included)
     {
       PreferenceTask preferenceTask = (PreferenceTask)object;
-      new StringExpander()
-      {
-        @Override
-        protected String resolve(String key)
-        {
-          return null;
-        }
-
-        @Override
-        protected boolean isUnexpanded(String key)
-        {
-          return false;
-        }
-
-        @Override
-        protected String filter(String value, String filterName)
-        {
-          return null;
-        }
-      };
-
       String escapedValue = preferenceTask.getValue();
-      String actualValue = SetupUtil.descape(escapedValue);
+      String actualValue = SetupUtil.unescape(escapedValue);
       result.put(PreferencesFactory.eINSTANCE.createURI(preferenceTask.getKey()), new Pair<String, String>(null, actualValue));
     }
 
diff --git a/plugins/org.eclipse.oomph.setup/src/org/eclipse/oomph/setup/util/SetupUtil.java b/plugins/org.eclipse.oomph.setup/src/org/eclipse/oomph/setup/util/SetupUtil.java
index 95d2571..2932687 100644
--- a/plugins/org.eclipse.oomph.setup/src/org/eclipse/oomph/setup/util/SetupUtil.java
+++ b/plugins/org.eclipse.oomph.setup/src/org/eclipse/oomph/setup/util/SetupUtil.java
@@ -37,6 +37,27 @@
 
   private static final Map<EClass, Set<Trigger>> TRIGGERS = Collections.synchronizedMap(new HashMap<EClass, Set<Trigger>>());
 
+  private static final StringExpander UNESCAPE_STRING_EXPANDER = new StringExpander()
+  {
+    @Override
+    protected String resolve(String key)
+    {
+      return CONTROL_CHARACTER_VALUES.containsKey(key) ? CONTROL_CHARACTER_VALUES.get(key) : key;
+    }
+
+    @Override
+    protected boolean isUnexpanded(String key)
+    {
+      return !CONTROL_CHARACTER_VALUES.containsKey(key);
+    }
+
+    @Override
+    protected String filter(String value, String filterName)
+    {
+      return value;
+    }
+  };
+
   public static final String INSTALLER_UPDATE_URL = PropertiesUtil.getProperty(SetupProperties.PROP_INSTALLER_UPDATE_URL, DEFAULT_INSTALLER_UPDATE_URL)
       .replace('\\', '/');
 
@@ -87,29 +108,9 @@
     return result.toString();
   }
 
-  public static String descape(String string)
+  public static String unescape(String string)
   {
-    return new StringExpander()
-    {
-
-      @Override
-      protected String resolve(String key)
-      {
-        return CONTROL_CHARACTER_VALUES.containsKey(key) ? CONTROL_CHARACTER_VALUES.get(key) : key;
-      }
-
-      @Override
-      protected boolean isUnexpanded(String key)
-      {
-        return !CONTROL_CHARACTER_VALUES.containsKey(key);
-      }
-
-      @Override
-      protected String filter(String value, String filterName)
-      {
-        return value;
-      }
-    }.expandString(string);
+    return UNESCAPE_STRING_EXPANDER.expandString(string);
   }
 
   public static Set<String> getResolvingTargetDefinitions(SetupTaskContext context)