/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.catalina.storeconfig;

import java.util.ArrayList;
import java.util.List;

/**
 * Bean of a StoreDescription
 *
 * <pre>
 *
 *  &lt;Description
 *  tag=&quot;Context&quot;
 *  standard=&quot;true&quot;
 *  default=&quot;true&quot;
 *  externalAllowed=&quot;true&quot;
 *  storeSeparate=&quot;true&quot;
 *  backup=&quot;true&quot;
 *  children=&quot;true&quot;
 *  tagClass=&quot;org.apache.catalina.core.StandardContext&quot;
 *  storeFactoryClass=&quot;org.apache.catalina.storeconfig.StandardContextSF&quot;
 *  storeAppenderClass=&quot;org.apache.catalina.storeconfig.StoreContextAppender&quot;&gt;
 *     &lt;TransientAttribute&gt;available&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;configFile&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;configured&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;displayName&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;distributable&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;domain&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;engineName&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;name&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;publicId&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;replaceWelcomeFiles&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;saveConfig&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;sessionTimeout&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;startupTime&lt;/TransientAttribute&gt;
 *     &lt;TransientAttribute&gt;tldScanTime&lt;/TransientAttribute&gt;
 *  &lt;/Description&gt;
 *
 *
 * </pre>
 */
public class StoreDescription {

    private String id;

    private String tag;

    private String tagClass;

    private boolean standard = false;

    private boolean backup = false;

    private boolean externalAllowed = false;

    private boolean externalOnly = false;

    private boolean myDefault = false;

    private boolean attributes = true;

    private String storeFactoryClass;

    private IStoreFactory storeFactory;

    private String storeWriterClass;

    private boolean children = false;

    private List<String> transientAttributes;

    private List<String> transientChildren;

    private boolean storeSeparate = false;

    /**
     * @return Returns the external.
     */
    public boolean isExternalAllowed() {
        return externalAllowed;
    }

    /**
     * @param external
     *            The external to set.
     */
    public void setExternalAllowed(boolean external) {
        this.externalAllowed = external;
    }

    public boolean isExternalOnly() {
        return externalOnly;
    }

    public void setExternalOnly(boolean external) {
        this.externalOnly = external;
    }

    /**
     * @return Returns the standard.
     */
    public boolean isStandard() {
        return standard;
    }

    /**
     * @param standard
     *            The standard to set.
     */
    public void setStandard(boolean standard) {
        this.standard = standard;
    }

    /**
     * @return Returns the backup.
     */
    public boolean isBackup() {
        return backup;
    }

    /**
     * @param backup
     *            The backup to set.
     */
    public void setBackup(boolean backup) {
        this.backup = backup;
    }

    /**
     * @return Returns the myDefault.
     */
    public boolean isDefault() {
        return myDefault;
    }

    /**
     * @param aDefault
     *            The myDefault to set.
     */
    public void setDefault(boolean aDefault) {
        this.myDefault = aDefault;
    }

    /**
     * @return Returns the storeFactory.
     */
    public String getStoreFactoryClass() {
        return storeFactoryClass;
    }

    /**
     * @param storeFactoryClass
     *            The storeFactory to set.
     */
    public void setStoreFactoryClass(String storeFactoryClass) {
        this.storeFactoryClass = storeFactoryClass;
    }

    /**
     * @return Returns the storeFactory.
     */
    public IStoreFactory getStoreFactory() {
        return storeFactory;
    }

    /**
     * @param storeFactory
     *            The storeFactory to set.
     */
    public void setStoreFactory(IStoreFactory storeFactory) {
        this.storeFactory = storeFactory;
    }

    /**
     * @return Returns the storeWriterClass.
     */
    public String getStoreWriterClass() {
        return storeWriterClass;
    }

    /**
     * @param storeWriterClass
     *            The storeWriterClass to set.
     */
    public void setStoreWriterClass(String storeWriterClass) {
        this.storeWriterClass = storeWriterClass;
    }

    /**
     * @return Returns the tagClass.
     */
    public String getTag() {
        return tag;
    }

    /**
     * @param tag
     *            The tag to set.
     */
    public void setTag(String tag) {
        this.tag = tag;
    }

    /**
     * @return Returns the tagClass.
     */
    public String getTagClass() {
        return tagClass;
    }

    /**
     * @param tagClass
     *            The tagClass to set.
     */
    public void setTagClass(String tagClass) {
        this.tagClass = tagClass;
    }

    /**
     * @return Returns the transientAttributes.
     */
    public List<String> getTransientAttributes() {
        return transientAttributes;
    }

    /**
     * @param transientAttributes
     *            The transientAttributes to set.
     */
    public void setTransientAttributes(List<String> transientAttributes) {
        this.transientAttributes = transientAttributes;
    }

    public void addTransientAttribute(String attribute) {
        if (transientAttributes == null)
            transientAttributes = new ArrayList<>();
        transientAttributes.add(attribute);
    }

    public void removeTransientAttribute(String attribute) {
        if (transientAttributes != null)
            transientAttributes.remove(attribute);
    }

    /**
     * @return Returns the transientChildren.
     */
    public List<String> getTransientChildren() {
        return transientChildren;
    }

    /**
     * @param transientChildren
     *            The transientChildren to set.
     */
    public void setTransientChildren(List<String> transientChildren) {
        this.transientChildren = transientChildren;
    }

    public void addTransientChild(String classname) {
        if (transientChildren == null)
            transientChildren = new ArrayList<>();
        transientChildren.add(classname);
    }

    public void removeTransientChild(String classname) {
        if (transientChildren != null)
            transientChildren.remove(classname);
    }

    /**
     * is child transient, please don't save this.
     *
     * @param classname
     * @return is classname attribute?
     */
    public boolean isTransientChild(String classname) {
        if (transientChildren != null)
            return transientChildren.contains(classname);
        return false;
    }

    /**
     * is attribute transient, please don't save this.
     *
     * @param attribute
     * @return is transient attribute?
     */
    public boolean isTransientAttribute(String attribute) {
        if (transientAttributes != null)
            return transientAttributes.contains(attribute);
        return false;
    }

    /**
     * Return the real id or TagClass
     *
     * @return Returns the id.
     */
    public String getId() {
        if (id != null)
            return id;
        else
            return getTagClass();
    }

    /**
     * @param id
     *            The id to set.
     */
    public void setId(String id) {
        this.id = id;
    }

    /**
     * @return Returns the attributes.
     */
    public boolean isAttributes() {
        return attributes;
    }

    /**
     * @param attributes
     *            The attributes to set.
     */
    public void setAttributes(boolean attributes) {
        this.attributes = attributes;
    }

    /**
     * @return True if it's a separate store
     */
    public boolean isStoreSeparate() {
        return storeSeparate;
    }

    public void setStoreSeparate(boolean storeSeparate) {
        this.storeSeparate = storeSeparate;
    }

    /**
     * @return Returns the children.
     */
    public boolean isChildren() {
        return children;
    }

    /**
     * @param children
     *            The children to set.
     */
    public void setChildren(boolean children) {
        this.children = children;
    }
}
