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

import org.apache.catalina.Context;
import org.apache.catalina.Host;
import org.apache.catalina.Server;
import org.apache.catalina.Service;

/**
 * @author Peter Rossbach 
 *  
 */
public interface IStoreConfig {

    /**
     * Get Configuration Registry
     * 
     * @return aRegistry that handle the store operations
     */
    StoreRegistry getRegistry();

    /**
     * Set Configuration Registry
     * 
     * @param aRegistry
     *            aregistry that handle the store operations
     */
    void setRegistry(StoreRegistry aRegistry);

    /**
     * Store the current StoreFactory Server.
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void storeConfig() throws Exception;

    /**
     * Store the specified Server properties.
     * 
     * @param aServer
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void store(Server aServer) throws Exception;

    /**
     * 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
     */
    void store(PrintWriter aWriter, int indent, Server aServer);

    /**
     * Store the specified Service properties.
     * 
     * @param aWriter
     *            PrintWriter to which we are storing
     * @param indent
     *            Number of spaces to indent this element
     * @param aService
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void store(PrintWriter aWriter, int indent, Service aService);

    /**
     * Store the specified Host properties.
     * 
     * @param aWriter
     *            PrintWriter to which we are storing
     * @param indent
     *            Number of spaces to indent this element
     * @param aHost
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void store(PrintWriter aWriter, int indent, Host aHost);

    /**
     * Store the specified Context properties.
     * 
     * @param aContext
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void store(Context aContext);

    /**
     * Store the specified Context properties.
     * 
     * @param aWriter
     *            PrintWriter to which we are storing
     * @param indent
     *            Number of spaces to indent this element
     * @param aContext
     *            Object to be stored
     * 
     * @exception Exception
     *                if an exception occurs while storing
     */
    void store(PrintWriter aWriter, int indent, Context aContext);
}