package com.wj.dexknife.shell.apkparser.parser;
import com.wj.dexknife.shell.apkparser.struct.xml.XmlNamespaceEndTag;
import com.wj.dexknife.shell.apkparser.struct.xml.XmlNamespaceStartTag;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* the xml file's namespaces.
*
* @author dongliu
*/
class XmlNamespaces {
private List<XmlNamespace> namespaces;
private List<XmlNamespace> newNamespaces;
public XmlNamespaces() {
this.namespaces = new ArrayList<>();
this.newNamespaces = new ArrayList<>();
}
public void addNamespace(XmlNamespaceStartTag tag) {
XmlNamespace namespace = new XmlNamespace(tag.getPrefix(), tag.getUri());
namespaces.add(namespace);
newNamespaces.add(namespace);
}
public void removeNamespace(XmlNamespaceEndTag tag) {
XmlNamespace namespace = new XmlNamespace(tag.getPrefix(), tag.getUri());
namespaces.remove(namespace);
newNamespaces.remove(namespace);
}
public String getPrefixViaUri(String uri) {
if (uri == null) {
return null;
}
for (XmlNamespace namespace : namespaces) {
if (namespace.uri.equals(uri)) {
return namespace.prefix;
}
}
return null;
}
public List<XmlNamespace> consumeNameSpaces() {
if (!newNamespaces.isEmpty()) {
List<XmlNamespace> xmlNamespaces = new ArrayList<>();
xmlNamespaces.addAll(newNamespaces);
newNamespaces.clear();
return xmlNamespaces;
} else {
return Collections.emptyList();
}
}
/**
* one namespace
*/
public static class XmlNamespace {
private String prefix;
private String uri;
private XmlNamespace(String prefix, String uri) {
this.prefix = prefix;
this.uri = uri;
}
public String getPrefix() {
return prefix;
}
public String getUri() {
return uri;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
XmlNamespace namespace = (XmlNamespace) o;
if (prefix == null && namespace.prefix != null) return false;
if (uri == null && namespace.uri != null) return false;
if (prefix != null && !prefix.equals(namespace.prefix)) return false;
if (uri != null && !uri.equals(namespace.uri)) return false;
return true;
}
@Override
public int hashCode() {
int result = prefix.hashCode();
result = 31 * result + uri.hashCode();
return result;
}
}
}