aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/yaml/snakeyaml/nodes/Node.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/yaml/snakeyaml/nodes/Node.java')
-rw-r--r--src/main/java/org/yaml/snakeyaml/nodes/Node.java345
1 files changed, 202 insertions, 143 deletions
diff --git a/src/main/java/org/yaml/snakeyaml/nodes/Node.java b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
index 1037e41a..45b9b9b8 100644
--- a/src/main/java/org/yaml/snakeyaml/nodes/Node.java
+++ b/src/main/java/org/yaml/snakeyaml/nodes/Node.java
@@ -1,166 +1,225 @@
/**
- * Copyright (c) 2008, http://www.snakeyaml.org
+ * Copyright (c) 2008, SnakeYAML
*
- * 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
+ * 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
+ * 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.
+ * 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.nodes;
+import java.util.List;
+import org.yaml.snakeyaml.comments.CommentLine;
import org.yaml.snakeyaml.error.Mark;
/**
* Base class for all nodes.
* <p>
- * The nodes form the node-graph described in the <a
- * href="http://yaml.org/spec/1.1/">YAML Specification</a>.
+ * The nodes form the node-graph described in the <a href="http://yaml.org/spec/1.1/">YAML
+ * Specification</a>.
* </p>
* <p>
* While loading, the node graph is usually created by the
- * {@link org.yaml.snakeyaml.composer.Composer}, and later transformed into
- * application specific Java classes by the classes from the
- * {@link org.yaml.snakeyaml.constructor} package.
+ * {@link org.yaml.snakeyaml.composer.Composer}, and later transformed into application specific
+ * Java classes by the classes from the {@link org.yaml.snakeyaml.constructor} package.
* </p>
*/
public abstract class Node {
- private Tag tag;
- private Mark startMark;
- protected Mark endMark;
- private Class<? extends Object> type;
- private boolean twoStepsConstruction;
- /**
- * true when the tag is assigned by the resolver
- */
- protected boolean resolved;
- protected Boolean useClassConstructor;
-
- public Node(Tag tag, Mark startMark, Mark endMark) {
- setTag(tag);
- this.startMark = startMark;
- this.endMark = endMark;
- this.type = Object.class;
- this.twoStepsConstruction = false;
- this.resolved = true;
- this.useClassConstructor = null;
- }
-
- /**
- * Tag of this node.
- * <p>
- * Every node has a tag assigned. The tag is either local or global.
- *
- * @return Tag of this node.
- */
- public Tag getTag() {
- return this.tag;
- }
-
- public Mark getEndMark() {
- return endMark;
- }
-
- /**
- * For error reporting.
- *
- * @see "class variable 'id' in PyYAML"
- * @return scalar, sequence, mapping
- */
- public abstract NodeId getNodeId();
-
- public Mark getStartMark() {
- return startMark;
- }
-
- public void setTag(Tag tag) {
- if (tag == null) {
- throw new NullPointerException("tag in a Node is required.");
- }
- this.tag = tag;
- }
-
- /**
- * Two Nodes are never equal.
- */
- @Override
- public final boolean equals(Object obj) {
- return super.equals(obj);
- }
- public Class<? extends Object> getType() {
- return type;
+ private Tag tag;
+ private final Mark startMark;
+ protected Mark endMark;
+ private Class<? extends Object> type;
+ private boolean twoStepsConstruction;
+ private String anchor;
+ private List<CommentLine> inLineComments;
+ private List<CommentLine> blockComments;
+ // End Comments are only on the last node in a document
+ private List<CommentLine> endComments;
+
+ /**
+ * true when the tag is assigned by the resolver
+ */
+ protected boolean resolved;
+ protected Boolean useClassConstructor;
+
+ public Node(Tag tag, Mark startMark, Mark endMark) {
+ setTag(tag);
+ this.startMark = startMark;
+ this.endMark = endMark;
+ this.type = Object.class;
+ this.twoStepsConstruction = false;
+ this.resolved = true;
+ this.useClassConstructor = null;
+ this.inLineComments = null;
+ this.blockComments = null;
+ this.endComments = null;
+ }
+
+ /**
+ * Tag of this node.
+ * <p>
+ * Every node has a tag assigned. The tag is either local or global.
+ *
+ * @return Tag of this node.
+ */
+ public Tag getTag() {
+ return this.tag;
+ }
+
+ public Mark getEndMark() {
+ return endMark;
+ }
+
+ /**
+ * For error reporting.
+ *
+ * @see "class variable 'id' in PyYAML"
+ * @return scalar, sequence, mapping
+ */
+ public abstract NodeId getNodeId();
+
+ public Mark getStartMark() {
+ return startMark;
+ }
+
+ public void setTag(Tag tag) {
+ if (tag == null) {
+ throw new NullPointerException("tag in a Node is required.");
}
-
- public void setType(Class<? extends Object> type) {
- if (!type.isAssignableFrom(this.type)) {
- this.type = type;
- }
- }
-
- public void setTwoStepsConstruction(boolean twoStepsConstruction) {
- this.twoStepsConstruction = twoStepsConstruction;
- }
-
- /**
- * Indicates if this node must be constructed in two steps.
- * <p>
- * Two-step construction is required whenever a node is a child (direct or
- * indirect) of it self. That is, if a recursive structure is build using
- * anchors and aliases.
- * </p>
- * <p>
- * Set by {@link org.yaml.snakeyaml.composer.Composer}, used during the
- * construction process.
- * </p>
- * <p>
- * Only relevant during loading.
- * </p>
- *
- * @return <code>true</code> if the node is self referenced.
- */
- public boolean isTwoStepsConstruction() {
- return twoStepsConstruction;
- }
-
- @Override
- public final int hashCode() {
- return super.hashCode();
- }
-
- public boolean useClassConstructor() {
- if (useClassConstructor == null) {
- if (!tag.isSecondary() && isResolved() && !Object.class.equals(type)
- && !tag.equals(Tag.NULL)) {
- return true;
- } else if (tag.isCompatible(getType())) {
- // the tag is compatible with the runtime class
- // the tag will be ignored
- return true;
- } else {
- return false;
- }
- }
- return useClassConstructor.booleanValue();
+ this.tag = tag;
+ }
+
+ /**
+ * Node is only equal to itself
+ */
+ @Override
+ public final boolean equals(Object obj) {
+ return super.equals(obj);
+ }
+
+ public Class<? extends Object> getType() {
+ return type;
+ }
+
+ public void setType(Class<? extends Object> type) {
+ if (!type.isAssignableFrom(this.type)) {
+ this.type = type;
}
-
- public void setUseClassConstructor(Boolean useClassConstructor) {
- this.useClassConstructor = useClassConstructor;
- }
-
- /**
- * Indicates if the tag was added by
- * {@link org.yaml.snakeyaml.resolver.Resolver}.
- *
- * @return <code>true</code> if the tag of this node was resolved</code>
- */
- public boolean isResolved() {
- return resolved;
+ }
+
+ public void setTwoStepsConstruction(boolean twoStepsConstruction) {
+ this.twoStepsConstruction = twoStepsConstruction;
+ }
+
+ /**
+ * Indicates if this node must be constructed in two steps.
+ * <p>
+ * Two-step construction is required whenever a node is a child (direct or indirect) of it self.
+ * That is, if a recursive structure is build using anchors and aliases.
+ * </p>
+ * <p>
+ * Set by {@link org.yaml.snakeyaml.composer.Composer}, used during the construction process.
+ * </p>
+ * <p>
+ * Only relevant during loading.
+ * </p>
+ *
+ * @return <code>true</code> if the node is self referenced.
+ */
+ public boolean isTwoStepsConstruction() {
+ return twoStepsConstruction;
+ }
+
+ @Override
+ public final int hashCode() {
+ return super.hashCode();
+ }
+
+ public boolean useClassConstructor() {
+ if (useClassConstructor == null) {
+ // the tag is compatible with the runtime class
+ // the tag will be ignored
+ if (!tag.isSecondary() && resolved && !Object.class.equals(type) && !tag.equals(Tag.NULL)) {
+ return true;
+ } else {
+ return tag.isCompatible(getType());
+ }
}
+ return useClassConstructor.booleanValue();
+ }
+
+ public void setUseClassConstructor(Boolean useClassConstructor) {
+ this.useClassConstructor = useClassConstructor;
+ }
+
+ /**
+ * Indicates if the tag was added by {@link org.yaml.snakeyaml.resolver.Resolver}.
+ *
+ * @return true if the tag of this node was resolved
+ *
+ * @deprecated Since v1.22. Absent in immediately prior versions, but present previously. Restored
+ * deprecated for backwards compatibility.
+ */
+ @Deprecated
+ public boolean isResolved() {
+ return resolved;
+ }
+
+ public String getAnchor() {
+ return anchor;
+ }
+
+ public void setAnchor(String anchor) {
+ this.anchor = anchor;
+ }
+
+ /**
+ * The ordered list of in-line comments. The first of which appears at the end of the line
+ * respresent by this node. The rest are in the following lines, indented per the Spec to indicate
+ * they are continuation of the inline comment.
+ *
+ * @return the comment line list.
+ */
+ public List<CommentLine> getInLineComments() {
+ return inLineComments;
+ }
+
+ public void setInLineComments(List<CommentLine> inLineComments) {
+ this.inLineComments = inLineComments;
+ }
+
+ /**
+ * The ordered list of blank lines and block comments (full line) that appear before this node.
+ *
+ * @return the comment line list.
+ */
+ public List<CommentLine> getBlockComments() {
+ return blockComments;
+ }
+
+ public void setBlockComments(List<CommentLine> blockComments) {
+ this.blockComments = blockComments;
+ }
+
+ /**
+ * The ordered list of blank lines and block comments (full line) that appear AFTER this node.
+ * <p>
+ * NOTE: these comment should occur only in the last node in a document, when walking the node
+ * tree "in order"
+ *
+ * @return the comment line list.
+ */
+ public List<CommentLine> getEndComments() {
+ return endComments;
+ }
+
+ public void setEndComments(List<CommentLine> endComments) {
+ this.endComments = endComments;
+ }
}