package com.android.server.wifi.hotspot2.omadm; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class OMAConstructed extends OMANode { private final Map<String, OMANode> mChildren; public OMAConstructed(OMANode parent, String name, String context) { super(parent, name, context); mChildren = new HashMap<>(); } @Override public OMANode addChild(String name, String context, String value, String pathString) throws IOException { if (pathString == null) { OMANode child = value != null ? new OMAScalar(this, name, context, value) : new OMAConstructed(this, name, context); mChildren.put(name.toLowerCase(), child); return child; } else { OMANode target = this; while (target.getParent() != null) target = target.getParent(); for (String element : pathString.split("/")) { target = target.getChild(element); if (target == null) throw new IOException("No child node '" + element + "' in " + getPathString()); else if (target.isLeaf()) throw new IOException("Cannot add child to leaf node: " + getPathString()); } return target.addChild(name, context, value, null); } } public String getScalarValue(Iterator<String> path) throws OMAException { if (!path.hasNext()) { throw new OMAException("Path too short for " + getPathString()); } String tag = path.next(); OMANode child = mChildren.get(tag.toLowerCase()); if (child != null) { return child.getScalarValue(path); } else { return null; } } @Override public OMAConstructed getListValue(Iterator<String> path) throws OMAException { if (!path.hasNext()) { return this; } String tag = path.next(); OMANode child = mChildren.get(tag.toLowerCase()); if (child != null) { return child.getListValue(path); } else { return null; } } @Override public boolean isLeaf() { return false; } @Override public Collection<OMANode> getChildren() { return Collections.unmodifiableCollection(mChildren.values()); } public OMANode getChild(String name) { return mChildren.get(name.toLowerCase()); } @Override public String getValue() { throw new UnsupportedOperationException(); } @Override public void toString(StringBuilder sb, int level) { sb.append(getPathString()); if (getContext() != null) { sb.append(" (").append(getContext()).append(')'); } sb.append('\n'); for (OMANode node : mChildren.values()) { node.toString(sb, level + 1); } } @Override public void marshal(OutputStream out, int level) throws IOException { OMAConstants.indent(level, out); OMAConstants.serializeString(getName(), out); if (getContext() != null) { out.write(String.format("(%s)", getContext()).getBytes(StandardCharsets.UTF_8)); } out.write(new byte[] { '+', '\n' }); for (OMANode child : mChildren.values()) { child.marshal(out, level + 1); } OMAConstants.indent(level, out); out.write(".\n".getBytes(StandardCharsets.UTF_8)); } }