/*
* Copyright 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.
*
* $Header:$
*/
package org.apache.beehive.netui.tools.testrecorder.server;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import org.apache.beehive.netui.tools.testrecorder.shared.Logger;
import org.apache.beehive.netui.tools.testrecorder.shared.Constants;
import org.apache.beehive.netui.tools.testrecorder.shared.Reporter;
import org.apache.beehive.netui.tools.testrecorder.shared.RecordSessionBean;
import org.apache.beehive.netui.tools.testrecorder.shared.RequestData;
import org.apache.beehive.netui.tools.testrecorder.shared.SessionXMLException;
import org.apache.beehive.netui.tools.testrecorder.shared.xmlbeans.XMLHelper;
import org.apache.beehive.netui.tools.testrecorder.shared.config.TestDefinition;
import org.apache.beehive.netui.tools.testrecorder.shared.config.ConfigException;
import org.apache.beehive.netui.tools.testrecorder.shared.config.Category;
import org.apache.beehive.netui.tools.testrecorder.shared.config.WebappConfig;
import org.apache.beehive.netui.tools.testrecorder.server.state.PlaybackSession;
import org.apache.beehive.netui.tools.testrecorder.server.state.RecordSession;
import org.apache.beehive.netui.tools.testrecorder.server.state.State;
import org.apache.beehive.netui.tools.testrecorder.server.state.SessionFailedException;
public class TestRecorderServlet extends HttpServlet {
private static final Logger log = Logger.getInstance( TestRecorderServlet.class );
public TestRecorderServlet() {
}
public void init() {
if ( log.isInfoEnabled() ) {
log.warn( "initializing ..." );
}
}
public void destroy() {
if ( log.isInfoEnabled() ) {
log.warn( "destroying ..." );
}
super.destroy();
}
public void doPost( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
doGet( request, response );
}
public void doGet( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String mode = null;
try {
mode = request.getParameter( Constants.MODE );
if ( mode == null ) {
// fail
String msg = "mode( " + mode + " ) may not be null.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
else if ( mode.equalsIgnoreCase( Constants.RECORD ) ) {
doRecord( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.PLAYBACK ) ) {
doPlayback( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.DPY_DIFF ) ) {
doDiff( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.DPY_DETAILS ) ) {
doDetails( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.DPY_LINK ) ) {
doLink( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.ADMIN ) ) {
doAdmin( request, response );
}
else if ( mode.equalsIgnoreCase( Constants.XML_MODE ) ) {
doXml( request, response );
}
else {
// fail
String msg = "unknown mode( " + mode + " ).";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
}
catch ( Exception ex ) {
String msg = "ERROR: encountered exception handling test recorder control request, mode( " + mode +
", exception( " + ex.getMessage() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, ex );
}
}
public void doRecord( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException, ConfigException {
String cmd = request.getParameter( Constants.CMD );
String testName = getTestName( request );
String testUser = request.getParameter( Constants.TEST_USER );
String description = request.getParameter( Constants.DESCRIPTION );
boolean overwrite = Boolean.valueOf( request.getParameter( Constants.OVERWRITE ) ).booleanValue();
if ( log.isInfoEnabled() ) {
log.debug( "record cmd( " + cmd + " )" );
log.debug( "testName( " + testName + " )" );
}
if ( log.isDebugEnabled() ) {
log.debug( "testUser( " + testUser + " )" );
log.debug( "overwrite( " + overwrite + " )" );
log.debug( "description( " + description + " )" );
}
if ( cmd == null ) {
// fail
String msg = "ERROR: unable to handle record request, '" + Constants.CMD + "' may not be null.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
if ( cmd.equalsIgnoreCase( Constants.START ) ) {
doRecordStart( testName, request, response, overwrite, testUser, description );
}
else if ( cmd.equalsIgnoreCase( Constants.STOP ) ) {
doRecordStop( request, response );
}
else {
// fail
String msg = "ERROR: unable to handle record request: '" + Constants.CMD + "'( " + cmd +
" ) is not recognized.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
}
private void doRecordStop( HttpServletRequest request, HttpServletResponse response ) throws IOException,
ServletException {
TestRecorderFilter filter = TestRecorderFilter.instance();
RecordSession session = filter.getState().getRecordingSession();
String msg = "ERROR: failed stopping recording session";
if ( log.isDebugEnabled() ) {
log.debug( "STOPPING: recording session( " + session + " )" );
}
try {
// this may take some time, this waits for recording threads to finish
session = filter.getState().recordStop();
if ( session == null ) {
// fail, not currently recording
msg = "ERROR: no recording session is currently started";
if ( log.isWarnEnabled() ) {
log.warn( msg );
}
}
else {
request.setAttribute( Constants.RECORD_SESSION_ATTRIBUTE, session );
msg = "Recording session( " + session.getSessionName() + " ) stopped";
if ( log.isInfoEnabled() ) {
log.info( msg );
}
}
forward( request, response, msg, Constants.RECORD_PAGE, false );
}
catch ( Exception ex ) {
msg = "ERROR: failed while stopping recording";
request.setAttribute( Constants.RECORD_SESSION_ATTRIBUTE, session );
forward( request, response, msg, Constants.RECORD_PAGE, true, ex );
}
if ( log.isDebugEnabled() ) {
log.debug( "STOPPED: recording session( " + session + " )" );
}
}
private void doRecordStart( String testName, HttpServletRequest request, HttpServletResponse response,
boolean overwrite, String testUser, String description ) throws IOException, ServletException {
TestDefinition test = getTest( testName );
if ( test == null ) {
test = new TestDefinition( testName, description, TestRecorderFilter.instance().getWebapp(), null );
}
if ( test.getWebapp() != TestRecorderFilter.instance().getWebapp() ) {
String msg = "ERROR: unable to start recording, the webapp of the test( " +
test.getWebapp().getName() + " ) is not the same as this webapp( " +
TestRecorderFilter.instance().getWebapp() + " )";
forward( request, response, msg, Constants.RECORD_PAGE, true );
return;
}
// may throw IOException or SecurityException
RecordSession session = null;
try {
session = getRecordSession( test, overwrite, testUser, description );
if ( description != null ) {
test.setDescription( description );
}
TestRecorderFilter.instance().getTestDefinitions().add( test );
}
catch ( Exception ex ) {
String msg = "ERROR: unable to start recording, unable to obtain session, exception( " +
ex.getMessage() + " )";
forward( request, response, msg, Constants.RECORD_PAGE, true, ex );
return;
}
if ( log.isDebugEnabled() ) {
log.debug( "attempting to start recording session( " + session + " )" );
}
TestRecorderFilter filter = TestRecorderFilter.instance();
boolean start = false;
try {
// may throw IOException
start = filter.getState().recordStart( session );
}
catch ( Exception ex ) {
String msg = "ERROR: failed to start recording, exception( " + ex.getMessage() + " )";
forward( request, response, msg, Constants.RECORD_PAGE, true, ex );
return;
}
if ( log.isInfoEnabled() ) {
log.info( "start( " + start + " )" );
}
if ( start ) {
String msg = "recording session( " + session.getSessionName() + " ) started.";
request.setAttribute( Constants.RECORD_SESSION_ATTRIBUTE, session );
if ( log.isInfoEnabled() ) {
log.info( msg );
}
forward( request, response, msg, Constants.RECORD_PAGE, false );
}
else {
String msg = "ERROR: recording session( " +
session.getSessionName() + " ) already started.";
request.setAttribute( Constants.RECORD_SESSION_ATTRIBUTE, filter.getState().getRecordingSession() );
forward( request, response, msg, Constants.RECORD_PAGE, true );
}
}
public void doPlayback( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException, ConfigException {
String cmd = request.getParameter( Constants.CMD );
if ( log.isInfoEnabled() ) {
log.info( "playback cmd( " + cmd + " )" );
}
// any request forwards from here should skip the filter.
request.setAttribute( Constants.FILTER_SKIP_PARAM, Boolean.TRUE );
if ( cmd != null ) {
if ( cmd.equalsIgnoreCase( Constants.START ) ) {
doPlaybackStart( request, response );
}
if ( cmd.equalsIgnoreCase( Constants.STOP ) ) {
doPlaybackStop( request, response );
}
}
else {
// fail
String msg = "ERROR: playback '" + Constants.CMD + "'( " + cmd + " ) is not recognized.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
forward( request, response, Constants.RECORD_PAGE );
}
private void doPlaybackStop( HttpServletRequest request,
HttpServletResponse response ) throws IOException {
String testId = request.getParameter( Constants.TEST_ID_HEADER );
if ( log.isInfoEnabled() ) {
log.info( "playback stop testId( " + testId + " )" );
}
TestRecorderFilter filter = TestRecorderFilter.instance();
PlaybackSession session = null;
try {
// this may take some time, this waits for recording threads to finish
// may throw IOException
session = filter.getState().playbackStop( testId );
}
catch ( Exception ex ) {
String msg = "ERROR: unable to stop playback session for testId( " + testId + " ), exception( " +
ex.getMessage() + " )";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
response.setHeader( Constants.OUTCOME_HEADER, Constants.ERROR );
log.error( msg, ex );
if ( ex instanceof IOException ) {
throw (IOException) ex;
}
else if ( ex instanceof RuntimeException ) {
throw (RuntimeException) ex;
}
else {
throw new RuntimeException( msg, ex );
}
}
if ( log.isInfoEnabled() ) {
log.info( "STOP: playback session( " + session + " )" );
}
if ( session == null ) {
// fail, not currently doing playback
String msg = "ERROR: no playback session exists for testId( " + testId + " )";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
// set response headers for the client.
response.setHeader( Constants.OUTCOME_HEADER, Constants.ERROR );
response.setHeader( Constants.MSG_ATTRIBUTE, msg );
log.error( msg );
}
else {
// gen playback summary
// set outcome to stop or fail via resp header
// return playback summary as response body.
String outcome = session.getStatus();
String msg = "playback session( " + session.getSessionName() + " ) stopped with status( " + outcome +
" ).";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
request.setAttribute( Constants.PLAYBACK_SESSION_ATTRIBUTE, session );
if ( log.isInfoEnabled() ) {
log.info( msg );
}
// set response headers for the client.
response.setHeader( Constants.OUTCOME_HEADER, outcome );
response.setHeader( Constants.MSG_ATTRIBUTE, msg );
response.setHeader( Constants.RESULTS_FILE_HEADER, session.getPlaybackFile().getAbsolutePath() );
File diffFile = session.getDiffFile();
if ( diffFile != null ) {
response.setHeader( Constants.RESULTS_DIFF_HEADER, diffFile.getAbsolutePath() );
}
}
}
private void doPlaybackStart( HttpServletRequest request, HttpServletResponse response )
throws IOException, ConfigException {
String testName = getTestName( request );
TestDefinition test = getTest( testName );
if ( test == null ) {
throw new ConfigException(
"ERROR: playback start failed, unable to find a test for test name( " + testName + " )" );
}
if ( log.isInfoEnabled() ) {
log.info( "playback start test( " + test.getName() + " )" );
}
PlaybackSession session = null;
try {
session = getPlaybackSession( test );
}
catch ( Exception ex ) {
String msg = "ERROR: unable to start playback, unable to obtain session, exception( " +
ex.getMessage() + " )";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
log.error( msg, ex );
System.err.println( "\nPLAYBACK ERROR:\n" + msg );
if ( ex instanceof IOException ) {
throw (IOException) ex;
}
else if ( ex instanceof RuntimeException ) {
throw (RuntimeException) ex;
}
else {
throw new RuntimeException( msg, ex );
}
}
TestRecorderFilter filter = TestRecorderFilter.instance();
boolean start = false;
try {
// may throw IOException
start = filter.getState().playbackStart( session );
}
catch ( Exception ex ) {
String msg = "ERROR: failed to start playback session( " + session + " ), exception( " +
ex.getMessage() + " )";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
log.error( msg, ex );
System.err.println( "\nPLAYBACK ERROR:\n" + msg );
if ( ex instanceof IOException ) {
throw (IOException) ex;
}
else if ( ex instanceof RuntimeException ) {
throw (RuntimeException) ex;
}
else {
throw new RuntimeException( msg, ex );
}
}
if ( log.isInfoEnabled() ) {
log.info( "playback start( " + start + " )" );
}
if ( start ) {
String msg = "playback session( " +
session.getSessionName() + " ) started.";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
request.setAttribute( Constants.PLAYBACK_SESSION_ATTRIBUTE, session );
if ( log.isInfoEnabled() ) {
log.info( msg );
}
// set response headers for the client.
response.setHeader( Constants.OUTCOME_HEADER,
Constants.PASS );
response.setHeader( Constants.TEST_ID_HEADER,
session.getStringUID() );
response.setHeader( Constants.RECORD_FILE_HEADER,
session.getRecordFile().getAbsolutePath() );
}
else {
// fail
String msg = "ERROR: failed to start playback session( " +
session.getSessionName() + " )";
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
request.setAttribute( Constants.PLAYBACK_SESSION_ATTRIBUTE, session );
log.error( msg );
// set response headers for the client.
response.setHeader( Constants.OUTCOME_HEADER,
Constants.FAIL );
response.setHeader( Constants.MSG_ATTRIBUTE, msg );
}
}
public void doDiff( HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException, ConfigException {
// TODO use test name constant here, similar to the rest of the commands
String sessionName = request.getParameter( Constants.FILE );
TestDefinition test = getTest( sessionName );
if ( test == null ) {
String msg = "ERROR: unable to display diff output, no test was found for name( " + sessionName +
" )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
try {
Writer wrtr = response.getWriter();
File diffFile = getDiffFile( test );
if ( !diffFile.exists() ) {
String msg = "ERROR: unable to display diff output, no file was found for test( " +
test.getName() + " ), file( " + diffFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
// output an html page
wrtr.write( "<html><head><title>Test Diffs of " );
wrtr.write( test.getName() );
wrtr.write( "</title></head>\n" );
wrtr.write( "<body>\n" );
wrtr.write( "<h4>Test Diffs: " );
wrtr.write( test.getName() );
wrtr.write( "</h4>\n" );
wrtr.write( "<pre>" );
wrtr.write( Reporter.genDiffDetails( diffFile ) );
wrtr.write( "</pre>" );
wrtr.write( "</body></html>" );
}
catch ( Exception e ) {
String msg = "ERROR: failed to display diff file, exception( " + e.getMessage() +
" ), test( " + test.getName() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
}
public void doLink( HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException, ConfigException {
String sessionName = request.getParameter( Constants.FILE );
TestDefinition test = getTest( sessionName );
WebappConfig config = TestRecorderFilter.instance().getWebapp();
try {
if ( test == null ) {
String msg = "No test was found for name( " + sessionName + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
File recFile = getRecordSessionFile( test );
if ( !recFile.exists() ) {
String msg = "No file was found for test( " + test.getName() + " ), file( " +
recFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
RecordSessionBean bean = null;
try {
bean = XMLHelper.getRecordSessionBean( recFile );
}
catch ( SessionXMLException e ) {
String msg = "Failed processing file for record session( " + test.getName() + " ), file( " +
recFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
RequestData rd = bean.getRequestData( 0 );
if ( rd == null ) {
String msg = "Unable to find the first request in the test ( " + test.getName() + " ), file( " +
recFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
String host = config.getServer().getHostname();
if ( host.equals( "localhost" ) )
{
host = request.getServerName();
}
response.sendRedirect( rd.getUri( host, config.getServer().getPort() ) );
return;
}
catch ( Exception e ) {
String msg = "ERROR: failed to display test details, exception( " + e.getMessage() +
" ), test( " + test.getName() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
}
public void doDetails( HttpServletRequest request, HttpServletResponse response )
throws IOException, ServletException, ConfigException {
// TODO use test name constant here, similar to the rest of the commands
String sessionName = request.getParameter( Constants.FILE );
TestDefinition test = getTest( sessionName );
try {
if ( test == null ) {
String msg = "No test was found for name( " + sessionName + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
Writer wrtr = response.getWriter();
File recFile = getRecordSessionFile( test );
if ( !recFile.exists() ) {
String msg = "No file was found for test( " + test.getName() + " ), file( " +
recFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
RecordSessionBean bean = null;
try {
bean = XMLHelper.getRecordSessionBean( recFile );
}
catch ( SessionXMLException e ) {
String msg = "Failed processing file for record session( " + test.getName() + " ), file( " +
recFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
// output an html page
wrtr.write( "<html><head><title>Test Details of " );
wrtr.write( test.getName() );
wrtr.write( "</title></head>\n" );
wrtr.write( "<body>\n" );
wrtr.write( "<h3>Test Details: " );
wrtr.write( test.getName() );
wrtr.write( "</h3>\n" );
wrtr.write( Reporter.genDetails( bean ) );
wrtr.write( "</body></html>" );
}
catch ( Exception e ) {
String msg = "ERROR: failed to display test details, exception( " + e.getMessage() +
" ), test( " + test.getName() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
}
private void forward( HttpServletRequest request, HttpServletResponse response, String msg,
String page, boolean error ) throws ServletException, IOException {
forward( request, response, msg, page, error, null );
}
private void forward( HttpServletRequest request, HttpServletResponse response, String msg,
String page, boolean error, Exception ex ) throws ServletException, IOException {
if ( request.getAttribute( Constants.MSG_ATTRIBUTE ) == null ) {
request.setAttribute( Constants.MSG_ATTRIBUTE, msg );
}
if ( error ) {
if ( ex != null ) {
log.error( msg, ex );
}
else {
log.error( msg );
}
}
forward( request, response, page );
}
private void forward( HttpServletRequest request, HttpServletResponse response, String page )
throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher( page );
dispatcher.forward( request, response );
}
public void doAdmin( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException, ConfigException {
String cmd = request.getParameter( Constants.CMD );
if ( log.isInfoEnabled() ) {
log.info( "admin cmd( " + cmd + " )" );
}
// any request forwards from here should skip the filter.
request.setAttribute( Constants.FILTER_SKIP_PARAM, Boolean.TRUE );
if ( cmd != null ) {
if ( cmd.equalsIgnoreCase( Constants.CLEAN ) ) {
doClean( request, response );
return;
}
else if ( cmd.equalsIgnoreCase( Constants.SET_TEST_MODE_FALSE ) ) {
doTestMode( request, response, false );
return;
}
else if ( cmd.equalsIgnoreCase( Constants.SET_TEST_MODE_TRUE ) ) {
doTestMode( request, response, true );
return;
}
else if ( cmd.equalsIgnoreCase( Constants.DISPLAY_REPORT ) ) {
doDisplayReport( request, response );
return;
}
else if ( cmd.equalsIgnoreCase( Constants.DISPLAY_RECORD ) ) {
doDisplayRecord( request, response );
return;
}
else if ( cmd.equalsIgnoreCase( Constants.DISPLAY_PLAYBACK ) ) {
doDisplayPlayback( request, response );
return;
}
}
// fail
String msg = "ERROR: admin '" + Constants.CMD + "'( " + cmd + " ) is not recognized.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
}
private void doClean( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException {
if ( log.isInfoEnabled() ) {
log.info( "clean up test recorder sessions" );
}
TestRecorderFilter filter = TestRecorderFilter.instance();
filter.getState().stopAll();
forward( request, response, Constants.STATUS_PAGE );
}
private void doTestMode( HttpServletRequest request, HttpServletResponse response, boolean value )
throws ServletException, IOException {
if ( log.isInfoEnabled() ) {
log.info( "setting test mode to ( " + value + " )" );
}
TestRecorderFilter filter = TestRecorderFilter.instance();
filter.getState().setTestMode( value );
forward( request, response, Constants.STATUS_PAGE );
}
private void doDisplayRecord( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String testString = request.getParameter( "test" );
TestRecorderFilter filter = TestRecorderFilter.instance();
TestDefinition test = filter.getTestDefinitions().getTest( testString );
File file = null;
try {
if ( test == null ) {
String msg = "No test was found for name( " + testString + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
file = new File( test.getTestFilePath() );
if ( !file.exists() ) {
String msg = "No record file was found for test( " + test.getName() + " ), file( " +
file.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
doFileReport( request, response, test, file, "Record File for '" + test.getName() + "' Test" );
}
catch ( Exception e ) {
String msg = "ERROR: failed to display record file, exception( " + e.getMessage() +
" ), test( " + test.getName() + " ), file( " + file + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
}
private void doDisplayPlayback( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String testString = request.getParameter( "test" );
TestRecorderFilter filter = TestRecorderFilter.instance();
TestDefinition test = filter.getTestDefinitions().getTest( testString );
File file = null;
try {
if ( test == null ) {
String msg = "No test was found for name( " + testString + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
file = new File( test.getResultFilePath() );
if ( !file.exists() ) {
String msg = "No playback file was found for test( " + test.getName() + " ), file( " +
file.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
doFileReport( request, response, test, file, "Playback File for '" + test.getName() + "' Test" );
}
catch ( Exception e ) {
String msg = "ERROR: failed to display playback file, exception( " + e.getMessage() +
" ), test( " + test.getName() + " ), file( " + file + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
}
private void doFileReport( HttpServletRequest request, HttpServletResponse response, TestDefinition test,
File file, String title ) throws ServletException, IOException {
FileReader reader = null;
Writer wrtr = null;
try {
wrtr = response.getWriter();
wrtr.write( "<html><title>" + Reporter.escape( title ) + "</title><body><b>" + title +
"</b><br /><br /><pre>" );
// output an html page
char[] buf = new char[1024];
reader = new FileReader( file );
int size;
while ( true ) {
size = reader.read( buf, 0, 1024 );
if ( size == -1 ) {
break;
}
wrtr.write( Reporter.escape( buf, size ) );
}
}
catch ( Exception e ) {
String msg = "ERROR: failed to display file, exception( " + e.getMessage() +
" ), test( " + test.getName() + " ), file( " + file.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
finally {
if ( wrtr != null ) {
wrtr.write( "</pre></body></html>" );
}
if ( reader != null ) {
reader.close();
}
}
}
private void doDisplayReport( HttpServletRequest request, HttpServletResponse response )
throws ServletException, IOException {
String categoryString = request.getParameter( "category" );
TestRecorderFilter filter = TestRecorderFilter.instance();
Category category = filter.getTestDefinitions().getCategories().getCategory( categoryString );
FileReader reader = null;
try {
if ( category == null ) {
String msg = "No category was found for name( " + categoryString + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
Writer wrtr = response.getWriter();
File reportFile = new File( category.getReportDirPath(), "/html/junit-noframes.html" );
if ( !reportFile.exists() ) {
String msg = "No JUnit report was found for category( " + category.getName() + " ), file( " +
reportFile.getAbsolutePath() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
// output an html page
char[] buf = new char[1024];
reader = new FileReader( reportFile );
int size;
while ( true ) {
size = reader.read( buf, 0, 1024 );
if ( size == -1 ) {
break;
}
wrtr.write( buf, 0, size );
}
}
catch ( Exception e ) {
String msg = "ERROR: failed to display JUnit report, exception( " + e.getMessage() +
" ), category( " + category.getName() + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
finally {
if ( reader != null ) {
reader.close();
}
}
}
private void doXml( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException {
String outputType = request.getParameter( Constants.CMD );
boolean outputHtml = false;
if ( outputType.equalsIgnoreCase( "xml" ) ) {
outputHtml = false;
}
else if ( outputType.equalsIgnoreCase( "html" ) ) {
outputHtml = true;
}
else {
// fail
String msg = "ERROR: unable to handle Xml request: '" + Constants.CMD + "' ( " + outputType +
" ) is not recognized.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
String fileType = request.getParameter( Constants.FILE );
String resource = null;
if ( fileType.equalsIgnoreCase( Constants.FILE_TYPE_CONFIG ) ) {
resource = Constants.CONFIG_FILE;
}
else if ( fileType.equalsIgnoreCase( Constants.FILE_TYPE_WEBAPP ) ) {
resource = Constants.WEBAPPS_FILE;
}
else if ( fileType.equalsIgnoreCase( Constants.FILE_TYPE_TESTS ) ) {
resource = Constants.TESTS_FILE;
}
else {
// fail
String msg = "ERROR: unable to handle Xml request: '" + Constants.FILE + "' ( " + fileType +
" ) is not recognized.";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( resource );
if ( is == null ) {
// fail
String msg = "ERROR: unable to handle Xml request, unable to obtain stream for resource( " +
resource + " )";
forward( request, response, msg, Constants.ERROR_PAGE, true );
return;
}
if ( outputHtml ) {
response.setContentType( "text/html" );
}
else {
response.setContentType( "text/xml" );
}
doResourceStream( request, response, is, resource, outputHtml );
}
private void doResourceStream( HttpServletRequest request, HttpServletResponse response, final InputStream is,
final String resource, final boolean outputHtml ) throws ServletException, IOException {
InputStreamReader reader = null;
Writer wrtr = null;
try {
wrtr = response.getWriter();
if ( outputHtml ) {
wrtr.write( "<html><title>" + Reporter.escape( resource ) + "</title><body><b>" + resource +
"</b><br /><br /><pre>" );
}
// output an html page
char[] buf = new char[1024];
reader = new InputStreamReader( is );
int size;
while ( true ) {
size = reader.read( buf, 0, 1024 );
if ( size == -1 ) {
break;
}
if ( outputHtml ) {
wrtr.write( Reporter.escape( buf, size ) );
}
else {
wrtr.write( buf, 0, size );
}
}
}
catch ( Exception e ) {
String msg = "ERROR: failed to write resource( " + resource + " ) as stream , exception( " +
e.getMessage() +
" )";
forward( request, response, msg, Constants.ERROR_PAGE, true, e );
}
finally {
if ( outputHtml && wrtr != null ) {
wrtr.write( "</pre></body></html>" );
}
if ( reader != null ) {
reader.close();
}
}
}
private static String getTestName( HttpServletRequest request ) {
return request.getParameter( Constants.TEST_NAME );
}
private static TestDefinition getTest( String name ) {
if ( log.isInfoEnabled() ) {
log.debug( "test name( " + name + " )" );
}
if ( name == null ) {
return null;
}
TestDefinition test = TestRecorderFilter.instance().getTestDefinitions().getTest( name );
return test;
}
private static RecordSession getRecordSession( TestDefinition test, boolean overwrite,
String testUser, String description ) throws SessionFailedException {
File file = getRecordSessionFile( test );
if ( log.isInfoEnabled() ) {
log.info( "record file( " + file.getAbsolutePath() + " )" );
}
// may throw IOException or SecurityException (runtime)
RecordSession session = State.createRecordSession( test.getName(), file,
overwrite, testUser, description );
return session;
}
private static PlaybackSession getPlaybackSession( TestDefinition test )
throws IOException, SessionFailedException {
File playbackFile = getPlaybackSessionFile( test );
if ( log.isInfoEnabled() ) {
log.info( "playback file( " + playbackFile.getAbsolutePath() + " )" );
}
// may throw IOException or SecurityException (runtime)
File diffFile = getDiffFile( test );
File recordFile = getTestFile( test );
// may throw IOException or SecurityException (runtime)
PlaybackSession session = State.createPlaybackSession( test.getName(), playbackFile,
recordFile, diffFile );
return session;
}
public static File getRecordSessionFile( TestDefinition test ) {
return getTestFile( test );
}
public static File getPlaybackSessionFile( TestDefinition test ) throws IOException {
test.createPlaybackFile();
return getResultFile( test );
}
public static File getTestFile( TestDefinition test ) {
return new File( test.getTestFilePath() );
}
public static File getResultFile( TestDefinition test ) {
return new File( test.getResultFilePath() );
}
public static File getDiffFile( TestDefinition test ) {
return new File( test.getResultDiffFilePath() );
}
}