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.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<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(){
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);

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.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<ResXmlAttribute>, JSONConvert<JSONObject> {
private final IntegerItem mNamespaceReference;
private final IntegerItem mNameReference;
@ -53,6 +53,27 @@ public class ResXmlAttribute extends FixedBlockContainer
addChild(5, mValueTypeByte);
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(){
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());
}

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.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<JSONObject> {
public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JSONObject> {
private final BlockList<ResXmlStartNamespace> mStartNamespaceList;
private final SingleBlockContainer<ResXmlStartElement> mStartElementContainer;
private final BlockList<ResXmlElement> mBody;
@ -56,6 +55,24 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
addChild(4, mEndElementContainer);
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(){
for(ResXmlStartNamespace startNamespace:getStartNamespaceList()){
startNamespace.linkStringReferences();
@ -212,8 +229,18 @@ public class ResXmlElement extends FixedBlockContainer implements JSONConvert<JS
public void addElement(ResXmlElement element){
mBody.add(element);
}
public void removeElement(ResXmlElement element){
mBody.remove(element);
public boolean removeElement(ResXmlElement 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(){
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.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<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
protected void onPreRefreshRefresh(){
sortAttributes();

View File

@ -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<ResXmlEndNamespace> {
import java.util.Set;
public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
public ResXmlStartNamespace() {
super(ChunkType.XML_START_NAMESPACE);
}
@ -35,4 +38,13 @@ public class ResXmlStartNamespace extends ResXmlNamespace<ResXmlEndNamespace> {
end.linkStringReferences();
}
}
@Override
Set<ResXmlString> clearStringReferences(){
Set<ResXmlString> results=super.clearStringReferences();
ResXmlEndNamespace end = getEnd();
if(end!=null){
results.addAll(end.clearStringReferences());
}
return results;
}
}