[581759] Support string filter rseFreeze

https://bugs.eclipse.org/bugs/show_bug.cgi?id=581759
diff --git a/features/org.eclipse.oomph.setup.core-feature/feature.xml b/features/org.eclipse.oomph.setup.core-feature/feature.xml
index 3a10399..5f3a16f 100644
--- a/features/org.eclipse.oomph.setup.core-feature/feature.xml
+++ b/features/org.eclipse.oomph.setup.core-feature/feature.xml
@@ -12,7 +12,7 @@
 <feature
       id="org.eclipse.oomph.setup.core"
       label="%featureName"
-      version="1.26.0.qualifier"
+      version="1.27.0.qualifier"
       provider-name="%providerName"
       license-feature="org.eclipse.oomph.license"
       license-feature-version="0.0.0">
diff --git a/features/org.eclipse.oomph.setup.core-feature/pom.xml b/features/org.eclipse.oomph.setup.core-feature/pom.xml
index 8153896..b502f03 100644
--- a/features/org.eclipse.oomph.setup.core-feature/pom.xml
+++ b/features/org.eclipse.oomph.setup.core-feature/pom.xml
@@ -20,6 +20,6 @@
   </parent>
   <groupId>org.eclipse.oomph.features</groupId>
   <artifactId>org.eclipse.oomph.setup.core</artifactId>
-  <version>1.26.0-SNAPSHOT</version>
+  <version>1.27.0-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
 </project>
diff --git a/plugins/org.eclipse.oomph.setup.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.core/META-INF/MANIFEST.MF
index 0bb3cef..7c9f439 100644
--- a/plugins/org.eclipse.oomph.setup.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.core/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-SymbolicName: org.eclipse.oomph.setup.core;singleton:=true
-Bundle-Version: 1.26.0.qualifier
+Bundle-Version: 1.27.0.qualifier
 Bundle-ClassPath: .
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
@@ -32,7 +32,7 @@
  org.eclipse.equinox.p2.updatesite;bundle-version="[1.0.0,2.0.0)",
  org.eclipse.equinox.security;bundle-version="[1.0.0,2.0.0)",
  org.eclipse.oomph.base.edit;bundle-version="[1.16.0,2.0.0)",
- org.eclipse.oomph.p2.core;bundle-version="[1.24.0,2.0.0)",
+ org.eclipse.oomph.p2.core;bundle-version="[1.25.0,2.0.0)",
  org.eclipse.oomph.setup;bundle-version="[1.26.0,2.0.0)";visibility:=reexport,
  org.eclipse.oomph.setup.p2;bundle-version="[1.19.0,2.0.0)",
  org.eclipse.oomph.preferences;bundle-version="[1.13.0,2.0.0)",
@@ -40,7 +40,7 @@
 Import-Package: org.bouncycastle.openpgp;version="[1.65.0,2.0.0)"
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.oomph.setup.internal.core;version="1.26.0";x-internal:=true,
- org.eclipse.oomph.setup.internal.core.util;version="1.26.0";x-internal:=true
+Export-Package: org.eclipse.oomph.setup.internal.core;version="1.27.0";x-internal:=true,
+ org.eclipse.oomph.setup.internal.core.util;version="1.27.0";x-internal:=true
 Bundle-Activator: org.eclipse.oomph.setup.internal.core.SetupCorePlugin$Implementation
 Automatic-Module-Name: org.eclipse.oomph.setup.core
diff --git a/plugins/org.eclipse.oomph.setup.core/pom.xml b/plugins/org.eclipse.oomph.setup.core/pom.xml
index 07df797..1410f09 100644
--- a/plugins/org.eclipse.oomph.setup.core/pom.xml
+++ b/plugins/org.eclipse.oomph.setup.core/pom.xml
@@ -20,7 +20,7 @@
   </parent>
   <groupId>org.eclipse.oomph</groupId>
   <artifactId>org.eclipse.oomph.setup.core</artifactId>
-  <version>1.26.0-SNAPSHOT</version>
+  <version>1.27.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 
   <build>
diff --git a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/Messages.java b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/Messages.java
index 5e9bb49..1e04456 100644
--- a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/Messages.java
+++ b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/Messages.java
@@ -119,6 +119,8 @@
 
   public static String StringFilterRegistry_QualifiedName_description;
 
