From 6abaaebdb406e84146ee4f2dfb74f6d7960d5178 Mon Sep 17 00:00:00 2001 From: REAndroid Date: Sat, 24 Dec 2022 11:50:04 -0500 Subject: [PATCH] Xml element clearStringReferences when removing child element --- .../lib/arsc/chunk/xml/BaseXmlChunk.java | 26 +++++++++++-- .../lib/arsc/chunk/xml/ResXmlAttribute.java | 34 ++++++++++++++-- .../lib/arsc/chunk/xml/ResXmlElement.java | 39 ++++++++++++++++--- .../arsc/chunk/xml/ResXmlStartElement.java | 21 +++++++++- .../arsc/chunk/xml/ResXmlStartNamespace.java | 14 ++++++- 5 files changed, 118 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java index 7fff725..d72c2a0 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/BaseXmlChunk.java @@ -18,15 +18,15 @@ package com.reandroid.lib.arsc.chunk.xml; import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.chunk.BaseChunk; -import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.ResXmlString; import com.reandroid.lib.arsc.pool.ResXmlStringPool; -import java.io.IOException; +import java.util.HashSet; +import java.util.Set; -public class BaseXmlChunk extends BaseChunk { + public class BaseXmlChunk extends BaseChunk { private final IntegerItem mLineNumber; private final IntegerItem mCommentReference; @@ -46,6 +46,23 @@ public class BaseXmlChunk extends BaseChunk { addChild(mNamespaceReference); addChild(mStringReference); } + Set clearStringReferences(){ + Set results=new HashSet<>(); + ResXmlString xmlString; + xmlString=unLinkStringReference(mCommentReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mNamespaceReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mStringReference); + if(xmlString!=null){ + results.add(xmlString); + } + return results; + } void linkStringReferences(){ linkStringReference(mCommentReference); linkStringReference(mNamespaceReference); @@ -57,11 +74,12 @@ public class BaseXmlChunk extends BaseChunk { xmlString.addReferenceIfAbsent(item); } } - void unLinkStringReference(IntegerItem item){ + ResXmlString unLinkStringReference(IntegerItem item){ ResXmlString xmlString = getResXmlString(item.get()); if(xmlString!=null){ xmlString.removeReference(item); } + return xmlString; } public void setLineNumber(int val){ mLineNumber.set(val); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java index c221233..faae2fa 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlAttribute.java @@ -18,16 +18,16 @@ package com.reandroid.lib.arsc.chunk.xml; import com.reandroid.lib.arsc.array.ResXmlIDArray; import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.container.FixedBlockContainer; -import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.item.*; import com.reandroid.lib.arsc.pool.ResXmlStringPool; import com.reandroid.lib.arsc.value.ValueType; import com.reandroid.lib.json.JSONConvert; import com.reandroid.lib.json.JSONObject; -import java.io.IOException; +import java.util.HashSet; +import java.util.Set; -public class ResXmlAttribute extends FixedBlockContainer + public class ResXmlAttribute extends FixedBlockContainer implements Comparable, JSONConvert { private final IntegerItem mNamespaceReference; private final IntegerItem mNameReference; @@ -53,6 +53,27 @@ public class ResXmlAttribute extends FixedBlockContainer addChild(5, mValueTypeByte); addChild(6, mRawValue); } + Set clearStringReferences(){ + Set results=new HashSet<>(); + ResXmlString xmlString; + xmlString=unLinkStringReference(mNamespaceReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mNameReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mValueStringReference); + if(xmlString!=null){ + results.add(xmlString); + } + xmlString=unLinkStringReference(mRawValue); + if(xmlString!=null){ + results.add(xmlString); + } + return results; + } public void linkStringReferences(){ linkStringReference(mNamespaceReference); linkStringReference(mNameReference); @@ -67,6 +88,13 @@ public class ResXmlAttribute extends FixedBlockContainer xmlString.addReferenceIfAbsent(item); } } + private ResXmlString unLinkStringReference(IntegerItem item){ + ResXmlString xmlString = getResXmlString(item.get()); + if(xmlString!=null){ + xmlString.removeReference(item); + } + return xmlString; + } public String getUri(){ return getString(getNamespaceReference()); } diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java index 98b4026..254e344 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlElement.java @@ -22,6 +22,7 @@ import com.reandroid.lib.arsc.container.FixedBlockContainer; import com.reandroid.lib.arsc.container.SingleBlockContainer; import com.reandroid.lib.arsc.header.HeaderBlock; import com.reandroid.lib.arsc.io.BlockReader; +import com.reandroid.lib.arsc.item.ResXmlString; import com.reandroid.lib.arsc.pool.ResXmlStringPool; import com.reandroid.lib.json.JSONConvert; import com.reandroid.lib.json.JSONArray; @@ -29,11 +30,9 @@ import com.reandroid.lib.json.JSONObject; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; -public class ResXmlElement extends FixedBlockContainer implements JSONConvert { + public class ResXmlElement extends FixedBlockContainer implements JSONConvert { private final BlockList mStartNamespaceList; private final SingleBlockContainer mStartElementContainer; private final BlockList mBody; @@ -56,6 +55,24 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert clearStringReferences(){ + Set results=new HashSet<>(); + for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ + results.addAll(startNamespace.clearStringReferences()); + } + ResXmlStartElement start = getStartElement(); + if(start!=null){ + results.addAll(start.clearStringReferences()); + } + ResXmlText resXmlText=getResXmlText(); + if(resXmlText!=null){ + results.addAll(resXmlText.clearStringReferences()); + } + for(ResXmlElement child:listElements()){ + results.addAll(child.clearStringReferences()); + } + return results; + } void linkStringReferences(){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ startNamespace.linkStringReferences(); @@ -212,8 +229,18 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert removedStrings = element.clearStringReferences(); + for(ResXmlString xmlString:removedStrings){ + if(xmlString.getReferencedList().size()!=0){ + continue; + } + xmlString.set(""); + } + } + return mBody.remove(element); } public int countElements(){ return mBody.size(); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java index 00fe7ab..731f93e 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartElement.java @@ -17,13 +17,14 @@ package com.reandroid.lib.arsc.chunk.xml; import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.array.ResXmlAttributeArray; +import com.reandroid.lib.arsc.item.ResXmlString; import com.reandroid.lib.arsc.item.ShortItem; -import com.reandroid.lib.arsc.value.ValueType; import java.util.Collection; +import java.util.Set; -public class ResXmlStartElement extends BaseXmlChunk { + public class ResXmlStartElement extends BaseXmlChunk { private final ShortItem mAttributeStart; private final ShortItem mAttributeUnitSize; private final ShortItem mAttributeCount; @@ -52,10 +53,26 @@ public class ResXmlStartElement extends BaseXmlChunk { @Override void linkStringReferences(){ super.linkStringReferences(); + ResXmlEndElement end = getResXmlEndElement(); + if(end!=null){ + end.linkStringReferences(); + } for(ResXmlAttribute attr:listResXmlAttributes()){ attr.linkStringReferences(); } } + @Override + Set clearStringReferences(){ + Set results=super.clearStringReferences(); + ResXmlEndElement end = getResXmlEndElement(); + if(end!=null){ + results.addAll(end.clearStringReferences()); + } + for(ResXmlAttribute attr:listResXmlAttributes()){ + results.addAll(attr.clearStringReferences()); + } + return results; + } @Override protected void onPreRefreshRefresh(){ sortAttributes(); diff --git a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java index 02f146b..cb77aaa 100755 --- a/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java +++ b/src/main/java/com/reandroid/lib/arsc/chunk/xml/ResXmlStartNamespace.java @@ -16,8 +16,11 @@ package com.reandroid.lib.arsc.chunk.xml; import com.reandroid.lib.arsc.chunk.ChunkType; +import com.reandroid.lib.arsc.item.ResXmlString; -public class ResXmlStartNamespace extends ResXmlNamespace { +import java.util.Set; + + public class ResXmlStartNamespace extends ResXmlNamespace { public ResXmlStartNamespace() { super(ChunkType.XML_START_NAMESPACE); } @@ -35,4 +38,13 @@ public class ResXmlStartNamespace extends ResXmlNamespace { end.linkStringReferences(); } } + @Override + Set clearStringReferences(){ + Set results=super.clearStringReferences(); + ResXmlEndNamespace end = getEnd(); + if(end!=null){ + results.addAll(end.clearStringReferences()); + } + return results; + } }