/*
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2003 The Apache Software Foundation.  All rights 
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:  
 *       "This product includes software developed by the 
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Pluto", and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written 
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */
/* 

 */

package org.apache.pluto.portalImpl.services.config;

import org.apache.pluto.portalImpl.services.Service;
import org.apache.pluto.portalImpl.util.Parameters;

/**
 ** The <CODE>ConfigService</CODE> holds the basic portal
 ** configuration.
 **
 ** @see   Config
 **/

public abstract class ConfigService extends Service
{

    /**
     ** Returns the configuration parameters managed by this service.
     **
     ** @return   the configuration parameters
     **/

    public abstract Parameters getParameters ();


    public String getString (String name)
    {
        return getParameters().getString(name);
    }

    public String getString (String name, String defaultValue)
    {
        return getParameters().getString(name, defaultValue);
    }

    public Integer getInteger (String name)
    {
        return getParameters().getInteger(name);
    }

    public Integer getInteger (String name, Integer defaultValue)
    {
        return getParameters().getInteger(name, defaultValue);
    }

    public int getInteger (String name, int defaultValue)
    {
        return getParameters().getInteger(name, defaultValue);
    }

    public Boolean getBoolean (String name)
    {
        return getParameters().getBoolean(name);
    }

    public Boolean getBoolean (String name, Boolean defaultValue)
    {
        return getParameters().getBoolean(name, defaultValue);
    }

    public boolean getBoolean (String name, boolean defaultValue)
    {
        return getParameters().getBoolean(name, defaultValue);
    }

    public java.util.Iterator keys ()
    {
        return getParameters().keys();
    }

}