+  public static String StringFilterRegistry_RSEFreeze_description;
+
   public static String StringFilterRegistry_SlashDecode_description;
 
   public static String StringFilterRegistry_SlashEncode_description;
diff --git a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/StringFilterRegistry.java b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/StringFilterRegistry.java
index 65faefb..148b3c7 100644
--- a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/StringFilterRegistry.java
+++ b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/StringFilterRegistry.java
@@ -890,6 +890,60 @@
         return Pattern.quote(value);
       }
     });
+
+    registerFilter(new DocumentedStringFilter()
+    {
+      @Override
+      public String getName()
+      {
+        return "rseFreeze"; //$NON-NLS-1$
+      }
+
+      @Override
+      public String getDescription()
+      {
+        return Messages.StringFilterRegistry_RSEFreeze_description;
+      }
+
+      @Override
+      public String filter(String name)
+      {
+        int p = name.indexOf(':');
+        if (p >= 0)
+        {
+          name = name.substring(p + 1);
+        }
+        StringBuffer buf = new StringBuffer(name.length());
+        char[] chars = name.toCharArray();
+        long suffix = 0;
+        for (int i = 0; i < chars.length; i++)
+        {
+          char c = chars[i];
+          suffix *= 2;
+          if ("abcdefghijklmnopqrstuvwxyz0123456789-._".indexOf(c) >= 0) //$NON-NLS-1$
+          {
+            buf.append(c);
+          }
+          else if ("ABCDEFGHIJKLMNOPQRTSUVWXYZ".indexOf(c) >= 0) //$NON-NLS-1$
+          {
+            buf.append(Character.toLowerCase(c));
+            suffix += 1;
+          }
+          else if (c == ' ')
+          {
+            buf.append('_');
+            suffix += 1;
+          }
+          else
+          {
+            buf.append('#');
+            buf.append(Integer.toHexString(c));
+            buf.append('#');
+          }
+        }
+        return buf.toString() + "_" + Long.toString(suffix); //$NON-NLS-1$
+      }
+    });
   }
 
   public static void main(String[] args) throws UnsupportedEncodingException
diff --git a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/messages.properties b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/messages.properties
index 7776e43..68048ad 100644
--- a/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/messages.properties
+++ b/plugins/org.eclipse.oomph.setup.core/src/org/eclipse/oomph/setup/internal/core/messages.properties
@@ -51,6 +51,7 @@
 StringFilterRegistry_Property_description=Escapes all double back slashes (\\\\) of a String value, so that the result can be used as a value in properties.
 StringFilterRegistry_PropertyValue_description=Interprets the String value as a preference property path and returns the value of that property.
 StringFilterRegistry_QualifiedName_description=Converts a camel case String value name to a qualified name.
+StringFilterRegistry_RSEFreeze_description=The result of org.eclipse.rse.internal.persistence.PropertyFileProvider.freeze(String).
 StringFilterRegistry_SlashDecode_description=Decodes a slashEncoded String value.
 StringFilterRegistry_SlashEncode_description=Encodes all slashes and backslashes of a String value.
 StringFilterRegistry_Trim_description=Removes all whitespace from the beginning and the end of a String.
diff --git a/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF b/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
index 173aa05..57b4874 100644
--- a/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.oomph.setup.installer/META-INF/MANIFEST.MF
@@ -27,7 +27,7 @@
  org.eclipse.oomph.ui;bundle-version="[1.19.0,2.0.0)",
  org.eclipse.oomph.p2.ui;bundle-version="[1.19.0,2.0.0)",
  org.eclipse.oomph.setup.p2;bundle-version="[1.19.0,2.0.0)",
- org.eclipse.oomph.setup.core;bundle-version="[1.26.0,2.0.0)",
+ org.eclipse.oomph.setup.core;bundle-version="[1.27.0,2.0.0)",
  org.eclipse.oomph.jreinfo.ui;bundle-version="[1.15.0,2.0.0)",
  org.eclipse.help;bundle-version="[3.5.0,4.0.0)",
  org.eclipse.ui.net;bundle-version="[1.0.0,2.0.0)",