/*
 * Copyright 2005 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.descriptors.services.castor;

import junit.framework.TestCase;
import junit.framework.Assert;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.IOException;

import org.apache.pluto.descriptors.servlet.WebAppDD;

/**
 *
 */
public class WebAppDescriptorServiceImplTest extends TestCase {

    private StringBuffer xmlBegin = new StringBuffer();
    private StringBuffer xmlEnd = new StringBuffer();

    private StringBuffer icon = new StringBuffer();
    private StringBuffer misc = new StringBuffer();
    private StringBuffer ctxParams = new StringBuffer();
    private StringBuffer sessionConfig = new StringBuffer();
    private StringBuffer filters = new StringBuffer();
    private StringBuffer listeners = new StringBuffer();
    private StringBuffer servlets = new StringBuffer();
    private StringBuffer filterMappings = new StringBuffer();
    private StringBuffer servletMappings = new StringBuffer();
    private StringBuffer mimeMappings = new StringBuffer();
    private StringBuffer welcomeFiles = new StringBuffer();
    private StringBuffer errorPage = new StringBuffer();
    private StringBuffer taglib = new StringBuffer();
    private StringBuffer resourceRef = new StringBuffer();
    private StringBuffer securityConstraint = new StringBuffer();
    private StringBuffer loginConfig = new StringBuffer();
    private StringBuffer securityRole = new StringBuffer();
    private StringBuffer envEntry = new StringBuffer();
    private StringBuffer ejbRef = new StringBuffer();

    WebAppDescriptorServiceImpl impl = new WebAppDescriptorServiceImpl();

