1bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu/**
2bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * Copyright (c) 2016, The Android Open Source Project
3bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu *
4bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * you may not use this file except in compliance with the License.
6bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * You may obtain a copy of the License at
7bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu *
8bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu *     http://www.apache.org/licenses/LICENSE-2.0
9bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu *
10bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * Unless required by applicable law or agreed to in writing, software
11bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * See the License for the specific language governing permissions and
14bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * limitations under the License.
15bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu */
16bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
17bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiupackage android.net.wifi.hotspot2.omadm;
18bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
19bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiuimport android.text.TextUtils;
20bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
21bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiuimport java.util.ArrayList;
22bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiuimport java.util.List;
23ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiuimport java.util.Objects;
24bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
25bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu/**
26bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * A class represent a node in an XML tree. Each node is an XML element.
27bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * Used by {@link XMLParser} for parsing/converting each XML element to XMLNode.
28bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu *
29bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu * @hide
30bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu */
31bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiupublic class XMLNode {
32bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    private final String mTag;
33bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    private final List<XMLNode> mChildren;
34bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    private final XMLNode mParent;
35bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    private StringBuilder mTextBuilder;
36bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    private String mText;
37bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
38bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public XMLNode(XMLNode parent, String tag) {
39bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mTag = tag;
40bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mParent = parent;
41bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mChildren = new ArrayList<>();
42bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mTextBuilder = new StringBuilder();
43bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mText = null;
44bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
45bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
46bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    /**
47bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * Adding a text to this node. Invoked by {@link XMLParser#characters}.
48bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     *
49bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * @param text String to be added
50bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     */
51bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public void addText(String text) {
52bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mTextBuilder.append(text);
53bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
54bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
55bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    /**
56bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * Adding a child node to this node. Invoked by {@link XMLParser#startElement}.
57bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     *
58bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * @param child XMLNode to be added
59bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     */
60bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public void addChild(XMLNode child) {
61bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mChildren.add(child);
62bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
63bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
64bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    /**
65bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * Invoked when the end of the XML element is detected. Used for further processing
66bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     * of the text enclosed within this XML element. Invoked by {@link XMLParser#endElement}.
67bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu     */
68bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public void close() {
69bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        // Remove the leading and the trailing whitespaces.
70bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mText = mTextBuilder.toString().trim();
71bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        mTextBuilder = null;
72bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
73bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
74bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public String getTag() {
75bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        return mTag;
76bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
77bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
78bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public XMLNode getParent() {
79bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        return mParent;
80bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
81bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
82bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public String getText() {
83bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        return mText;
84bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
85bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
86bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public List<XMLNode> getChildren() {
87bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        return mChildren;
88bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
89bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
90bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    @Override
91bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    public boolean equals(Object thatObject) {
92bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        if (this == thatObject) {
93bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu            return true;
94bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        }
95bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        if (!(thatObject instanceof XMLNode)) {
96bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu            return false;
97bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        }
98bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        XMLNode that = (XMLNode) thatObject;
99bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu
100bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu        return TextUtils.equals(mTag, that.mTag) &&
101bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu                TextUtils.equals(mText, that.mText) &&
102bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu                mChildren.equals(that.mChildren);
103bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu    }
104ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu
105ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu    @Override
106ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu    public int hashCode() {
107ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu        return Objects.hash(mTag, mText, mChildren);
108ddafc73496e3bab135ac7249bfb3cf4d871e5cf2Peter Qiu    }
109bae4becf6997843cddf0d0c1dfa1f63e4580e6f8Peter Qiu}
110