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