/*
 * 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 org.apache.pluto.testsuite.TestResult;

import javax.portlet.*;
import java.util.*;

/**
 * Tests basic attribute retrieval and storage functions within
 * the portlet request, session, and context objects.
 *
 * @author <a href="mailto:ddewolf@apache.org">David H. DeWolf</a>
 * @author <a href="mailto:zheng@apache.org">ZHENG Zhong</a>
 */
public class ResourceBundleTest extends AbstractReflectivePortletTest {
	
	// Static Constant Definitions ---------------------------------------------
	
	/** Key for portlet title defined in portlet.xml/init-param. */
    private static final String TITLE_KEY = "javax.portlet.title";
    
	/** Key for portlet short title defined in portlet.xml/init-param. */
    private static final String SHORT_TITLE_KEY = "javax.portlet.short-title";
    
	/** Key for portlet keywords defined in portlet.xml/init-param. */
    private static final String KEYWORDS_KEY = "javax.portlet.keywords";
    
    /**
     * Parameter name for if resource bundle is declared in
     * <code>testsuite-config/init-param</code>.
     */
    private static final String BUNDLE_DECLARED_PARAM = "resource-bundle";
    
    /**
     * Parameter name for portlet title in
     * <code>testsuite-config/init-param</code>.
     */
    private static final String TITLE_PARAM = "title";
    
    /**
     * Parameter name for portlet short title in
     * <code>testsuite-config/init-param</code>.
     */
    private static final String SHORT_TITLE_PARAM = "short-title";
    
    /**
     * Parameter name for portlet keywords in
     * <code>testsuite-config/init-param</code>.
     */
    private static final String KEYWORDS_PARAM = "keywords";
	
	
    // Test Methods ------------------------------------------------------------
    
    protected TestResult checkResourceBundleExists(PortletConfig config,
                                                   PortletRequest request) {
        TestResult result = new TestResult();
        result.setDescription("Ensure the resource bundle is not null.");
        
        ResourceBundle bundle = config.getResourceBundle(request.getLocale());
        if (bundle != null) {
        	result.setReturnCode(TestResult.PASSED);
        } else {
        	result.setReturnCode(TestResult.FAILED);
            result.setResultMessage("Unable to retrieve resource bundle "
            		+ "for locale: " + request.getLocale());
        }
        return result;
    }
    
    protected TestResult checkGetNames(PortletConfig config,
                                       PortletRequest request) {
        TestResult result = new TestResult();
        result.setDescription("Retrieve the property names and ensure that "
        		+ "the required keys are present.");

        List requiredKeys = new ArrayList();
        requiredKeys.add(TITLE_KEY);
        requiredKeys.add(SHORT_TITLE_KEY);
        requiredKeys.add(KEYWORDS_KEY);
        
        ResourceBundle bundle = config.getResourceBundle(request.getLocale());
        if (bundle == null) {
        	result.setReturnCode(TestResult.WARNING);
        	result.setResultMessage("A function upon which this test depends "
        			+ "failed to execute as expected. "
        			+ "Check the other test results in this test suite.");
        	return result;
        }
        
        for (Enumeration en = bundle.getKeys(); en.hasMoreElements(); ) {
            String key = (String) en.nextElement();
            requiredKeys.remove(key);
        }
        
        if (requiredKeys.isEmpty()) {
        	result.setReturnCode(TestResult.PASSED);
        } else {
        	result.setReturnCode(TestResult.FAILED);
            StringBuffer buffer = new StringBuffer();
            for (Iterator it = requiredKeys.iterator(); it.hasNext(); ) {
            	buffer.append(it.next()).append(", ");
            }
            result.setResultMessage("Required keys [" + buffer.toString()
            		+ "] are missing in the resource bundle.");
        }
        return result;
    }

    protected TestResult checkGetGermanBundle(PortletConfig config,
                                              PortletRequest request) {
        return doGenericLocaleRequiredFields(config,
                                             request,
                                             Locale.GERMAN);
    }

    protected TestResult checkGetEnglishBundle(PortletConfig config,
                                               PortletRequest request) {
        return doGenericLocaleRequiredFields(config,
                                             request,
                                             Locale.ENGLISH);
    }

    /*
    protected TestResult checkGetDfltBundle(PortletConfig config,
                                            PortletRequest req) {
        return doGenericLocaleRequiredFields(config, req, new Locale("dflt"));
    }
    */
    
    
    // Private Methods ---------------------------------------------------------
    
    private TestResult doGenericLocaleRequiredFields(PortletConfig config,
                                                     PortletRequest request,
                                                     Locale locale) {
        TestResult result = new TestResult();
        result.setDescription("Retrieve the title and ensure it's set properly "
        		+ "under local " + locale);
        
        // Retrieve title, short title and keywords from portlet resource bundle.
        ResourceBundle bundle = config.getResourceBundle(locale);
        if (bundle == null) {
        	result.setReturnCode(TestResult.WARNING);
        	result.setResultMessage("A function upon which this test depends "
        			+ "failed to execute as expected. "
        			+ "Check the other test results in this test suite.");
        	return result;
        }
        String title = bundle.getString(TITLE_KEY);
        String shortTitle = bundle.getString(SHORT_TITLE_KEY);
        String keywords = bundle.getString(KEYWORDS_KEY);
        
        // Retrieve expected title, short title and keywords from test config.
        String suffix = isBundleDeclared() ? ("_" + locale.getLanguage()) : "";
        Map initParams = getInitParameters();
        String expectedTitle = (String) initParams.get(
        		TITLE_PARAM + suffix);
        String expectedShortTitle = (String) initParams.get(
        		SHORT_TITLE_PARAM + suffix);
        String expectedKeywords = (String) initParams.get(
        		KEYWORDS_PARAM + suffix);
        
        // Assert that values retrieved from resource bundler are expected.
        boolean inconsistent = false;
        StringBuffer buffer = new StringBuffer();
        buffer.append("The following information is not correct: ");
        if (title == null || expectedTitle == null
        		|| !title.trim().equals(expectedTitle.trim())) {
        	inconsistent = true;
            buffer.append("Inconsistent title: '")
            		.append(title).append("' != '")
            		.append(expectedTitle).append("'; ");
        }
        if (shortTitle == null || expectedShortTitle == null
        		|| !shortTitle.trim().equals(expectedShortTitle.trim())) {
        	inconsistent = true;
            buffer.append("Inconsistent short title: '")
            		.append(shortTitle).append("' != '")
            		.append(expectedShortTitle).append("'; ");
        }
        if (keywords == null || expectedKeywords == null
        		|| !keywords.trim().equals(expectedKeywords.trim())) {
        	inconsistent = true;
            buffer.append("Inconsistent keywords: '")
            		.append(keywords).append("' != '")
            		.append(expectedKeywords).append("'; ");
        }
        
        if (!inconsistent) {
        	result.setReturnCode(TestResult.PASSED);
        } else {
        	result.setReturnCode(TestResult.FAILED);
            result.setResultMessage(buffer.toString());
        }
        return result;
    }
    
    private boolean isBundleDeclared() {
        String bundleDeclared = (String) getInitParameters().get(
        		BUNDLE_DECLARED_PARAM);
        if (Boolean.TRUE.toString().equalsIgnoreCase(bundleDeclared)) {
            return true;
        } else {
        	return false;
        }
    }





}
