commit 4598dc1cf3b79fad2da64b60f9ac97bbcdea24b7
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   Fri Jan 10 19:13:28 2014 +0100

    fix #9560 - IllegalArgumentException when color.layer contains "{ }"

diff --git a/src/org/openstreetmap/josm/data/Preferences.java b/src/org/openstreetmap/josm/data/Preferences.java
index ac199d6..7680dc4 100644
--- a/src/org/openstreetmap/josm/data/Preferences.java
+++ b/src/org/openstreetmap/josm/data/Preferences.java
@@ -52,6 +52,7 @@ import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.io.XmlWriter;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.ColorHelper;
+import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -835,7 +836,7 @@ public class Preferences {
         try {
             Matcher m = Pattern.compile("mappaint\\.(.+?)\\.(.+)").matcher(o);
             if (m.matches()) {
-                return tr("Paint style {0}: {1}", tr(m.group(1)), tr(m.group(2)));
+                return tr("Paint style {0}: {1}", tr(I18n.escape(m.group(1))), tr(I18n.escape(m.group(2))));
             }
         } catch (Exception e) {
             Main.warn(e);
@@ -843,12 +844,12 @@ public class Preferences {
         try {
             Matcher m = Pattern.compile("layer (.+)").matcher(o);
             if (m.matches()) {
-                return tr("Layer: {0}", tr(m.group(1)));
+                return tr("Layer: {0}", tr(I18n.escape(m.group(1))));
             }
         } catch (Exception e) {
             Main.warn(e);
         }
-        return tr(colornames.containsKey(o) ? colornames.get(o) : o);
+        return tr(I18n.escape(colornames.containsKey(o) ? colornames.get(o) : o));
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
new file mode 100644
index 0000000..acd8f4b
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/data/PreferencesTest.groovy
@@ -0,0 +1,14 @@
+package org.openstreetmap.josm.data
+
+import org.openstreetmap.josm.Main
+
+class PreferencesTest extends GroovyTestCase {
+    @Override
+    void setUp() {
+        Main.initApplicationPreferences()
+    }
+
+    void testColorName() {
+        Main.pref.getColorName("color.layer {5DE308C0-916F-4B5A-B3DB-D45E17F30172}.gpx") == "{5DE308C0-916F-4B5A-B3DB-D45E17F30172}.gpx"
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/I18nTest.groovy b/test/unit/org/openstreetmap/josm/tools/I18nTest.groovy
new file mode 100644
index 0000000..96c5bd5
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/tools/I18nTest.groovy
@@ -0,0 +1,10 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools
+
+class I18nTest extends GroovyTestCase {
+    void testEscape() {
+        def foobar = "{foo'bar}"
+        assert I18n.escape(foobar) == "'{'foo''bar'}'"
+        assert I18n.tr(I18n.escape(foobar)) == foobar
+    }
+}
