Extend Resolver to support custom implicit types
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 34efbee..a56dc96 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,8 +7,8 @@
</properties>
<body>
<release version="1.5rc1" date="2009-10-23" description="Improve usage of generic collections in JavaBeans">
- <action dev="py4fun" type="update">
- Make regular expressions in Resolver public to support custom implicit types (2009-10-27)
+ <action dev="py4fun" type="fix" issue="27" due-to="Polyglot Maven team">
+ Extend Resolver to support custom implicit types (2009-10-27)
</action>
<action dev="py4fun" type="update">
Performance improvement: use ArrayStack instead of Stack which extends Vector (2009-10-20)
diff --git a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
index 911b977..f4a6cb2 100644
--- a/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
+++ b/src/main/java/org/yaml/snakeyaml/resolver/Resolver.java
@@ -55,22 +55,26 @@
*/
public Resolver(boolean respectDefaultImplicitScalars) {
if (respectDefaultImplicitScalars) {
- addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");
- addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");
- addImplicitResolver(Tags.INT, INT, "-+0123456789");
- addImplicitResolver(Tags.MERGE, MERGE, "<");
- addImplicitResolver(Tags.NULL, NULL, "~nN\0");
- addImplicitResolver(Tags.NULL, EMPTY, null);
- addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");
- addImplicitResolver(Tags.VALUE, VALUE, "=");
- // The following implicit resolver is only for documentation
- // purposes.
- // It cannot work
- // because plain scalars cannot start with '!', '&', or '*'.
- addImplicitResolver(Tags.YAML, YAML, "!&*");
+ addImplicitResolvers();
}
}
+ protected void addImplicitResolvers() {
+ addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");
+ addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");
+ addImplicitResolver(Tags.INT, INT, "-+0123456789");
+ addImplicitResolver(Tags.MERGE, MERGE, "<");
+ addImplicitResolver(Tags.NULL, NULL, "~nN\0");
+ addImplicitResolver(Tags.NULL, EMPTY, null);
+ addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");
+ addImplicitResolver(Tags.VALUE, VALUE, "=");
+ // The following implicit resolver is only for documentation
+ // purposes.
+ // It cannot work
+ // because plain scalars cannot start with '!', '&', or '*'.
+ addImplicitResolver(Tags.YAML, YAML, "!&*");
+ }
+
public Resolver() {
this(true);
}
diff --git a/src/test/java/examples/resolver/CustomResolver.java b/src/test/java/examples/resolver/CustomResolver.java
new file mode 100644
index 0000000..7b2e5cf
--- /dev/null
+++ b/src/test/java/examples/resolver/CustomResolver.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2008-2009 Andrey Somov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package examples.resolver;
+
+import org.yaml.snakeyaml.nodes.Tags;
+import org.yaml.snakeyaml.resolver.Resolver;
+
+public class CustomResolver extends Resolver {
+
+ /*
+ * do not resolve float and timestamp
+ */
+ protected void addImplicitResolvers() {
+ addImplicitResolver(Tags.BOOL, BOOL, "yYnNtTfFoO");
+ // addImplicitResolver(Tags.FLOAT, FLOAT, "-+0123456789.");
+ addImplicitResolver(Tags.INT, INT, "-+0123456789");
+ addImplicitResolver(Tags.MERGE, MERGE, "<");
+ addImplicitResolver(Tags.NULL, NULL, "~nN\0");
+ addImplicitResolver(Tags.NULL, EMPTY, null);
+ // addImplicitResolver(Tags.TIMESTAMP, TIMESTAMP, "0123456789");
+ addImplicitResolver(Tags.VALUE, VALUE, "=");
+ }
+}
diff --git a/src/test/java/examples/resolver/CustomResolverTest.java b/src/test/java/examples/resolver/CustomResolverTest.java
new file mode 100644
index 0000000..2a50c13
--- /dev/null
+++ b/src/test/java/examples/resolver/CustomResolverTest.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2008-2009 Andrey Somov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package examples.resolver;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.yaml.snakeyaml.Dumper;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Loader;
+import org.yaml.snakeyaml.Yaml;
+
+public class CustomResolverTest extends TestCase {
+
+ public void testResolverToDump() {
+ Map<Object, Object> map = new HashMap<Object, Object>();
+ map.put("1.0", "2009-01-01");
+ Yaml yaml = new Yaml(new Loader(), new Dumper(new DumperOptions()), new CustomResolver());
+ String output = yaml.dump(map);
+ assertEquals("{1.0: 2009-01-01}\n", output);
+ assertEquals("Float and Date must be excaped.", "{'1.0': '2009-01-01'}\n", new Yaml()
+ .dump(map));
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testResolverToLoad() {
+ Yaml yaml = new Yaml(new Loader(), new Dumper(new DumperOptions()), new CustomResolver());
+ Map<Object, Object> map = (Map<Object, Object>) yaml.load("1.0: 2009-01-01");
+ assertEquals(1, map.size());
+ assertEquals("2009-01-01", map.get("1.0"));
+ //
+ Yaml yaml2 = new Yaml();
+ Map<Object, Object> map2 = (Map<Object, Object>) yaml2.load("1.0: 2009-01-01");
+ assertEquals(1, map2.size());
+ assertFalse(map2.containsKey("1.0"));
+ assertTrue(map2.toString(), map2.containsKey(new Double(1.0)));
+ }
+
+}