improve error message when a global tag is invalid
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 7fb8cbd..48ea848 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,7 +7,7 @@
</properties>
<body>
<release version="1.7" date="in Mercurial" description="development">
- <action dev="maslovalex" type="update">
+ <action dev="py4fun" type="update">
URLDecoder.decode() does not fail when UTF-8 is invalid. Use
CodingErrorAction.REPORT to implement the failure (2010-05-21)
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Tag.java b/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
index d924339..330dd59 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Tag.java
@@ -17,7 +17,6 @@
import java.math.BigDecimal;
import java.math.BigInteger;
-import java.net.URLDecoder;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
@@ -97,13 +96,9 @@
public String getClassName() {
if (!value.startsWith(Tag.PREFIX)) {
- throw new YAMLException("Unknown tag: " + value);
+ throw new YAMLException("Invalid tag: " + value);
}
- try {
- return URLDecoder.decode(value.substring(Tag.PREFIX.length()), "UTF-8");
- } catch (java.io.UnsupportedEncodingException except) {
- throw new RuntimeException(except);
- }
+ return UriEncoder.decode(value.substring(Tag.PREFIX.length()));
}
public int getLength() {
diff --git a/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java b/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java
index 87a21ee..f0022ae 100644
--- a/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java
+++ b/src/main/java/org/yaml/snakeyaml/util/UriEncoder.java
@@ -16,6 +16,8 @@
package org.yaml.snakeyaml.util;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.CharacterCodingException;
@@ -23,6 +25,8 @@
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CodingErrorAction;
+import org.yaml.snakeyaml.error.YAMLException;
+
import com.google.gdata.util.common.base.Escaper;
import com.google.gdata.util.common.base.PercentEscaper;
@@ -32,12 +36,26 @@
private static final Escaper escaper = new PercentEscaper(
PercentEscaper.SAFEPATHCHARS_URLENCODER, false);
+ /**
+ * Escape special characters with '%'
+ */
public static String encode(String uri) {
return escaper.escape(uri);
}
+ /**
+ * Decode '%'-escaped characters. Decoding fails in case of invalid UTF-8
+ */
public static String decode(ByteBuffer buff) throws CharacterCodingException {
CharBuffer chars = UTF8Decoder.decode(buff);
return chars.toString();
}
+
+ public static String decode(String buff) {
+ try {
+ return URLDecoder.decode(buff, "UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ throw new YAMLException(e);
+ }
+ }
}
diff --git a/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java b/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java
index c3e981c..3df711d 100644
--- a/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java
+++ b/src/test/java/org/yaml/snakeyaml/constructor/ClassTagsTest.java
@@ -71,7 +71,7 @@
yaml.load(Util.getLocalResource("constructor/car-without-tags.yaml"));
fail("Must fail because of unknown tag: !car");
} catch (YAMLException e) {
- assertTrue(e.getMessage().contains("Unknown tag: !car"));
+ assertTrue(e.getMessage().contains("Invalid tag: !car"));
}
}
diff --git a/src/test/java/org/yaml/snakeyaml/nodes/TagTest.java b/src/test/java/org/yaml/snakeyaml/nodes/TagTest.java
index d65ba2f..89a5e8c 100644
--- a/src/test/java/org/yaml/snakeyaml/nodes/TagTest.java
+++ b/src/test/java/org/yaml/snakeyaml/nodes/TagTest.java
@@ -63,7 +63,7 @@
tag.getClassName();
fail("Class name is only available for global tag");
} catch (Exception e) {
- assertEquals("Unknown tag: !TagTest", e.getMessage());
+ assertEquals("Invalid tag: !TagTest", e.getMessage());
}
}