/*
 * Copyright 2004-2005 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 java.io.PrintWriter;

import org.apache.catalina.Lifecycle;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Service;
import org.apache.catalina.core.StandardServer;
import org.apache.catalina.deploy.NamingResources;
import org.apache.catalina.mbeans.ServerLifecycleListener;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * Store server.xml Server element and childs (
 * Listener,GlobalNamingResource,Service)
 * 
 * @author Peter Rossbach
 */
public class StandardServerSF extends StoreFactoryBase {

    private static Log log = LogFactory.getLog(StandardServerSF.class);

    /**
     * Store the specified Server properties.
     * 
     * @param aWriter
     *            PrintWriter to which we are storing
     * @param indent
     *            Number of spaces to indent this element
     * @param aServer
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     * @see org.apache.catalina.storeconfig.IStoreFactory#store(java.io.PrintWriter,
     *      int, java.lang.Object)
     */
    public void store(PrintWriter aWriter, int indent, Object aServer)
            throws Exception {
        storeXMLHead(aWriter);
        super.store(aWriter, indent, aServer);
    }

    /**
     * Store Childs from this StandardServer descrition
     * 
     * @param aWriter
     * @param indent
     * @param aObject
     * @param parentDesc
     * @throws Exception
     */
    public void storeChilds(PrintWriter aWriter, int indent, Object aObject,
            StoreDescription parentDesc) throws Exception {
        if (aObject instanceof StandardServer) {
            StandardServer server = (StandardServer) aObject;
            // Store nested <Listener> elements
            if (server instanceof Lifecycle) {
                LifecycleListener listeners[] = ((Lifecycle) server)
                        .findLifecycleListeners();
                storeElementArray(aWriter, indent, listeners);
                LifecycleListener listener = null;
                for (int i = 0; listener == null && i < listeners.length; i++)
                    if (listeners[i] instanceof ServerLifecycleListener)
                        listener = listeners[i];
                if (listener != null) {
                    StoreDescription elementDesc = getRegistry()
                            .findDescription(
                                    StandardServer.class.getName()
                                            + ".[ServerLifecycleListener]");
                    if (elementDesc != null) {
                        elementDesc.getStoreFactory().store(aWriter, indent,
                                listener);
                    }
                }
            }
            // Store nested <GlobalNamingResources> element
            NamingResources globalNamingResources = server
                    .getGlobalNamingResources();
            StoreDescription elementDesc = getRegistry().findDescription(
                    NamingResources.class.getName()
                            + ".[GlobalNamingResources]");
            if (elementDesc != null) {
                elementDesc.getStoreFactory().store(aWriter, indent,
                        globalNamingResources);
            }
            // Store nested <Service> elements
            Service services[] = server.findServices();
            storeElementArray(aWriter, indent, services);
        }
    }

}
