Xml element clearStringReferences when removing child element

This commit is contained in:
REAndroid 2022-12-24 11:50:04 -05:00
parent 1c59826985
commit 6abaaebdb4
5 changed files with 118 additions and 16 deletions

View File

@ -18,15 +18,15 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.chunk.BaseChunk; 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.IntegerItem;
import com.reandroid.lib.arsc.item.ResXmlString; import com.reandroid.lib.arsc.item.ResXmlString;
import com.reandroid.lib.arsc.pool.ResXmlStringPool; 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 mLineNumber;
private final IntegerItem mCommentReference; private final IntegerItem mCommentReference;
@ -46,6 +46,23 @@ public class BaseXmlChunk extends BaseChunk {
addChild(mNamespaceReference); addChild(mNamespaceReference);
addChild(mStringReference); addChild(mStringReference);
} }
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> 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(){ void linkStringReferences(){
linkStringReference(mCommentReference); linkStringReference(mCommentReference);
linkStringReference(mNamespaceReference); linkStringReference(mNamespaceReference);
@ -57,11 +74,12 @@ public class BaseXmlChunk extends BaseChunk {
xmlString.addReferenceIfAbsent(item); xmlString.addReferenceIfAbsent(item);
} }
} }
void unLinkStringReference(IntegerItem item){ ResXmlString unLinkStringReference(IntegerItem item){
ResXmlString xmlString = getResXmlString(item.get()); ResXmlString xmlString = getResXmlString(item.get());
if(xmlString!=null){ if(xmlString!=null){
xmlString.removeReference(item); xmlString.removeReference(item);
} }
return xmlString;
} }
public void setLineNumber(int val){ public void setLineNumber(int val){
mLineNumber.set(val); mLineNumber.set(val);

View File

@ -18,16 +18,16 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.array.ResXmlIDArray; import com.reandroid.lib.arsc.array.ResXmlIDArray;
import com.reandroid.lib.arsc.base.Block; import com.reandroid.lib.arsc.base.Block;
import com.reandroid.lib.arsc.container.FixedBlockContainer; 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.item.*;
import com.reandroid.lib.arsc.pool.ResXmlStringPool; import com.reandroid.lib.arsc.pool.ResXmlStringPool;
import com.reandroid.lib.arsc.value.ValueType; import com.reandroid.lib.arsc.value.ValueType;
import com.reandroid.lib.json.JSONConvert; import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONObject; 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<ResXmlAttribute>, JSONConvert<JSONObject> { implements Comparable<ResXmlAttribute>, JSONConvert<JSONObject> {
private final IntegerItem mNamespaceReference; private final IntegerItem mNamespaceReference;
private final IntegerItem mNameReference; private final IntegerItem mNameReference;
@ -53,6 +53,27 @@ public class ResXmlAttribute extends FixedBlockContainer
addChild(5, mValueTypeByte); addChild(5, mValueTypeByte);
addChild(6, mRawValue); addChild(6, mRawValue);
} }
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> 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(){ public void linkStringReferences(){
linkStringReference(mNamespaceReference); linkStringReference(mNamespaceReference);
linkStringReference(mNameReference); linkStringReference(mNameReference);
@ -67,6 +88,13 @@ public class ResXmlAttribute extends FixedBlockContainer
xmlString.addReferenceIfAbsent(item); xmlString.addReferenceIfAbsent(item);
} }
} }
private ResXmlString unLinkStringReference(IntegerItem item){
ResXmlString xmlString = getResXmlString(item.get());
if(xmlString!=null){
xmlString.removeReference(item);
}
return xmlString;
}
public String getUri(){ public String getUri(){
return getString(getNamespaceReference()); return getString(getNamespaceReference());
} }

View File

