diff --git a/asdf-core/src/main/java/org/asdfformat/asdf/node/AsdfNode.java b/asdf-core/src/main/java/org/asdfformat/asdf/node/AsdfNode.java index eec05df..683b851 100644 --- a/asdf-core/src/main/java/org/asdfformat/asdf/node/AsdfNode.java +++ b/asdf-core/src/main/java/org/asdfformat/asdf/node/AsdfNode.java @@ -7,6 +7,7 @@ import java.time.Instant; import java.util.List; import java.util.Map; +import java.util.Optional; /** @@ -138,6 +139,34 @@ public interface AsdfNode extends Iterable { */ AsdfNode get(AsdfNode key); + /** + * Get an optional mapping value as AsdfNode, indexed by String key. + * @param key mapping key + * @return value + */ + Optional getOptional(String key); + + /** + * Get an optional sequence value or mapping value as AsdfNode, indexed by long key. + * @param key sequence index or mapping key + * @return value + */ + Optional getOptional(long key); + + /** + * Get an optional mapping value as AsdfNode, indexed by boolean key. + * @param key mapping key + * @return value + */ + Optional getOptional(boolean key); + + /** + * Get an optional mapping value as AsdfNode, indexed by AsdfNode key. + * @param key mapping key + * @return value + */ + Optional getOptional(AsdfNode key); + /** * Get a NUMBER mapping value as BigDecimal, indexed by String key. * @param key mapping key diff --git a/asdf-core/src/main/java/org/asdfformat/asdf/node/impl/AsdfNodeBase.java b/asdf-core/src/main/java/org/asdfformat/asdf/node/impl/AsdfNodeBase.java index dbfaa1c..a3e04a5 100644 --- a/asdf-core/src/main/java/org/asdfformat/asdf/node/impl/AsdfNodeBase.java +++ b/asdf-core/src/main/java/org/asdfformat/asdf/node/impl/AsdfNodeBase.java @@ -11,6 +11,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Optional; public abstract class AsdfNodeBase implements AsdfNode { @@ -99,6 +100,42 @@ public AsdfNode get(final AsdfNode key) { throw new IllegalStateException(makeGetErrorMessage("AsdfNode")); } + @Override + public Optional getOptional(final String key) { + if (containsKey(key)) { + return Optional.of(get(key)); + } else { + return Optional.empty(); + } + } + + @Override + public Optional getOptional(final long key) { + if (containsKey(key)) { + return Optional.of(get(key)); + } else { + return Optional.empty(); + } + } + + @Override + public Optional getOptional(final boolean key) { + if (containsKey(key)) { + return Optional.of(get(key)); + } else { + return Optional.empty(); + } + } + + @Override + public Optional getOptional(final AsdfNode key) { + if (containsKey(key)) { + return Optional.of(get(key)); + } else { + return Optional.empty(); + } + } + @Override public BigDecimal getBigDecimal(final String key) { return get(key).asBigDecimal();