/*
 * Copyright 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.pluto.driver.services.portal;

import java.util.Collection;
import java.util.Map;

/**
 * @author <a href="mailto:ddewolf@apache.org">David H. DeWolf</a>
 * @author <a href="mailto:zheng@apache.org">ZHENG Zhong</a>
 */
public class PortletApplicationConfig {

    private String contextPath;
    private Map portlets;

    public PortletApplicationConfig() {
        portlets = new java.util.HashMap();
    }

    public String getContextPath() {
        return contextPath;
    }

    public void setContextPath(String contextPath) {
        this.contextPath = contextPath;
    }

    public Collection getPortlets() {
        return portlets.values();
    }

    public PortletWindowConfig getPortlet(String portletName) {
        return (PortletWindowConfig) portlets.get(portletName);
    }

    public void addPortlet(PortletWindowConfig portlet) {
        portlet.setContextPath(getContextPath());
        portlets.put(portlet.getPortletName(), portlet);
    }

}