@ -22,6 +22,7 @@ import com.reandroid.lib.arsc.container.FixedBlockContainer;
import com.reandroid.lib.arsc.container.SingleBlockContainer; import com.reandroid.lib.arsc.container.SingleBlockContainer;
import com.reandroid.lib.arsc.header.HeaderBlock; import com.reandroid.lib.arsc.header.HeaderBlock;
import com.reandroid.lib.arsc.io.BlockReader; 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.arsc.pool.ResXmlStringPool;
import com.reandroid.lib.json.JSONConvert; import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONArray; import com.reandroid.lib.json.JSONArray;
@ -29,11 +30,9 @@ import com.reandroid.lib.json.JSONObject;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JSONObject> { public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JSONObject> {
private final BlockList<ResXmlStartNamespace> mStartNamespaceList; private final BlockList<ResXmlStartNamespace> mStartNamespaceList;
private final SingleBlockContainer<ResXmlStartElement> mStartElementContainer; private final SingleBlockContainer<ResXmlStartElement> mStartElementContainer;
private final BlockList<ResXmlElement> mBody; private final BlockList<ResXmlElement> mBody;
@ -56,6 +55,24 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
addChild(4, mEndElementContainer); addChild(4, mEndElementContainer);
addChild(5, mEndNamespaceList); addChild(5, mEndNamespaceList);
} }
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> 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(){ void linkStringReferences(){
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){ for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
startNamespace.linkStringReferences(); startNamespace.linkStringReferences();
@ -212,8 +229,18 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
public void addElement(ResXmlElement element){ public void addElement(ResXmlElement element){
mBody.add(element); mBody.add(element);
} }
public void removeElement(ResXmlElement element){ public boolean removeElement(ResXmlElement element){
mBody.remove(element); if(element.getParent()!=null){
// TODO: Find a way to remove properly from StringPool
Set<ResXmlString> removedStrings = element.clearStringReferences();
for(ResXmlString xmlString:removedStrings){
if(xmlString.getReferencedList().size()!=0){
continue;
}
xmlString.set("");
}
}
return mBody.remove(element);
} }
public int countElements(){ public int countElements(){
return mBody.size(); return mBody.size();

View File

@ -17,13 +17,14 @@ package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.array.ResXmlAttributeArray; 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.item.ShortItem;
import com.reandroid.lib.arsc.value.ValueType;
import java.util.Collection; 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 mAttributeStart;
private final ShortItem mAttributeUnitSize; private final ShortItem mAttributeUnitSize;
private final ShortItem mAttributeCount; private final ShortItem mAttributeCount;
@ -52,10 +53,26 @@ public class ResXmlStartElement extends BaseXmlChunk {
@Override @Override
void linkStringReferences(){ void linkStringReferences(){
super.linkStringReferences(); super.linkStringReferences();
ResXmlEndElement end = getResXmlEndElement();
if(end!=null){
end.linkStringReferences();
}
for(ResXmlAttribute attr:listResXmlAttributes()){ for(ResXmlAttribute attr:listResXmlAttributes()){
attr.linkStringReferences(); attr.linkStringReferences();
} }
} }
@Override
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> results=super.clearStringReferences();
ResXmlEndElement end = getResXmlEndElement();
if(end!=null){
results.addAll(end.clearStringReferences());
}
for(ResXmlAttribute attr:listResXmlAttributes()){
results.addAll(attr.clearStringReferences());
}
return results;
}
@Override @Override
protected void onPreRefreshRefresh(){ protected void onPreRefreshRefresh(){
sortAttributes(); sortAttributes();

View File

@ -16,8 +16,11 @@
package com.reandroid.lib.arsc.chunk.xml; package com.reandroid.lib.arsc.chunk.xml;
import com.reandroid.lib.arsc.chunk.ChunkType; import com.reandroid.lib.arsc.chunk.ChunkType;
import com.reandroid.lib.arsc.item.ResXmlString;
public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> { import java.util.Set;
public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
public ResXmlStartNamespace() { public ResXmlStartNamespace() {
super(ChunkType.XML_START_NAMESPACE); super(ChunkType.XML_START_NAMESPACE);
} }
@ -35,4 +38,13 @@ public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
end.linkStringReferences(); end.linkStringReferences();
} }
} }
@Override
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> results=super.clearStringReferences();
ResXmlEndNamespace end = getEnd();
if(end!=null){
results.addAll(end.clearStringReferences());
}
return results;
}
} }