/*
 * Copyright 1999-2001,2004 The Apache Software Foundation.
 * 
 * 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 org.apache.catalina.storeconfig;

import org.apache.catalina.cluster.CatalinaCluster;
import org.apache.catalina.cluster.ClusterDeployer;
import org.apache.catalina.cluster.ClusterReceiver;
import org.apache.catalina.cluster.ClusterSender;
import org.apache.catalina.cluster.MembershipService;
import org.apache.catalina.cluster.MessageListener;
import org.apache.catalina.deploy.ContextEjb;
import org.apache.catalina.deploy.ContextEnvironment;
import org.apache.catalina.deploy.ContextLocalEjb;
import org.apache.catalina.deploy.ContextResource;
import org.apache.catalina.deploy.ContextResourceEnvRef;
import org.apache.catalina.deploy.ContextResourceLink;
import org.apache.catalina.deploy.NamingResources;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Peter Rossbach
 *  
 */
public class DescriptorHelper {
    private static Log log = LogFactory.getLog(DescriptorHelper.class);

    public static StoreDescription registerDescriptor(
            StoreDescription parentdesc, StoreRegistry registry, String tag,
            Class aClass) {
        return registerDescriptor(parentdesc, registry, aClass.getName(), tag,
                aClass.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
    }

    public static StoreDescription registerDescriptor(
            StoreDescription parentdesc, StoreRegistry registry, String tag,
            String aClassToken, String factoryClass, boolean fstandard,
            boolean fdefault) {
        return registerDescriptor(parentdesc, registry, aClassToken, tag,
                aClassToken,
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
    }

    /**
     * Generate a descriptor and register this to another parent descriptor.
     * 
     * @param parentdesc
     * @param registry
     * @param id
     * @param tag
     * @param aClassToken
     * @param factoryClass
     * @param fstandard
     * @param fdefault
     * @return
     */
    public static StoreDescription registerDescriptor(
            StoreDescription parentdesc, StoreRegistry registry, String id,
            String tag, String aClassToken, String factoryClass,
            boolean fstandard, boolean fdefault) {
        // add Listener
        StoreDescription descChild = new StoreDescription();
        descChild.setId(id);
        descChild.setTag(tag);
        descChild.setTagClass(aClassToken);
        descChild.setStandard(fstandard);
        descChild.setDefault(fdefault);
        descChild.setStoreFactoryClass(factoryClass);
        Object factory = null;
        try {
            Class aFactoryClass = Class.forName(factoryClass);
            factory = aFactoryClass.newInstance();
        } catch (Exception e) {
            log.error(e);
        }
        if (factory != null) {
            ((IStoreFactory) factory).setRegistry(registry);
            descChild.setStoreFactory((IStoreFactory) factory);
        }
        if (parentdesc != null)
            parentdesc.setChilds(true);
        registry.registerDescription(descChild);
        return descChild;
    }

    /**
     * register all Registery descriptors on naming support to context!
     * 
     * @param parent
     * @param registry
     * @return
     * @throws Exception
     */
    public static StoreDescription registerNamingDescriptor(
            StoreDescription parent, StoreRegistry registry) throws Exception {

        StoreDescription nameingDesc = DescriptorHelper.registerDescriptor(
                parent, registry, NamingResources.class.getName(),
                "NamingResources", NamingResources.class.getName(),
                "org.apache.catalina.storeconfig.NamingResourcesSF", true,
                false);
        registerDescriptor(nameingDesc, registry, ContextEjb.class.getName(),
                "EJB", ContextEjb.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", true, false);
        registerDescriptor(nameingDesc, registry, ContextEnvironment.class
                .getName(), "Environment", ContextEnvironment.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", true, false);
        registerDescriptor(nameingDesc, registry, ContextLocalEjb.class
                .getName(), "LocalEjb", ContextLocalEjb.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", true, false);
        registerDescriptor(nameingDesc, registry, ContextResource.class
                .getName(), "Resource", ContextResource.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", true, false);
        registerDescriptor(nameingDesc, registry, ContextResourceLink.class
                .getName(), "ResourceLink",
                ContextResourceLink.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", true, false);
        registerDescriptor(nameingDesc, registry, ContextResourceEnvRef.class
                .getName(), "ResourceEnvRef", ContextResourceEnvRef.class
                .getName(), "org.apache.catalina.storeconfig.StoreFactoryBase",
                true, false);
        return nameingDesc;
    }

    /**
     * register all cluster and subelement descriptors to registery
     * 
     * @param parent
     * @param registry
     * @return
     * @throws Exception
     */
    public static StoreDescription registerClusterDescriptor(
            StoreDescription parent, StoreRegistry registry) throws Exception {

        StoreDescription clusterDesc = DescriptorHelper.registerDescriptor(
                parent, registry, CatalinaCluster.class.getName(), "Cluster",
                CatalinaCluster.class.getName(),
                "org.apache.catalina.storeconfig.CatalinaClusterSF", false,
                false);
        registerDescriptor(clusterDesc, registry,
                ClusterSender.class.getName(), "Sender", ClusterSender.class
                        .getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
        registerDescriptor(clusterDesc, registry, ClusterReceiver.class
                .getName(), "Receiver", ClusterReceiver.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
        registerDescriptor(clusterDesc, registry, MembershipService.class
                .getName(), "Membership", MembershipService.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
        registerDescriptor(clusterDesc, registry, ClusterDeployer.class
                .getName(), "Deployer", ClusterDeployer.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
        registerDescriptor(clusterDesc, registry, MessageListener.class
                .getName(), "ClusterListener", MessageListener.class.getName(),
                "org.apache.catalina.storeconfig.StoreFactoryBase", false,
                false);
        return clusterDesc;
    }

}