%@ page contentType="text/html; charset=utf-8"
         import="java.io.InputStream,
                 java.io.IOException,
                 javax.xml.parsers.SAXParser,
                 java.lang.reflect.*,
                 javax.xml.parsers.SAXParserFactory"
   session="false" %>
<%
/*
 * Copyright 2002,2004,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.
 */
%>
<%!
    /*
     * Happiness tests for axis. These look at the classpath and warn if things
     * are missing. Normally addng this much code in a JSP page is mad
     * but here we want to validate JSP compilation too, and have a drop-in
     * page for easy re-use
     * @author Steve 'configuration problems' Loughran
     * @author dims
     * @author Brian Ewins
     */
    /**
     * test for a class existing
     * @param classname
     * @return class iff present
     */
    Class classExists(String classname) {
        try {
            return Class.forName(classname);
        } catch (ClassNotFoundException e) {
            return null;
        }
    }
    /**
     * test for resource on the classpath
     * @param resource
     * @return true iff present
     */
    boolean resourceExists(String resource) {
        boolean found;
        InputStream instream=this.getClass().getResourceAsStream(resource);
        found=instream!=null;
        if(instream!=null) {
            try {
                instream.close();
            } catch (IOException e) {
            }
        }
        return found;
    }
    /**
     * probe for a class, print an error message is missing
     * @param out stream to print stuff
     * @param category text like "warning" or "error"
     * @param classname class to look for
     * @param jarFile where this class comes from
     * @param errorText extra error text
     * @param homePage where to d/l the library
     * @return the number of missing classes
     * @throws IOException
     */
    int probeClass(JspWriter out,
                   String category,
                   String classname,
                   String jarFile,
                   String description,
                   String errorText,
                   String homePage) throws IOException {
        try {
            Class clazz = classExists(classname);
            if(clazz == null)  {
               String url="";
               if(homePage!=null) {
                  url=getMessage("seeHomepage",homePage,homePage);
               }
               out.write(getMessage("couldNotFound",category,classname,jarFile,errorText,url));
               return 1;
            } else {
               String location = getLocation(out, clazz);
               if(location == null) {
                  out.write("
"+getMessage("foundClass00",description,classname)+"
");
               }
               else {
                  out.write(""+getMessage("foundClass01",description,classname,location)+"
");
               }
               return 0;
            }
        } catch(NoClassDefFoundError ncdfe) {
            String url="";
            if(homePage!=null) {
                url=getMessage("seeHomepage",homePage,homePage);
            }
            out.write(getMessage("couldNotFoundDep",category, classname, errorText, url));
            out.write(getMessage("theRootCause",ncdfe.getMessage(), classname));
            return 1;
        }
    }
    /**
     * get the location of a class
     * @param out
     * @param clazz
     * @return the jar file or path where a class was found
     */
    String getLocation(JspWriter out,
                       Class clazz) {
        try {
            java.net.URL url = clazz.getProtectionDomain().getCodeSource().getLocation();
            String location = url.toString();
            if(location.startsWith("jar")) {
                url = ((java.net.JarURLConnection)url.openConnection()).getJarFileURL();
                location = url.toString();
            }
            if(location.startsWith("file")) {
                java.io.File file = new java.io.File(url.getFile());
                return file.getAbsolutePath();
            } else {
                return url.toString();
            }
        } catch (Throwable t){
        }
        return getMessage("classFoundError");
    }
    /**
     * a class we need if a class is missing
     * @param out stream to print stuff
     * @param classname class to look for
     * @param jarFile where this class comes from
     * @param errorText extra error text
     * @param homePage where to d/l the library
     * @throws IOException when needed
     * @return the number of missing libraries (0 or 1)
     */
    int needClass(JspWriter out,
                   String classname,
                   String jarFile,
                   String description,
                   String errorText,
                   String homePage) throws IOException {
        return probeClass(out,
                ""+getMessage("error")+"",
                classname,
                jarFile,
                description,
                errorText,
                homePage);
    }
    /**
     * print warning message if a class is missing
     * @param out stream to print stuff
     * @param classname class to look for
     * @param jarFile where this class comes from
     * @param errorText extra error text
     * @param homePage where to d/l the library
     * @throws IOException when needed
     * @return the number of missing libraries (0 or 1)
     */
    int wantClass(JspWriter out,
                   String classname,
                   String jarFile,
                   String description,
                   String errorText,
                   String homePage) throws IOException {
        return probeClass(out,
                ""+getMessage("warning")+"",
                classname,
                jarFile,
                description,
                errorText,
                homePage);
    }
    /**
     *  get servlet version string
     *
     */
    public String getServletVersion() {
        ServletContext context=getServletConfig().getServletContext();
        int major = context.getMajorVersion();
        int minor = context.getMinorVersion();
        return Integer.toString(major) + '.' + Integer.toString(minor);
    }
    /**
     * what parser are we using.
     * @return the classname of the parser
     */
    private String getParserName() {
        SAXParser saxParser = getSAXParser();
        if (saxParser == null) {
            return getMessage("couldNotCreateParser");
        }
        // check to what is in the classname
        String saxParserName = saxParser.getClass().getName();
        return saxParserName;
    }
    /**
     * Create a JAXP SAXParser
     * @return parser or null for trouble
     */
    private SAXParser getSAXParser() {
        SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
        if (saxParserFactory == null) {
            return null;
        }
        SAXParser saxParser = null;
        try {
            saxParser = saxParserFactory.newSAXParser();
        } catch (Exception e) {
        }
        return saxParser;
    }
    /**
     * get the location of the parser
     * @return path or null for trouble in tracking it down
     */
    private String getParserLocation(JspWriter out) {
        SAXParser saxParser = getSAXParser();
        if (saxParser == null) {
            return null;
        }
        String location = getLocation(out,saxParser.getClass());
        return location;
    }
    /**
     * Check if class implements specified interface.
     * @param Class clazz
     * @param String interface name
     * @return boolean
     */
    private boolean implementsInterface(Class clazz, String interfaceName) {
        if (clazz == null) {
            return false;
        }
        Class[] interfaces = clazz.getInterfaces();
        if (interfaces.length != 0) {
            for (int i = 0; i < interfaces.length; i++) {
                if (interfaces[i].getName().equals(interfaceName)) {
                    return true;
                }
            }
        }
        return false;
    }
    %>
<%@ include file="i18nLib.jsp" %>
<%
    // initialize a private HttpServletRequest
    setRequest(request);
    // set a resouce base
    setResouceBase("i18n");
%>
<%= getMessage("pageTitle") %>
<%
    out.print(""+ getMessage("pageTitle") +"
");
    out.print(""+ getMessage("pageRole") +"
");
%>
<%= getLocaleChoice() %>
<%
    out.print(""+ getMessage("neededComponents") +"
");
%>
<%
    int needed=0,wanted=0;
    /**
     * the essentials, without these Axis is not going to work
     */
    // need to check if the available version of SAAJ API meets requirements
    String className = "javax.xml.soap.SOAPPart";
    String interfaceName = "org.w3c.dom.Document";
    Class clazz = classExists(className);
    if (clazz == null || implementsInterface(clazz, interfaceName)) {
        needed = needClass(out, "javax.xml.soap.SOAPMessage",
        	"saaj.jar",
                "SAAJ API",
                getMessage("criticalErrorMessage"),
                "http://ws.apache.org/axis/");
    } else {
        String location = getLocation(out, clazz);
        out.print(getMessage("invalidSAAJ",location));
        out.print(getMessage("criticalErrorMessage"));
        out.print(getMessage("seeHomepage","http://ws.apache.org/axis/java/install.html",getMessage("axisInstallation")));
        out.print("
");
    }
    needed+=needClass(out, "javax.xml.rpc.Service",
            "jaxrpc.jar",
            "JAX-RPC API",
            getMessage("criticalErrorMessage"),
            "http://ws.apache.org/axis/");
    needed+=needClass(out, "org.apache.axis.transport.http.AxisServlet",
            "axis.jar",
            "Apache-Axis",
            getMessage("criticalErrorMessage"),
            "http://ws.apache.org/axis/");
    needed+=needClass(out, "org.apache.commons.discovery.Resource",
            "commons-discovery.jar",
            "Jakarta-Commons Discovery",
            getMessage("criticalErrorMessage"),
            "http://jakarta.apache.org/commons/discovery/");
    needed+=needClass(out, "org.apache.commons.logging.Log",
            "commons-logging.jar",
            "Jakarta-Commons Logging",
            getMessage("criticalErrorMessage"),
            "http://jakarta.apache.org/commons/logging/");
    needed+=needClass(out, "org.apache.log4j.Layout",
            "log4j-1.2.8.jar",
            "Log4j",
            getMessage("uncertainErrorMessage"),
            "http://jakarta.apache.org/log4j");
    //should we search for a javax.wsdl file here, to hint that it needs
    //to go into an approved directory? because we dont seem to need to do that.
    needed+=needClass(out, "com.ibm.wsdl.factory.WSDLFactoryImpl",
            "wsdl4j.jar",
            "IBM's WSDL4Java",
            getMessage("criticalErrorMessage"),
            null);
    needed+=needClass(out, "javax.xml.parsers.SAXParserFactory",
            "xerces.jar",
            "JAXP implementation",
            getMessage("criticalErrorMessage"),
            "http://xml.apache.org/xerces-j/");
    needed+=needClass(out,"javax.activation.DataHandler",
            "activation.jar",
            "Activation API",
            getMessage("criticalErrorMessage"),
            "http://java.sun.com/products/javabeans/glasgow/jaf.html");
%>
<%
    out.print(""+ getMessage("optionalComponents") +"
");
%>
<%
    /*
     * now the stuff we can live without
     */
    wanted+=wantClass(out,"javax.mail.internet.MimeMessage",
            "mail.jar",
            "Mail API",
            getMessage("attachmentsError"),
            "http://java.sun.com/products/javamail/");
    wanted+=wantClass(out,"org.apache.xml.security.Init",
            "xmlsec.jar",
            "XML Security API",
            getMessage("xmlSecurityError"),
            "http://xml.apache.org/security/");
    wanted += wantClass(out, "javax.net.ssl.SSLSocketFactory",
            "jsse.jar or java1.4+ runtime",
            "Java Secure Socket Extension",
            getMessage("httpsError"),
            "http://java.sun.com/products/jsse/");
    /*
     * resources on the classpath path
     */
    /* add more libraries here */
%>
<%
    out.write("");
    //is everythng we need here
    if(needed==0) {
       //yes, be happy
        out.write(getMessage("happyResult00"));
    } else {
        //no, be very unhappy
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        out.write(getMessage("unhappyResult00",Integer.toString(needed)));
    }
    //now look at wanted stuff
    if(wanted>0) {
        out.write(getMessage("unhappyResult01",Integer.toString(wanted)));
    } else {
        out.write(getMessage("happyResult01"));
    }
    out.write("
");
%>
<%
    //hint if anything is missing
    if(needed>0 || wanted>0 ) {
        out.write(getMessage("hintString"));
    }
    out.write(getMessage("noteString"));
%>
<%= getMessage("apsExamining") %>
    <%
        String servletVersion=getServletVersion();
        String xmlParser=getParserName();
        String xmlParserLocation = getParserLocation(out);
    %>
    
        | Servlet version | <%= servletVersion %> | 
        | XML Parser | <%= xmlParser %> | 
        | XML ParserLocation | <%= xmlParserLocation %> | 
    
<% if(xmlParser.indexOf("crimson")>=0) { %>
    <%= getMessage("recommendedParser") %>
    
<%    } %>
    <%= getMessage("sysExamining") %>
<%
    /**
     * Dump the system properties
     */
    java.util.Enumeration e=null;
    try {
        e= System.getProperties().propertyNames();
    } catch (SecurityException se) {
    }
    if(e!=null) {
        out.write("
");
        for (;e.hasMoreElements();) {
            String key = (String) e.nextElement();
            out.write(key + "=" + System.getProperty(key)+"\n");
        }
        out.write("");
    } else {
        out.write(getMessage("sysPropError"));
    }
%>
    
    <%= getMessage("apsPlatform") %>:
    <%= getServletConfig().getServletContext().getServerInfo() %>