/* * $Id$ * * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.javatest; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import com.sun.interview.WizPrint; import com.sun.javatest.httpd.JThttpProvider; import com.sun.javatest.httpd.PageGenerator; import com.sun.javatest.httpd.RootRegistry; import com.sun.javatest.httpd.httpURL; import com.sun.javatest.util.I18NResourceBundle; import com.sun.javatest.util.PropertyArray; import com.sun.javatest.util.StringArray; class HarnessHttpHandler extends JThttpProvider implements Harness.Observer { HarnessHttpHandler(Harness harness) { this.harness = harness; harness.addObserver(this); } public void serviceRequest(httpURL requestURL, PrintWriter out) { String nf = requestURL.getNextFile(); if (nf == null) { // request for root beginGood(out); printHtml(out); } else if (nf.equals("env")) { // environment dump beginGood(out); printEnv(out); } else if (nf.equals("interview")) { // interview dump beginGood(out); printInterview(out); } else if (nf.equals("text")) // get text only data printText(requestURL, out); else if (nf.equals("stop")) { // stop the harness if (!harness.isRunning()) { println(out, i18n.getString("harnessHttp.noStop")); } else { // generate the token if it hasn't already been beginGood(out); if (magicToken == null) { long num = Math.round(Math.floor(Math.random() * 30000.0 )); magicToken = Integer.toString((int)num); } PageGenerator.writeHeader(out, i18n.getString("harnessHttp.stop.hdr")); PageGenerator.startBody(out); String token = requestURL.getValue("token"); if (token == null) printStopConfirm(out); else if (token.equals(magicToken)) { harness.stop(); println(out, i18n.getString("harnessHttp.stopped")); } else { printStopErr(out); } out.println("
"); PageGenerator.writeFooter(out); PageGenerator.endBody(out); PageGenerator.writeEndDoc(out); } } else { // bad url if (debug) System.out.println("TRT.HH-remainder of URL unknown (" + nf + ")"); beginBad(out); printHtml(out); } out.close(); } private void beginGood(PrintWriter out) { PageGenerator.generateOkHttp(out); PageGenerator.generateDocType(out, PageGenerator.HTML32); } private void beginBad(PrintWriter out) { PageGenerator.generateBadHttp(out); PageGenerator.generateDocType(out, PageGenerator.HTML32); } /** * Print the basic HTML page for Harness. */ private void printHtml(PrintWriter out) { PageGenerator.writeBeginDoc(out); printIndex(out); out.println("
"); PageGenerator.writeFooter(out); PageGenerator.endBody(out); PageGenerator.writeEndDoc(out); } /** * Print the environment settings in formatted HTML. */ private void printEnv(PrintWriter out) { PageGenerator.writeBeginDoc(out); PageGenerator.writeHeader(out, i18n.getString("harnessHttp.env.title")); out.print("

"); print(out, i18n.getString("harnessHttp.env.hdr")); out.println("

"); Parameters params = harness.getParameters(); if (params != null) printEnv(out, params.getEnv()); else out.println(i18n.getString("harnessHttp.env.none")); out.println("
"); PageGenerator.writeFooter(out); PageGenerator.endBody(out); PageGenerator.writeEndDoc(out); } /** * Print the interview settings in formatted HTML. */ private void printInterview(PrintWriter out) { PageGenerator.writeBeginDoc(out); PageGenerator.writeHeader(out, i18n.getString("harnessHttp.interview.title")); out.print("

"); print(out, i18n.getString("harnessHttp.interview.hdr")); out.println("

"); try { Parameters params = harness.getParameters(); if (params == null || !(harness.getParameters() instanceof InterviewParameters)) { println(out, i18n.getString("harnessHttp.interview.none")); } else { InterviewParameters interview = (InterviewParameters)(harness.getParameters()); WizPrint wp = new WizPrint(interview); wp.setShowResponses(true); wp.setShowResponseTypes(true); wp.setShowTags(true); wp.write(out); } // else out.println("
"); PageGenerator.writeFooter(out); PageGenerator.endBody(out); PageGenerator.writeEndDoc(out); } // try catch (IOException e) { println(out, i18n.getString("harnessHttp.ioProblem")); } // catch } /** * Access to raw text output pages. * We choose to not including the standard HTTP response header when * returning plain text. This makes it easier to process on the client side. */ private void printText(httpURL requestURL, PrintWriter out) { // write directly to out in this method, we are not // transmitting HTML encoded data Parameters params = harness.getParameters(); String nf = requestURL.getNextFile(); if (nf == null) { beginGood(out); printIndex(out); } else if (nf.equals("env")) { // special case for incomplete interview? TestEnvironment env = params.getEnv(); if (env == null) { print(out, i18n.getString("harnessHttp.env.none")); return; } /* does not fit in the properties style output out.print(i18n.getString("harnessHttp.env.name")); out.println(env.getName()); */ String[] pa = new String[0]; for (Iterator i = env.elements().iterator(); i.hasNext(); ) { TestEnvironment.Element elem = i.next(); // this is stunningly inefficient and should be fixed pa = PropertyArray.put(pa, elem.getKey(), elem.getValue()); } try { PropertyArray.save(pa, out); } catch (IOException e) { // this is probably useless since problems with out // probably caused this out.println(i18n.getString("harnessHttp.ioProblem")); } } else if (nf.equals("config")) { if (params == null) { out.print(i18n.getString("harnessHttp.text.unavail")); return; } // test suite info TestSuite ts = params.getTestSuite(); out.print(i18n.getString("harnessHttp.text.ts.path")); out.print("="); if (ts != null) { out.println(ts.getPath()); } else out.println(i18n.getString("harnessHttp.text.empty")); out.print(i18n.getString("harnessHttp.text.ts.name")); out.print("="); if (ts != null) { out.println(ts.getName()); } else out.println(i18n.getString("harnessHttp.text.empty")); out.print(i18n.getString("harnessHttp.text.wd.val")); out.print("="); WorkDirectory wd = params.getWorkDirectory(); if (wd != null) out.println(wd.getPath()); else out.println(i18n.getString("harnessHttp.text.empty")); } else if (nf.equals("tests")) { if (params == null) { out.print(i18n.getString("harnessHttp.text.unavail")); return; } String[] tests = params.getTests(); if (tests != null && tests.length != 0) { for (int i = 0; i < tests.length; i++) { out.print("url"); out.print(Integer.toString(i)); out.print("="); out.println(tests[i]); } // for } } else if (nf.equals("stats")) { if (!harness.isRunning()) { out.println(""); return; } stats[Status.NOT_RUN] = harness.getTestsFoundCount() - stats[Status.PASSED] - stats[Status.FAILED] - stats[Status.ERROR]; for (int i = 0; i < Status.NUM_STATES; i++) { out.print((Status.typeToString(i)).replace(' ', '_')); out.print("="); out.println(stats[i]); } // for } else if (nf.equals("state")) { // provide information about the Harness' state print(out, i18n.getString("harnessHttp.state.run.val")); out.println(harness.isRunning()); } else if (nf.equals("results")) { // test dump TestResultTable trt = harness.getResultTable(); TestFilter[] filters = params.getFilters(); String[] tests = params.getTests(); Iterator it = null; if (tests == null || tests.length == 0) it = trt.getIterator(filters); else it = trt.getIterator(params.getTests(), filters); while (it.hasNext()) { TestResult tr = it.next(); out.println(tr.getTestName()); out.println(tr.getStatus().toString()); } // while } else { if (debug) System.out.println("TRT.HH-remainder of URL unknown (" + nf + ")"); println(out, i18n.getString("harnessHttp.badRequest", requestURL.getFullPath())); } } private void printStopConfirm(PrintWriter out) { out.print("

"); print(out, i18n.getString("harnessHttp.stopConfirm.hdr")); out.println("

"); out.print("

"); print(out, i18n.getString("harnessHttp.stopConfirm.txt")); out.println("

"); out.print("
"); out.print("

"); out.print("

"); } private void printStopErr(PrintWriter out) { out.println("

"); println(out, i18n.getString("harnessHttp.stopErr.hdr")); out.println("

"); out.println(""); println(out, i18n.getString("harnessHttp.stopErr.text1")); println(out, i18n.getString("harnessHttp.stopErr.text2")); out.println(""); out.println("

"); println(out, i18n.getString("harnessHttp.stopErr.text3")); out.println(""); println(out, i18n.getString("harnessHttp.stopErr.text4")); out.println(""); println(out, i18n.getString("harnessHttp.stopErr.text5")); } private void printIndex(PrintWriter out) { PageGenerator.writeHeader(out, i18n.getString("harnessHttp.index.title")); PageGenerator.startBody(out); out.println("

"); out.print("JT Harness ™ "); println(out, i18n.getString("harnessHttp.index.hdr")); out.println("

"); Parameters params = harness.getParameters(); if (params == null) { out.println(i18n.getString("harnessHttp.parameters.noParams")); return; } // print test suite print(out, i18n.getString("harnessHttp.parameters.tsName")); String name = params.getTestSuite().getName(); println(out, (name == null ? i18n.getString("harnessHttp.parameters.noTs") : name)); out.println("
"); print(out, i18n.getString("harnessHttp.parameters.tsPath")); File tsr = params.getTestSuite().getRoot(); println(out, (tsr == null ? i18n.getString("harnessHttp.parameters.noTs") : tsr.getPath())); out.println("
"); // print workdir print(out, i18n.getString("harnessHttp.parameters.wd")); WorkDirectory wd = params.getWorkDirectory(); if (wd != null) println(out, wd.getPath()); else print(out, i18n.getString("harnessHttp.parameters.noWd")); out.println("

"); // print parameters printParameters(out, params); // print results link TestResultTable currentResults = harness.getResultTable(); out.println("

"); println(out, i18n.getString("harnessHttp.results.hdr")); out.println("

"); if (currentResults != null) { JThttpProvider trtProv = RootRegistry.getObjectHandler(currentResults); if (trtProv != null && trtProv.getRootURL() != null) { out.print(""); print(out, i18n.getString("harnessHttp.trt.link")); out.println(""); } } else { out.print(i18n.getString("harnessHttp.trt.none")); } } private void printParameters(PrintWriter out, Parameters params) { out.println("

"); println(out, i18n.getString("harnessHttp.parameters.hdr")); out.println("

"); print(out, i18n.getString("harnessHttp.parameters.env")); TestEnvironment tev = params.getEnv(); if (tev != null) { out.print(""); print(out, tev.getName()); out.println(""); } else { println(out, i18n.getString("harnessHttp.parameters.noEnv")); } out.println("
"); print(out, i18n.getString("harnessHttp.parameters.interview")); if (params instanceof InterviewParameters) { InterviewParameters ip = (InterviewParameters)params; File ipf = ip.getFile(); out.print(""); print(out, (ipf == null ? i18n.getString("harnessHttp.parameters.noInterviewFile") : ipf.getPath())); out.println(""); } else { println(out, i18n.getString("harnessHttp.parameters.noInterview")); } out.println("

"); // initial files info out.println("

"); // status } private void printTests(PrintWriter out) { String[] tests = harness.getParameters().getTests(); if (tests == null || tests.length == 0) { print(out, i18n.getString("harnessHttp.parameters.noTests")); } else { out.println(""); } } // printTests() private void printEnv(PrintWriter out, TestEnvironment env) { out.print(i18n.getString("harnessHttp.env.name")); println(out, env.getName()); String keyHeader = "Key"; String valHeader = "Value"; out.println(""); StringBuffer buf = new StringBuffer(50); // write the table header buf.append(""); out.println(buf.toString()); for (Iterator keys = env.keys().iterator(); keys.hasNext(); ) { String key = keys.next(); out.println(""); buf.setLength(0); buf.append(""); } // while out.println("
"); buf.append(filterTags(keyHeader)); buf.append(""); buf.append(filterTags(valHeader)); buf.append("
"); buf.append(key.toString()); buf.append(""); try { buf.append(filterTags(StringArray.join((env.lookup(key))))); } catch (TestEnvironment.Fault f) { buf.append(i18n.getString("harnessHttp.env.error")); } out.println(buf.toString()); out.println("
"); } // ------------ instance vars ------------ private Harness harness; private boolean debug = false; private String magicToken; private int[] stats = new int[Status.NUM_STATES]; private TestFinderQueue tfq; private static I18NResourceBundle i18n = I18NResourceBundle.getBundleForClass(HarnessHttpHandler.class); // ------------ Harness.Observer ------------ public void startingTestRun(Parameters params) { } public void startingTest(TestResult tr) { } public void finishedTest(TestResult tr) { stats[tr.getStatus().getType()]++; } public void stoppingTestRun() { } public void finishedTesting() { } public void finishedTestRun(boolean allOK) { } public void error(String msg) { } }