Refactor: use Version enum instead of Array of Integers
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e97e179..232f480 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -7,6 +7,10 @@
</properties>
<body>
<release version="1.11" date="in Mercurial" description="Maintenance">
+ <action dev="py4fun" type="update">
+ Refactor: use Version enum instead of Array of Integers.
+ This is done to simplify fixing issue 149 (2012-06-09)
+ </action>
<action dev="py4fun" type="fix">
Add tests for issue 148 (2012-06-07)
</action>
diff --git a/src/main/java/org/yaml/snakeyaml/DumperOptions.java b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
index c829054..bfdaff5 100644
--- a/src/main/java/org/yaml/snakeyaml/DumperOptions.java
+++ b/src/main/java/org/yaml/snakeyaml/DumperOptions.java
@@ -147,9 +147,13 @@
return version;
}
+ public String getRepresentation() {
+ return version[0] + "." + version[1];
+ }
+
@Override
public String toString() {
- return "Version: " + version[0] + "." + version[1];
+ return "Version: " + getRepresentation();
}
}
diff --git a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
index 9e2b397..a3b6452 100644
--- a/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
+++ b/src/main/java/org/yaml/snakeyaml/emitter/Emitter.java
@@ -29,6 +29,7 @@
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.DumperOptions.ScalarStyle;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.CollectionEndEvent;
@@ -818,13 +819,11 @@
// Analyzers.
- private String prepareVersion(Integer[] version) {
- Integer major = version[0];
- Integer minor = version[1];
- if (major != 1) {
- throw new EmitterException("unsupported YAML version: " + version[0] + "." + version[1]);
+ private String prepareVersion(Version version) {
+ if (version.getArray()[0] != 1) {
+ throw new EmitterException("unsupported YAML version: " + version);
}
- return major.toString() + "." + minor.toString();
+ return version.getRepresentation();
}
private final static Pattern HANDLE_FORMAT = Pattern.compile("^![-_\\w]*!$");
diff --git a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
index db4a27b..18eeea9 100644
--- a/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
+++ b/src/main/java/org/yaml/snakeyaml/events/DocumentStartEvent.java
@@ -17,6 +17,7 @@
import java.util.Map;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.error.Mark;
/**
@@ -27,14 +28,18 @@
*/
public final class DocumentStartEvent extends Event {
private final boolean explicit;
- private final Integer[] version;
+ private final Version version;
private final Map<String, String> tags;
- public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Integer[] version,
+ public DocumentStartEvent(Mark startMark, Mark endMark, boolean explicit, Version version,
Map<String, String> tags) {
super(startMark, endMark);
this.explicit = explicit;
this.version = version;
+ // TODO enforce not null
+ // if (tags == null) {
+ // throw new NullPointerException("Tags must be provided.");
+ // }
this.tags = tags;
}
@@ -50,7 +55,7 @@
* components, the major and minor part of the version (in this
* order).
*/
- public Integer[] getVersion() {
+ public Version getVersion() {
return version;
}
diff --git a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
index db40329..ca90680 100644
--- a/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
+++ b/src/main/java/org/yaml/snakeyaml/parser/ParserImpl.java
@@ -20,6 +20,7 @@
import java.util.List;
import java.util.Map;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.error.Mark;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.events.AliasEvent;
@@ -122,7 +123,7 @@
private final Scanner scanner;
private Event currentEvent;
- private List<Integer> yamlVersion;
+ private Version yamlVersion;
private Map<String, String> tagHandles;
private final ArrayStack<Production> states;
private final ArrayStack<Mark> marks;
@@ -223,23 +224,15 @@
if (!scanner.checkToken(Token.ID.StreamEnd)) {
Token token = scanner.peekToken();
Mark startMark = token.getStartMark();
- List<Object> version_tags = processDirectives();
- List<Object> version = (List<Object>) version_tags.get(0);
- Map<String, String> tags = (Map<String, String>) version_tags.get(1);
+ VersionTagsTuple tuple = processDirectives();
if (!scanner.checkToken(Token.ID.DocumentStart)) {
throw new ParserException(null, null, "expected '<document start>', but found "
+ scanner.peekToken().getTokenId(), scanner.peekToken().getStartMark());
}
token = scanner.getToken();
Mark endMark = token.getEndMark();
- Integer[] versionInteger;
- if (version != null) {
- versionInteger = new Integer[2];
- versionInteger = version.toArray(versionInteger);
- } else {
- versionInteger = null;
- }
- event = new DocumentStartEvent(startMark, endMark, true, versionInteger, tags);
+ event = new DocumentStartEvent(startMark, endMark, true, tuple.getVersion(),
+ tuple.getTags());
states.push(new ParseDocumentEnd());
state = new ParseDocumentContent();
} else {
@@ -293,7 +286,7 @@
}
@SuppressWarnings("unchecked")
- private List<Object> processDirectives() {
+ private VersionTagsTuple processDirectives() {
yamlVersion = null;
tagHandles = new HashMap<String, String>();
while (scanner.checkToken(Token.ID.Directive)) {
@@ -311,7 +304,16 @@
"found incompatible YAML document (version 1.* is required)",
token.getStartMark());
}
- yamlVersion = (List<Integer>) token.getValue();
+ Integer minor = value.get(1);
+ switch (minor) {
+ case 0:
+ yamlVersion = Version.V1_0;
+ break;
+
+ default:
+ yamlVersion = Version.V1_1;
+ break;
+ }
} else if (token.getName().equals("TAG")) {
List<String> value = (List<String>) token.getValue();
String handle = value.get(0);
@@ -335,7 +337,7 @@
tagHandles.put(key, DEFAULT_TAGS.get(key));
}
}
- return value;
+ return new VersionTagsTuple(yamlVersion, tagHandles);
}
/**
diff --git a/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
new file mode 100644
index 0000000..eda979c
--- /dev/null
+++ b/src/main/java/org/yaml/snakeyaml/parser/VersionTagsTuple.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2008-2012, http://www.snakeyaml.org
+ *
+ * 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 org.yaml.snakeyaml.parser;
+
+import java.util.Map;
+
+import org.yaml.snakeyaml.DumperOptions.Version;
+
+public class VersionTagsTuple {
+ private Version version;
+ private Map<String, String> tags;
+
+ public VersionTagsTuple(Version version, Map<String, String> tags) {
+ this.version = version;
+ this.tags = tags;
+ }
+
+ public Version getVersion() {
+ return version;
+ }
+
+ public Map<String, String> getTags() {
+ return tags;
+ }
+}
diff --git a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
index 427df74..f5faf21 100644
--- a/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
+++ b/src/main/java/org/yaml/snakeyaml/serializer/Serializer.java
@@ -24,6 +24,7 @@
import java.util.Set;
import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.emitter.Emitable;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.DocumentEndEvent;
@@ -52,7 +53,7 @@
private final Resolver resolver;
private boolean explicitStart;
private boolean explicitEnd;
- private Integer[] useVersion;
+ private Version useVersion;
private Map<String, String> useTags;
private Set<Node> serializedNodes;
private Map<Node, String> anchors;
@@ -66,7 +67,7 @@
this.explicitStart = opts.isExplicitStart();
this.explicitEnd = opts.isExplicitEnd();
if (opts.getVersion() != null) {
- this.useVersion = opts.getVersion().getArray();
+ this.useVersion = opts.getVersion();
}
this.useTags = opts.getTags();
this.serializedNodes = new HashSet<Node>();
diff --git a/src/test/java/org/pyyaml/CanonicalParser.java b/src/test/java/org/pyyaml/CanonicalParser.java
index d434319..df3a10c 100644
--- a/src/test/java/org/pyyaml/CanonicalParser.java
+++ b/src/test/java/org/pyyaml/CanonicalParser.java
@@ -17,6 +17,7 @@
import java.util.ArrayList;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.DocumentEndEvent;
import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -68,7 +69,7 @@
scanner.getToken(Token.ID.Directive);
}
scanner.getToken(Token.ID.DocumentStart);
- events.add(new DocumentStartEvent(null, null, true, new Integer[] { 1, 1 }, null));
+ events.add(new DocumentStartEvent(null, null, true, Version.V1_1, null));
parseNode();
events.add(new DocumentEndEvent(null, null, true));
}
diff --git a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
index 4e7adec..4b17be6 100644
--- a/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
+++ b/src/test/java/org/yaml/snakeyaml/emitter/EventConstructor.java
@@ -19,8 +19,10 @@
import java.util.List;
import java.util.Map;
+import org.yaml.snakeyaml.DumperOptions.Version;
import org.yaml.snakeyaml.constructor.AbstractConstruct;
import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.DocumentEndEvent;
import org.yaml.snakeyaml.events.DocumentStartEvent;
@@ -94,11 +96,19 @@
} else if (className.equals("DocumentStartEvent")) {
Map<String, String> tags = (Map<String, String>) mapping.get("tags");
List<Integer> versionList = (List<Integer>) mapping.get("version");
- Integer[] version = null;
+ Version version = null;
+ // TODO ???
if (versionList != null) {
- version = new Integer[2];
- version[0] = versionList.get(0).intValue();
- version[1] = versionList.get(1).intValue();
+ Integer major = versionList.get(0).intValue();
+ if (major != 1) {
+ throw new YAMLException("Unsupported version.");
+ }
+ Integer minor = versionList.get(1).intValue();
+ if (minor == 0) {
+ version = Version.V1_0;
+ } else {
+ version = Version.V1_1;
+ }
}
value = new DocumentStartEvent(null, null, false, version, tags);
} else if (className.equals("MappingEndEvent")) {
diff --git a/src/test/resources/pyyaml/unsupported-version.emitter-error b/src/test/resources/pyyaml/unsupported-version.emitter-error
deleted file mode 100644
index f9c6197..0000000
--- a/src/test/resources/pyyaml/unsupported-version.emitter-error
+++ /dev/null
@@ -1,5 +0,0 @@
-- !StreamStart
-- !DocumentStart { version: [5,6] }
-- !Scalar { value: foo }
-- !DocumentEnd
-- !StreamEnd