    public void setUp() {
        xmlBegin.append("" +
                "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n" +
                "<web-app xmlns=\"http://java.sun.com/xml/ns/j2ee\"\n" +
                "    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
                "    xsi:schemaLocation=\"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd\"\n" +
                "    version=\"2.4\">\n" );
        icon.append("" +
                "  <icon>\n" +
                "      <large-icon>/icon/large.gif</large-icon>\n" +
                "      <small-icon>/icon/small.gif</small-icon>\n" +
                "  </icon>\n" );
        misc.append(""+
                "  <display-name>Test Web XML</display-name>\n" +
                "  <description>This is a test web.xml file.</description>\n" +
                "  <distributable/>\n" );
        ctxParams.append(""+
                "  <context-param>\n" +
                "      <description>Test Parameter 1</description>\n" +
                "      <param-name>TestParam1</param-name>\n" +
                "      <param-value>TestParam1Value</param-value>\n" +
                "  </context-param>\n" +
                "  <context-param>\n" +
                "      <description>Test Parameter 2</description>\n" +
                "      <param-name>TestParam2</param-name>\n" +
                "      <param-value>TestParam2Value</param-value>\n" +
                "  </context-param>\n" );
        filters.append(""+
                "  <filter>\n" +
                "      <icon>\n" +
                "          <large-icon>/icon/large.gif</large-icon>\n" +
                "          <small-icon>/icon/small.gif</small-icon>\n" +
                "      </icon>\n" +
                "      <description>Test Description</description>\n" +
                "      <display-name>TestName</display-name>\n" +
                "      <filter-class>org.apache.pluto.test.TestMe</filter-class>\n" +
                "      <filter-name>test</filter-name>\n" +
                "      <init-param>\n" +
                "          <param-name>Test</param-name>\n" +
                "          <param-value>true</param-value>\n" +
                "      </init-param>\n" +
                "      <init-param>\n" +
                "          <param-name>Test2</param-name>\n" +
                "          <param-value>true</param-value>\n" +
                "      </init-param>\n" +
                "  </filter>\n" );
        listeners.append("" +
                "  <listener>\n" +
                "      <listener-class>org.apache.pluto.test.TestListener</listener-class>\n" +
                "  </listener>\n" +
                "  <listener>\n" +
                "      <listener-class>org.apache.pluto.test.AnotherListener</listener-class>\n" +
                "  </listener>\n" );
        servlets.append(""+
                "  <servlet>\n" +
                "      <servlet-name>default</servlet-name>\n" +
                "      <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>\n" +
                "      <init-param>\n" +
                "          <param-name>debug</param-name>\n" +
                "          <param-value>0</param-value>\n" +
                "      </init-param>\n" +
                "      <init-param>\n" +
                "          <param-name>listings</param-name>\n" +
                "          <param-value>true</param-value>\n" +
                "      </init-param>\n" +
                "      <load-on-startup>1</load-on-startup>\n" +
                "  </servlet>\n" +
                "  <servlet>\n" +
                "      <servlet-name>jsp</servlet-name>\n" +
                "      <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>\n" +
                "      <init-param>\n" +
                "          <param-name>fork</param-name>\n" +
                "          <param-value>false</param-value>\n" +
                "      </init-param>\n" +
                "      <init-param>\n" +
                "          <param-name>xpoweredBy</param-name>\n" +
                "          <param-value>false</param-value>\n" +
                "      </init-param>\n" +
                "      <load-on-startup>3</load-on-startup>\n" +
                "      <security-role-ref>\n" +
                "        <role-name>plutoTestRole</role-name>\n" +
                "        <role-link>tomcat</role-link>\n" +
                "      </security-role-ref>\n" +
                "  </servlet>\n" );
        filterMappings.append(""+
                "  <filter-mapping>\n" +
                "      <filter-name>test</filter-name>\n" +
                "      <url-pattern>/test/*</url-pattern>\n" +
                "      <url-pattern>/some/*</url-pattern>\n" +
                "      <dispatcher>INCLUDE</dispatcher>\n" +
                "      <dispatcher>FORWARD</dispatcher>\n" +
                "  </filter-mapping>\n" +
                "  <filter-mapping>\n" +
                "    <filter-name>test</filter-name>\n" +
                "    <servlet-name>jsp</servlet-name>\n" +
                "    <dispatcher>INCLUDE</dispatcher>\n" +
                "  </filter-mapping>\n" );
        servletMappings.append(""+
                "    <servlet-mapping>\n" +
                "        <servlet-name>default</servlet-name>\n" +
                "        <url-pattern>/</url-pattern>\n" +
                "    </servlet-mapping>\n" +
                "    <servlet-mapping>\n" +
                "        <servlet-name>jsp</servlet-name>\n" +
                "        <url-pattern>*.jsp</url-pattern>\n" +
                "    </servlet-mapping>\n" +
                "    <servlet-mapping>\n" +
                "        <servlet-name>jsp</servlet-name>\n" +
                "        <url-pattern>*.jspx</url-pattern>\n" +
                "    </servlet-mapping>\n" );
        sessionConfig.append(""+
                "    <session-config>\n" +
                "        <session-timeout>30</session-timeout>\n" +
                "    </session-config>\n" );
        mimeMappings.append("" +
                "    <mime-mapping>\n" +
                "        <extension>abs</extension>\n" +
                "        <mime-type>audio/x-mpeg</mime-type>\n" +
                "    </mime-mapping>\n" +
                "    <mime-mapping>\n" +
                "        <extension>ai</extension>\n" +
                "        <mime-type>application/postscript</mime-type>\n" +
                "    </mime-mapping>\n" );
        welcomeFiles.append(""+
                "    <welcome-file-list>\n" +
                "        <welcome-file>index.html</welcome-file>\n" +
                "        <welcome-file>index.htm</welcome-file>\n" +
                "        <welcome-file>index.jsp</welcome-file>\n" +
                "    </welcome-file-list>\n" );
        this.errorPage.append(""+
                "    <error-page>\n" +
                "        <error-code>400</error-code>\n" +
                "        <location>/400.html</location>\n" +
                "    </error-page>\n" +
                "    <error-page>\n" +
                "        <exception-type>java.io.IOException</exception-type>\n" +
                "        <location>/error/io.html</location>\n" +
                "    </error-page>\n" );
        this.taglib.append(""+
                "    <taglib>\n" +
                "        <taglib-location>/WEB-INF/test.tld</taglib-location>\n" +
                "        <taglib-uri>test</taglib-uri>\n" +
                "    </taglib>\n" );
        this.resourceRef.append(""+
                "    <resource-ref>\n" +
                "        <description>Test Resource</description>\n" +
                "        <res-auth>CONTIANER</res-auth>\n" +
                "        <res-ref-name>RefName</res-ref-name>\n" +
                "        <res-sharing-scope>Scope</res-sharing-scope>\n" +
                "        <res-type>java.lang.String</res-type>\n" +
                "    </resource-ref>\n" +
                "    <resource-ref>\n" +
                "        <description>Test Resource</description>\n" +
                "        <res-auth>CONTIANER</res-auth>\n" +
                "        <res-ref-name>RefName2</res-ref-name>\n" +
                "        <res-sharing-scope>Scope</res-sharing-scope>\n" +
                "        <res-type>java.lang.String</res-type>\n" +
                "    </resource-ref>\n" );
        this.securityConstraint.append(""+
                "    <security-constraint>\n" +
                "        <auth-constraint>\n" +
                "            <description>Test Role</description>\n" +
                "            <role-name>TestRole</role-name>\n" +
                "        </auth-constraint>\n" +
                "        <display-name>Test Constraint</display-name>\n" +
                "        <user-data-constraint>\n" +
                "            <description>CONFIDENTIAL</description>\n" +
                "            <transport-guarantee>CONFIDENTIAL</transport-guarantee>\n" +
                "        </user-data-constraint>\n" +
                "        <web-resource-collection>\n" +
                "            <description>TestCollection</description>\n" +
                "            <http-method>GET</http-method>\n" +
                "            <http-method>POST</http-method>\n" +
                "            <url-pattern>/test/*</url-pattern>\n" +
                "            <url-pattern>/secure/*</url-pattern>\n" +
                "            <web-resource-name>secured</web-resource-name>\n" +
                "        </web-resource-collection>\n" +
                "    </security-constraint>\n" );
        this.loginConfig.append(""+
                "    <login-config>\n" +
                "        <auth-method>FORM</auth-method>\n" +
                "        <form-login-config>\n" +
                "            <form-login-page>/login.jsp</form-login-page>\n" +
                "            <form-error-page>/login.jsp?error=true</form-error-page>\n" +
                "        </form-login-config>\n" +
                "        <realm-name>BASIC</realm-name>\n" +
                "    </login-config>\n" );
         this.securityRole.append(""+
                "    <security-role>\n" +
                "        <description>A Test Role</description>\n" +
                "        <role-name>TestRole</role-name>\n" +
                "    </security-role>\n" +
                "    <security-role>\n" +
                "        <description>Another Role</description>\n" +
                "        <role-name>AnotherRole</role-name>\n" +
                "    </security-role>\n" );
        this.envEntry.append(""+
                "    <env-entry>\n" +
                "        <description>Test Environment Entry</description>\n" +
                "        <env-entry-name>Test</env-entry-name>\n" +
                "        <env-entry-type>java.lang.String</env-entry-type>\n" +
                "        <env-entry-value>TestValue</env-entry-value>\n" +
                "    </env-entry>\n" +
                "    <env-entry>\n" +
                "        <description>Another Environment Entry</description>\n" +
                "        <env-entry-name>Another</env-entry-name>\n" +
                "        <env-entry-type>java.lang.String</env-entry-type>\n" +
                "        <env-entry-value>AnotherValue</env-entry-value>\n" +
                "    </env-entry>\n" );
        this.ejbRef.append(""+
                "    <ejb-ref>\n" +
                "        <description>Test EJB</description>\n" +
                "        <ejb-link>test</ejb-link>\n" +
                "        <home>testHomeInterface</home>\n" +
                "        <remote>testRemoteInterface</remote>\n" +
                "        <ejb-ref-name>test</ejb-ref-name>\n" +
                "        <ejb-ref-type>org.apache.pluto.test.ejb.TestEJB</ejb-ref-type>\n" +
                "    </ejb-ref>\n" );
        this.xmlEnd.append("</web-app>");

    }

