All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.reandroid.arsc.chunk.xml.BaseXmlChunk Maven / Gradle / Ivy

/*
 *  Copyright (C) 2022 github.com/REAndroid
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.reandroid.arsc.chunk.xml;

import com.reandroid.arsc.chunk.ChunkType;
import com.reandroid.arsc.base.Block;
import com.reandroid.arsc.chunk.Chunk;
import com.reandroid.arsc.header.XmlNodeHeader;
import com.reandroid.arsc.item.IntegerItem;
import com.reandroid.arsc.item.ResXmlString;
import com.reandroid.arsc.pool.ResXmlStringPool;

import java.util.HashSet;
import java.util.Set;

class BaseXmlChunk extends Chunk {
    private final IntegerItem mNamespaceReference;
    private final IntegerItem mStringReference;

    BaseXmlChunk(ChunkType chunkType, int initialChildesCount) {
        super(new XmlNodeHeader(chunkType), initialChildesCount+2);

        this.mNamespaceReference=new IntegerItem(-1);
        this.mStringReference=new IntegerItem(-1);

        addChild(mNamespaceReference);
        addChild(mStringReference);
    }
    void onRemoved(){
        ResXmlStringPool stringPool = getStringPool();
        if(stringPool==null){
            return;
        }
        stringPool.removeReference(getHeaderBlock().getCommentReference());
        stringPool.removeReference(mNamespaceReference);
        stringPool.removeReference(mStringReference);
    }
    void linkStringReferences(){
        linkStringReference(getHeaderBlock().getCommentReference());
        linkStringReference(mNamespaceReference);
        linkStringReference(mStringReference);
    }
    private void linkStringReference(IntegerItem item){
        ResXmlString xmlString = getResXmlString(item.get());
        if(xmlString!=null){
            xmlString.addReferenceIfAbsent(item);
        }
    }
    void unLinkStringReference(IntegerItem item){
        ResXmlString xmlString = getResXmlString(item.get());
        if(xmlString!=null){
            xmlString.removeReference(item);
        }
    }
    public void setLineNumber(int val){
        getHeaderBlock().getLineNumber().set(val);
    }
    public int getLineNumber(){
        return getHeaderBlock().getLineNumber().get();
    }
    public void setCommentReference(int val){
        if(val == getCommentReference()){
            return;
        }
        IntegerItem comment=getHeaderBlock().getCommentReference();
        unLinkStringReference(comment);
        getHeaderBlock().getCommentReference().set(val);
        linkStringReference(comment);
    }
    public int getCommentReference(){
        return getHeaderBlock().getCommentReference().get();
    }
    void setNamespaceReference(int val){
        if(val == getNamespaceReference()){
            return;
        }
        unLinkStringReference(mNamespaceReference);
        mNamespaceReference.set(val);
        linkStringReference(mNamespaceReference);
    }
    int getNamespaceReference(){
        return mNamespaceReference.get();
    }
    void setStringReference(int val){
        if(val == getStringReference()){
            return;
        }
        unLinkStringReference(mStringReference);
        mStringReference.set(val);
        linkStringReference(mStringReference);
    }
    int getStringReference(){
        return mStringReference.get();
    }
    ResXmlString setString(String str){
        ResXmlStringPool pool = getStringPool();
        if(pool==null){
            return null;
        }
        ResXmlString xmlString = pool.getOrCreate(str);
        setStringReference(xmlString.getIndex());
        return xmlString;
    }
    ResXmlStringPool getStringPool(){
        Block parent=getParent();
        while (parent!=null){
            if(parent instanceof ResXmlDocument){
                return ((ResXmlDocument)parent).getStringPool();
            }
            if(parent instanceof ResXmlElement){
                return ((ResXmlElement)parent).getStringPool();
            }
            parent=parent.getParent();
        }
        return null;
    }
    ResXmlString getResXmlString(int ref){
        if(ref<0){
            return null;
        }
        ResXmlStringPool stringPool=getStringPool();
        if(stringPool!=null){
            return stringPool.get(ref);
        }
        return null;
    }
    ResXmlString getOrCreateResXmlString(String str){
        ResXmlStringPool stringPool=getStringPool();
        if(stringPool!=null){
            return stringPool.getOrCreate(str);
        }
        return null;
    }
    String getString(int ref){
        ResXmlString xmlString=getResXmlString(ref);
        if(xmlString!=null){
            return xmlString.get();
        }
        return null;
    }
    ResXmlString getOrCreateString(String str){
        ResXmlStringPool stringPool=getStringPool();
        if(stringPool==null){
            return null;
        }
        return stringPool.getOrCreate(str);
    }

    public String getName(){
        return getString(getStringReference());
    }
    public String getUri(){
        return getString(getNamespaceReference());
    }
    public String getComment(){
        return getString(getCommentReference());
    }
    public void setComment(String comment){
        if(comment==null||comment.length()==0){
            setCommentReference(-1);
        }else {
            String old=getComment();
            if(comment.equals(old)){
                return;
            }
            ResXmlString xmlString = getOrCreateResXmlString(comment);
            setCommentReference(xmlString.getIndex());
        }
    }
    public ResXmlElement getParentResXmlElement(){
        return getParent(ResXmlElement.class);
    }
    @Override
    protected void onChunkRefreshed() {

    }
    @Override
    public String toString(){
        ChunkType chunkType=getHeaderBlock().getChunkType();
        if(chunkType==null){
            return super.toString();
        }
        StringBuilder builder=new StringBuilder();
        builder.append(chunkType.toString());
        builder.append(": line=");
        builder.append(getLineNumber());
        builder.append(" {");
        builder.append(getName());
        builder.append("}");
        return builder.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy