/* * JBoss, Home of Professional Open Source * Copyright 2007, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2005-2006, * @author JBoss Inc. */ package com.jboss.transaction.wstf.test; import com.arjuna.webservices.util.ClassLoaderHelper; import com.jboss.transaction.wstf.interop.MessageLogging; import junit.framework.TestResult; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Templates; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Date; /** * The test servlet. * @author kevin */ public class TestServlet extends HttpServlet { /** * The servlet serial version UID. */ private static final long serialVersionUID = 6764303043215036856L ; /** * The validation templates. */ private Templates validationTemplates ; /** * Initialise the servlet. * @param config The servlet configuration. */ public void init(final ServletConfig config) throws ServletException { super.init(config) ; final InputStream is = ClassLoaderHelper.getResourceAsStream(getClass(), "processor.xsl") ; if (is == null) { throw new ServletException("Cannot locate transformation stylesheet") ; } final TransformerFactory factory = TransformerFactory.newInstance() ; try { validationTemplates = factory.newTemplates(new StreamSource(is)) ; } catch (final TransformerConfigurationException tce) { throw new ServletException("Error creating transformation template!", tce) ; } } /** * Execute the test * @param request The HTTP servlet request. * @param response The HTTP servlet response. */ protected void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { final String serviceURI = request.getParameter(TestConstants.PARAM_SERVICE_URI) ; final String test = request.getParameter(TestConstants.PARAM_TEST) ; final String testTimeoutValue = request.getParameter(TestConstants.PARAM_TEST_TIMEOUT) ; // final String asyncTestValue = request.getParameter(TestConstants.PARAM_ASYNC_TEST) ; String resultPageAddress = request.getParameter(TestConstants.PARAM_RESULT_PAGE); if (resultPageAddress == null || resultPageAddress.length() == 0) { resultPageAddress = TestConstants.DEFAULT_RESULT_PAGE_ADDRESS; } final int serviceURILength = (serviceURI == null ? 0 : serviceURI.length()) ; final int testLength = (test == null ? 0 : test.length()) ; long testTimeout = 0 ; boolean testTimeoutValid = false ; if ((testTimeoutValue != null) && (testTimeoutValue.length() > 0)) { try { testTimeout = Long.parseLong(testTimeoutValue) ; testTimeoutValid = true ; } catch (final NumberFormatException nfe) {} // ignore } // final boolean asyncTest = (asyncTestValue != null) ; final boolean asyncTest = true ; if ((serviceURILength == 0) || (testLength == 0) || !testTimeoutValid) { final RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/invalidParameters.html") ; dispatcher.forward(request, response) ; return ; } final HttpSession session = request.getSession() ; final String id = session.getId() ; final int logCount = getLogCount(session) ; final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss") ; final String date = format.format(new Date()) ; final String logName = date + "-" + id + "-" + logCount ; session.setAttribute(TestConstants.ATTRIBUTE_TEST_RESULT, null) ; session.setAttribute(TestConstants.ATTRIBUTE_TEST_VALIDATION, null) ; session.setAttribute(TestConstants.ATTRIBUTE_LOG_NAME, null) ; final String threadLog ; try { final TestResult result = TestRunner.execute(serviceURI, testTimeout, asyncTest, test) ; if (result != null) { session.setAttribute(TestConstants.ATTRIBUTE_TEST_RESULT, result) ; threadLog = MessageLogging.getThreadLog() ; try { TestLogController.writeLog(logName, threadLog) ; session.setAttribute(TestConstants.ATTRIBUTE_LOG_NAME, logName) ; } catch (final IOException ioe) { log("Unexpected IOException writing message log", ioe) ; } } else { threadLog = null ; } } finally { MessageLogging.clearThreadLog() ; } if ((threadLog != null) && (threadLog.length() > 0)) { try { final String testValidation = transform(threadLog) ; session.setAttribute(TestConstants.ATTRIBUTE_TEST_VALIDATION, testValidation) ; } catch (final Throwable th) { log("Unexpected throwable transforming message log", th) ; } } final RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(resultPageAddress) ; dispatcher.forward(request, response) ; } /** * Get the log count from the session, incrementing afterwards. * @param session The current HTTP session. * @return The log count. */ private int getLogCount(final HttpSession session) { final Object logCountObject = session.getAttribute(TestConstants.ATTRIBUTE_LOG_COUNT) ; final int logCount = (logCountObject == null ? 1 : ((Integer)logCountObject).intValue() + 1) ; session.setAttribute(TestConstants.ATTRIBUTE_LOG_COUNT, new Integer(logCount)) ; return logCount ; } /** * Transform the specified message log. * @param messageLog The specified message log. * @return The transformed result. * @throws TransformerConfigurationException For transformer configuration errors. * @throws TransformerException The transformation errors. */ private String transform(final String messageLog) throws TransformerConfigurationException, TransformerException { final Source source = new StreamSource(new StringReader(messageLog)) ; final Transformer transformer = validationTemplates.newTransformer() ; final StringWriter writer = new StringWriter() ; final Result result = new StreamResult(writer) ; transformer.transform(source, result) ; return writer.toString() ; } }