    public void tearDown() {

    }


    public void testReadFullDescriptor()
    throws IOException {
        StringBuffer xml = new StringBuffer()
        .append(xmlBegin).append(icon).append(misc)
        .append(ctxParams).append(sessionConfig).append(filters)
        .append(listeners).append(servlets).append(filterMappings)
        .append(servletMappings).append(mimeMappings).append(welcomeFiles)
        .append(errorPage).append(taglib).append(resourceRef)
        .append(securityConstraint).append(loginConfig)
        .append(securityRole).append(envEntry).append(ejbRef)
        .append(xmlEnd);

        InputStream in = new ByteArrayInputStream(xml.toString().getBytes());

        WebAppDD dd = impl.read(in);

        Assert.assertEquals("DisplayName not as expected", "Test Web XML", dd.getDisplayName());
        Assert.assertEquals("Description does not match", "This is a test web.xml file.", dd.getDescription());
        //Assert.assertTrue("Distributable not set", dd.isDistributable());

        assertEquals("Context Parameters not as expected", 2, dd.getContextParams().size());
        assertEquals("Filters not as expected", 1, dd.getFilters().size());
        assertEquals("Filter Mappings not as expected", 2, dd.getFilterMappings().size());
        assertEquals("Listeners not as expected", 2, dd.getListeners().size());
        assertEquals("Servlets not as expected", 2, dd.getServlets().size());
        assertEquals("Servlet Mappings not as expected.", 3, dd.getServletMappings().size());
    }

    public void testReadNullDescriptor() throws IOException {
        Assert.assertNull("Null descriptor did not return null", impl.read(null));
    }

    public void testReadPartialDescriptor() {

    }

    public void testReadOutOfOrderDescriptor() {

    }

}
