001 package fi.iki.hsivonen.verifierservlet; 002 003 import java.io.IOException; 004 005 import javax.servlet.ServletException; 006 import javax.servlet.http.HttpServletRequest; 007 import javax.servlet.http.HttpServletResponse; 008 009 import org.xml.sax.SAXException; 010 import org.xml.sax.SAXNotRecognizedException; 011 import org.xml.sax.SAXNotSupportedException; 012 import org.xml.sax.SAXParseException; 013 014 import com.thaiopensource.validate.IncorrectSchemaException; 015 016 import fi.iki.hsivonen.htmlparser.DoctypeHandler; 017 import fi.iki.hsivonen.htmlparser.HtmlParser; 018 import fi.iki.hsivonen.xml.TypedInputSource; 019 020 public class Html5ConformanceCheckerTransaction extends 021 VerifierServletTransaction { 022 023 private static final char[] SERVICE_TITLE = "(X)HTML5 Conformance Checking Service ".toCharArray(); 024 025 private static final char[] TECHNOLOGY_PREVIEW = "Technology Preview".toCharArray(); 026 027 private static final char[] RESULTS_TITLE = "(X)HTML5 conformance checking results for ".toCharArray(); 028 029 private static final char[] SUCCESS_HTML = "The document conforms to the machine-checkable conformance requirements for HTML5 (subject to the utter previewness of this service).".toCharArray(); 030 031 private static final char[] SUCCESS_XHTML = "The document conforms to the machine-checkable conformance requirements for XHTML5 (subject to the utter previewness of this service).".toCharArray(); 032 033 private static final char[] FAILURE_HTML = "There were errors. (Tried in the text/html mode.)".toCharArray(); 034 035 private static final char[] FAILURE_XHTML = "There were errors. (Tried in the XHTML mode.)".toCharArray(); 036 037 private boolean usingHtml = false; 038 039 public Html5ConformanceCheckerTransaction(HttpServletRequest request, 040 HttpServletResponse response) { 041 super(request, response); 042 } 043 044 /** 045 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#emitSuccess() 046 */ 047 protected void emitSuccess() throws SAXException { 048 if (usingHtml) { 049 emitter.characters(SUCCESS_HTML); 050 } else { 051 emitter.characters(SUCCESS_XHTML); 052 } 053 } 054 055 /** 056 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#loadDocAndSetupParser() 057 */ 058 protected void loadDocAndSetupParser() throws SAXException, IOException, IncorrectSchemaException, SAXNotRecognizedException, SAXNotSupportedException { 059 httpRes.setAllowGenericXml(false); 060 httpRes.setAcceptAllKnownXmlTypes(false); 061 httpRes.setAllowHtml(true); 062 httpRes.setAllowXhtml(true); 063 documentInput = (TypedInputSource) entityResolver.resolveEntity( 064 null, document); 065 String type = documentInput.getType(); 066 if ("text/html".equals(type)) { 067 validator = validatorByDoctype(DoctypeHandler.DOCTYPE_HTML5); 068 usingHtml = true; 069 htmlParser = new HtmlParser(); 070 htmlParser.setDoctypeMode(DoctypeHandler.DOCTYPE_HTML5); 071 htmlParser.setDoctypeHandler(this); 072 htmlParser.setContentHandler(validator.getContentHandler()); 073 reader = htmlParser; 074 } else { 075 validator = validatorByDoctype(XHTML5_SCHEMA); 076 reader = setupXmlParser(); 077 if (!("application/xhtml+xml".equals(type) || "application/xml".equals(type))) { 078 String message = "The preferred Content-Type for XHTML5 is application/xhtml+xml. The Content-Type was " + type + "."; 079 SAXParseException spe = new SAXParseException(message, null, documentInput.getSystemId(), -1, -1); 080 errorHandler.warning(spe); 081 } 082 } 083 084 } 085 086 /** 087 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#setupAndStartEmission() 088 */ 089 protected void setup() throws ServletException { 090 // No-op 091 } 092 093 /** 094 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#emitTitle() 095 */ 096 void emitTitle(boolean markupAllowed) throws SAXException { 097 if (willValidate()) { 098 emitter.characters(RESULTS_TITLE); 099 emitter.characters(scrub(document)); 100 } else { 101 emitter.characters(SERVICE_TITLE); 102 if (markupAllowed) { 103 emitter.startElement("span"); 104 emitter.characters(TECHNOLOGY_PREVIEW); 105 emitter.endElement("span"); 106 } 107 } 108 } 109 110 /** 111 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#tryToSetupValidator() 112 */ 113 protected void tryToSetupValidator() throws SAXException, IOException, IncorrectSchemaException { 114 // No-op 115 } 116 117 /** 118 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#emitFailure() 119 */ 120 protected void emitFailure() throws SAXException { 121 if (usingHtml) { 122 emitter.characters(FAILURE_HTML); 123 } else { 124 emitter.characters(FAILURE_XHTML); 125 } 126 } 127 128 /** 129 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#emitFormContent() 130 */ 131 protected void emitFormContent() throws SAXException { 132 Html5FormEmitter.emit(contentHandler, this); 133 } 134 135 /** 136 * @see fi.iki.hsivonen.verifierservlet.VerifierServletTransaction#doctype(int) 137 */ 138 public void doctype(int doctype) throws SAXException { 139 // No-op 140 } 141 142 }