/*
 * Copyright 2003,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.internal.impl;

import javax.portlet.PortletMode;
import javax.portlet.WindowState;
import javax.servlet.ServletContext;

import org.apache.pluto.PortletWindow;
import org.apache.pluto.PortletContainerRuntimeException;
import org.apache.pluto.PortletWindowID;
import org.apache.pluto.util.StringManager;
import org.apache.pluto.internal.InternalPortletWindow;
import org.apache.pluto.internal.PortletEntity;

/**
 * Implementation of <code>InternalPortletWindow</code> interface.
 * 
 * @author <a href="mailto:ddewolf@apache.org">David H. DeWolf</a>
 * @author <a href="mailto:zheng@apache.org">ZHENG Zhong</a>
 */
public class PortletWindowImpl implements InternalPortletWindow {

    private static final StringManager EXCEPTIONS = StringManager.getManager(
    		PortletWindowImpl.class.getPackage().getName());
    
    
    // Private Member Variables ------------------------------------------------
    
    /** The underlying portlet window instance. */
    private PortletWindow portletWindow = null;
    
    /** The servlet context of the portlet. */
    private ServletContext servletContext = null;
    
    /** The portlet entity associated with the portlet window. */
    private PortletEntity entity = null;
    
    
    // Constructor -------------------------------------------------------------
    
    /**
     * Constructs an internal portlet window that wraps a portlet window.
     * An internal portlet window instance is created everytime when the portlet
     * container's <code>doRender()</code> or <code>doAction()</code> method is
     * invoked.
     * 
     * @param context  the servlet context from which this window is
     *        being invoked.
     * @param portletWindow  the underlying portlet window instance.
     */
    public PortletWindowImpl(ServletContext context,
                                 PortletWindow portletWindow) {
        this.servletContext = context.getContext(
        		portletWindow.getContextPath());
        if (servletContext == null) {
            throw new PortletContainerRuntimeException(EXCEPTIONS.getString(
            		"error.config.context.null",
                    portletWindow.getPortletName(),
                    portletWindow.getContextPath()));
        }
        this.portletWindow = portletWindow;
    }
    
    
    // PortletWindow Impl ------------------------------------------------------
    
    public String getContextPath() {
        return portletWindow.getContextPath();
    }

    public String getPortletName() {
        return portletWindow.getPortletName();
    }

    public WindowState getWindowState() {
        return portletWindow.getWindowState();
    }

    public PortletMode getPortletMode() {
        return portletWindow.getPortletMode();
    }
    
    public PortletWindowID getId() {
        return portletWindow.getId();
    }
    
    
    // InternalPortletWindow Impl ----------------------------------------------
    
    public ServletContext getServletContext() {
        return servletContext;
    }

    public PortletEntity getPortletEntity() {
        if (entity == null) {
            entity = new PortletEntityImpl(servletContext, this);
        }
        return entity;
    }

}
