/*
 * 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.testsuite.test;

import java.io.IOException;

import org.apache.pluto.testsuite.TestResult;

import javax.portlet.PortletSession;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * @author <a href="mailto:ddewolf@apache.org">David H. DeWolf</a>
 * @author <a href="mailto:zheng@apache.org">ZHENG Zhong</a>
 */
public class ExternalAppScopedAttributeTest extends AbstractReflectivePortletTest {

    public static final String INT_KEY = "org.apache.pluto.testsuite.INTERNALLY_SET_APP_SCOPED_SESSION_TEST_KEY";
    public static final String EXT_KEY = "org.apache.pluto.testsuite.EXTERNALLY_SET_APP_SCOPED_SESSION_TEST_KEY";
    public static final String VALUE = "Should be visible to all Portlets and Web Resources.";
    
    
    // Test Methods ------------------------------------------------------------
    
    protected TestResult checkSetAppScopedAttributeHereSeenElsewhere(
    		PortletSession session) {
        TestResult result = new TestResult();
        result.setDescription("Ensure application scoped attributes set here "
        		+ "in portlet session can be seen elsewhere.");
        
        session.setAttribute(INT_KEY, VALUE, PortletSession.APPLICATION_SCOPE);
        result.setReturnCode(TestResult.WARNING);
        result.setResultMessage("Click the provided link to validate test.");
        return result;
    }

    protected TestResult checkSetAppScopedAttributeElsewhereSeenHere(
    		PortletSession session) {
        TestResult result = new TestResult();
        result.setDescription("Ensure application scoped attributes set "
        		+ "elsewhere in portlet session can be seen here.");
        
        Object value = session.getAttribute(EXT_KEY,
                                            PortletSession.APPLICATION_SCOPE);
        if (VALUE.equals(value)) {
        	result.setReturnCode(TestResult.PASSED);
        } else {
        	result.setReturnCode(TestResult.WARNING);
        	result.setResultMessage("This test will not pass until you have "
        			+ "opened the external resource using the link provided below.");
        }
        return result;
    }
    
    
    // Nested Servlet Class ----------------------------------------------------
    
    /**
     * The companion servlet that cooperates with this portlet test.
     */
    public static class CompanionServlet extends HttpServlet {

        public void doGet(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException {
            HttpSession session = request.getSession();
            String value = (String) session.getAttribute(INT_KEY);
            if (ExternalAppScopedAttributeTest.VALUE.equals(value)) {
            	request.setAttribute("passed", new Boolean(true));
                session.setAttribute(EXT_KEY, VALUE);
            }
            
            RequestDispatcher dispatcher = request.getRequestDispatcher(
            		"/jsp/ExternalAppScopedAttributeTest_companion.jsp");
            dispatcher.forward(request, response);
        }
        
    }
    
}
