diff --git a/src/main/java/com/reandroid/lib/apk/ResourceIds.java b/src/main/java/com/reandroid/lib/apk/ResourceIds.java
index dfbbd8f..5411535 100644
--- a/src/main/java/com/reandroid/lib/apk/ResourceIds.java
+++ b/src/main/java/com/reandroid/lib/apk/ResourceIds.java
@@ -21,14 +21,13 @@ import com.reandroid.lib.arsc.group.EntryGroup;
import com.reandroid.lib.arsc.pool.SpecStringPool;
import com.reandroid.lib.json.JSONArray;
import com.reandroid.lib.json.JSONObject;
+import com.reandroid.xml.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-public class ResourceIds {
+ public class ResourceIds {
private final Table mTable;
public ResourceIds(Table table){
this.mTable=table;
@@ -85,8 +84,11 @@ public class ResourceIds {
public void fromXml(InputStream inputStream) throws IOException {
mTable.fromXml(inputStream);
}
- public void fromXml(Reader reader) throws IOException {
- mTable.fromXml(reader);
+ public void fromXml(XMLDocument xmlDocument) throws IOException {
+ mTable.fromXml(xmlDocument);
+ }
+ public XMLDocument toXMLDocument(){
+ return mTable.toXMLDocument();
}
public static class Table implements Comparator
{
@@ -115,9 +117,9 @@ public class ResourceIds {
}
this.packageMap.put(pkg.id, pkg);
}
- public void add(Package.Type.Entry entry){
+ public Package add(Package.Type.Entry entry){
if(entry==null){
- return;
+ return null;
}
byte pkgId=entry.getPackageId();
Package pkg = packageMap.get(pkgId);
@@ -126,6 +128,7 @@ public class ResourceIds {
packageMap.put(pkgId, pkg);
}
pkg.add(entry);
+ return pkg;
}
public Package.Type.Entry getEntry(int resourceId){
byte packageId = (byte) ((resourceId>>24) & 0xff);
@@ -191,6 +194,15 @@ public class ResourceIds {
}
}
}
+ public XMLDocument toXMLDocument(){
+ XMLDocument xmlDocument = new XMLDocument();
+ XMLElement documentElement = new XMLElement("resources");
+ for(Package pkg:listPackages()){
+ pkg.toXMLElements(documentElement);
+ }
+ xmlDocument.setDocumentElement(documentElement);
+ return xmlDocument;
+ }
public void writeXml(File file) throws IOException {
File dir=file.getParentFile();
if(dir!=null && !dir.exists()){
@@ -205,35 +217,29 @@ public class ResourceIds {
outputStream.close();
}
public void writeXml(Writer writer) throws IOException {
- writer.write("");
- writer.write("\n");
- for(Package pkg:listPackages()){
- pkg.writeXml(writer);
- }
- writer.write("\n");
- writer.flush();
+ XMLDocument xmlDocument=toXMLDocument();
+ xmlDocument.write(writer, false);
}
public void fromXml(File file) throws IOException {
FileInputStream inputStream=new FileInputStream(file);
fromXml(inputStream);
- }
- public void fromXml(InputStream inputStream) throws IOException {
- InputStreamReader reader=new InputStreamReader(inputStream, StandardCharsets.UTF_8);
- fromXml(reader);
inputStream.close();
}
- public void fromXml(Reader reader) throws IOException {
- BufferedReader bufferedReader;
- if(reader instanceof BufferedReader){
- bufferedReader=(BufferedReader) reader;
- }else {
- bufferedReader=new BufferedReader(reader);
+ public void fromXml(InputStream inputStream) throws IOException {
+ try {
+ fromXml(XMLDocument.load(inputStream));
+ } catch (XMLException ex) {
+ throw new IOException(ex.getMessage(), ex);
}
- String line;
- while ((line=bufferedReader.readLine())!=null){
- add(Package.Type.Entry.fromXml(line));
+ }
+ public void fromXml(XMLDocument xmlDocument) {
+ XMLElement documentElement = xmlDocument.getDocumentElement();
+ int count=documentElement.getChildesCount();
+ for(int i=0;i");
- }
+ public void toXMLElements(XMLElement documentElement){
+ int count = documentElement.getChildesCount();
for(Type type:listTypes()){
- type.writeXml(writer);
+ type.toXMLElements(documentElement);
}
+ XMLElement firstElement = documentElement.getChildAt(count);
+ if(firstElement!=null){
+ XMLComment comment = new XMLComment(
+ "packageName=\""+this.name+"\"");
+ firstElement.addComment(comment);
+ }
+ }
+ void setPackageName(XMLComment xmlComment){
+ if(xmlComment==null){
+ return;
+ }
+ String pkgName = xmlComment.getCommentText();
+ if(pkgName==null || !pkgName.contains("packageName")){
+ return;
+ }
+ int i = pkgName.indexOf('"');
+ if(i>0){
+ i++;
+ pkgName=pkgName.substring(i);
+ }else {
+ return;
+ }
+ i = pkgName.indexOf('"');
+ if(i>0){
+ pkgName=pkgName.substring(0, i);
+ }else {
+ return;
+ }
+ this.name=pkgName.trim();
}
public List listEntries(){
List results=new ArrayList<>(countEntries());
@@ -507,10 +537,9 @@ public class ResourceIds {
jsonObject.put("entries", jsonArray);
return jsonObject;
}
- public void writeXml(Writer writer) throws IOException {
+ public void toXMLElements(XMLElement documentElement){
for(Entry entry:listEntries()){
- writer.write("\n ");
- entry.writeXml(writer);
+ documentElement.addChild(entry.toXMLElement());
}
}
public List listEntries(){
@@ -642,38 +671,17 @@ public class ResourceIds {
jsonObject.put("name", getName());
return jsonObject;
}
- public String toXml(){
- StringWriter writer=new StringWriter();
- try {
- writeXml(writer);
- writer.flush();
- writer.close();
- } catch (IOException ignored) {
- }
- return writer.toString();
- }
- public void writeXml(Writer writer) throws IOException {
- writer.write("");
+ public XMLElement toXMLElement(){
+ XMLElement element=new XMLElement();
+ element.setResourceId(getResourceId());
+ element.addAttribute(new XMLAttribute("id", getHexId()));
+ element.addAttribute(new XMLAttribute("type", getTypeName()));
+ element.addAttribute(new XMLAttribute("name", getName()));
+ return element;
}
@Override
public String toString(){
- return toXml();
+ return toXMLElement().toText(false);
}
public static Entry fromEntryGroup(EntryGroup entryGroup){
return new Entry(entryGroup.getResourceId(),
@@ -685,42 +693,12 @@ public class ResourceIds {
jsonObject.optString("type", null),
jsonObject.getString("name"));
}
- public static Entry fromXml(String xmlElement){
- String element=xmlElement;
- element=element.replaceAll("[\n\r\t]+", " ");
- element=element.trim();
- String start="")){
- return null;
- }
- element=element.substring(start.length()).trim();
- Pattern pattern=PATTERN;
- int id=0;
- String type=null;
- String name=null;
- Matcher matcher=pattern.matcher(element);
- while (matcher.find()){
- String attr=matcher.group(1).toLowerCase();
- String value=matcher.group(2);
- element=matcher.group(3);
- if(attr.equals("id")){
- id=Integer.decode(value);
- }else if(attr.equals("name")){
- name=value;
- }else if(attr.equals("type")){
- type=value;
- }
- matcher= pattern.matcher(element);
- }
- if(id==0){
- throw new DuplicateException("Missing id: "+xmlElement);
- }
- if(name==null){
- throw new DuplicateException("Missing name: "+xmlElement);
- }
- return new Entry(id, type, name);
+ public static Entry fromXml(XMLElement element){
+ return new Entry(
+ Integer.decode(element.getAttributeValue("id")),
+ element.getAttributeValue("type"),
+ element.getAttributeValue("name"));
}
- private static final Pattern PATTERN=Pattern.compile("^\\s*([^\\s=\"]+)\\s*=\\s*\"([^\"]+)\"(.*)$");
}
}