001 /* 002 * Copyright (c) 2005, 2006 Henri Sivonen 003 * Copyright (c) 2007 Mozilla Foundation 004 * 005 * Permission is hereby granted, free of charge, to any person obtaining a 006 * copy of this software and associated documentation files (the "Software"), 007 * to deal in the Software without restriction, including without limitation 008 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 009 * and/or sell copies of the Software, and to permit persons to whom the 010 * Software is furnished to do so, subject to the following conditions: 011 * 012 * The above copyright notice and this permission notice shall be included in 013 * all copies or substantial portions of the Software. 014 * 015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 016 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 017 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 018 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 019 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 020 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 021 * DEALINGS IN THE SOFTWARE. 022 */ 023 024 package nu.validator.servlet; 025 026 import java.io.IOException; 027 028 import javax.servlet.ServletException; 029 import javax.servlet.http.HttpServletRequest; 030 import javax.servlet.http.HttpServletResponse; 031 032 import nu.validator.htmlparser.common.DoctypeExpectation; 033 import nu.validator.htmlparser.common.XmlViolationPolicy; 034 import nu.validator.htmlparser.sax.HtmlParser; 035 036 import org.xml.sax.SAXException; 037 import org.xml.sax.SAXNotRecognizedException; 038 import org.xml.sax.SAXNotSupportedException; 039 import org.xml.sax.SAXParseException; 040 041 import com.thaiopensource.validate.IncorrectSchemaException; 042 043 044 public class Html5ConformanceCheckerTransaction extends 045 VerifierServletTransaction { 046 047 private static final char[] SERVICE_TITLE = "(X)HTML5 Conformance Checking Service ".toCharArray(); 048 049 private static final char[] TECHNOLOGY_PREVIEW = "Technology Preview".toCharArray(); 050 051 private static final char[] RESULTS_TITLE = "(X)HTML5 conformance checking results".toCharArray(); 052 053 private static final char[] FOR = " for ".toCharArray(); 054 055 private static final String SUCCESS_HTML = "The document conforms to the machine-checkable conformance requirements for HTML5 (subject to the utter previewness of this service)."; 056 057 private static final String SUCCESS_XHTML = "The document conforms to the machine-checkable conformance requirements for XHTML5 (subject to the utter previewness of this service)."; 058 059 private static final String FAILURE_HTML = "There were errors. (Tried in the text/html mode.)"; 060 061 private static final String FAILURE_XHTML = "There were errors. (Tried in the XHTML mode.)"; 062 063 private boolean usingHtml = false; 064 065 public Html5ConformanceCheckerTransaction(HttpServletRequest request, 066 HttpServletResponse response) { 067 super(request, response); 068 } 069 070 /** 071 * @see nu.validator.servlet.VerifierServletTransaction#successMessage() 072 */ 073 protected String successMessage() throws SAXException { 074 if (usingHtml) { 075 return SUCCESS_HTML; 076 } else { 077 return SUCCESS_XHTML; 078 } 079 } 080 081 /** 082 * @see nu.validator.servlet.VerifierServletTransaction#loadDocAndSetupParser() 083 */ 084 protected void loadDocAndSetupParser() throws SAXException, IOException, IncorrectSchemaException, SAXNotRecognizedException, SAXNotSupportedException { 085 setAllowGenericXml(false); 086 setAcceptAllKnownXmlTypes(false); 087 setAllowHtml(true); 088 setAllowXhtml(true); 089 loadDocumentInput(); 090 String type = documentInput.getType(); 091 if ("text/html".equals(type)) { 092 validator = validatorByDoctype(HTML5_SCHEMA); 093 usingHtml = true; 094 newHtmlParser(); 095 htmlParser.setDoctypeExpectation(DoctypeExpectation.HTML); 096 htmlParser.setDocumentModeHandler(this); 097 htmlParser.setContentHandler(validator.getContentHandler()); 098 reader = htmlParser; 099 } else { 100 validator = validatorByDoctype(XHTML5_SCHEMA); 101 setupXmlParser(); 102 if (!("application/xhtml+xml".equals(type) || "application/xml".equals(type))) { 103 String message = "The preferred Content-Type for XHTML5 is application/xhtml+xml. The Content-Type was " + type + "."; 104 SAXParseException spe = new SAXParseException(message, null, documentInput.getSystemId(), -1, -1); 105 errorHandler.warning(spe); 106 } 107 } 108 109 } 110 111 /** 112 * @see nu.validator.servlet.VerifierServletTransaction#setupAndStartEmission() 113 */ 114 protected void setup() throws ServletException { 115 // No-op 116 } 117 118 /** 119 * @see nu.validator.servlet.VerifierServletTransaction#emitTitle() 120 */ 121 void emitTitle(boolean markupAllowed) throws SAXException { 122 if (willValidate()) { 123 emitter.characters(RESULTS_TITLE); 124 if (document != null) { 125 emitter.characters(FOR); 126 emitter.characters(scrub(document)); 127 } 128 } else { 129 emitter.characters(SERVICE_TITLE); 130 if (markupAllowed) { 131 emitter.startElement("span"); 132 emitter.characters(TECHNOLOGY_PREVIEW); 133 emitter.endElement("span"); 134 } 135 } 136 } 137 138 /** 139 * @see nu.validator.servlet.VerifierServletTransaction#tryToSetupValidator() 140 */ 141 protected void tryToSetupValidator() throws SAXException, IOException, IncorrectSchemaException { 142 // No-op 143 } 144 145 /** 146 * @see nu.validator.servlet.VerifierServletTransaction#failureMessage() 147 */ 148 protected String failureMessage() throws SAXException { 149 if (usingHtml) { 150 return FAILURE_HTML; 151 } else { 152 return FAILURE_XHTML; 153 } 154 } 155 156 /** 157 * @see nu.validator.servlet.VerifierServletTransaction#emitFormContent() 158 */ 159 protected void emitFormContent() throws SAXException { 160 Html5FormEmitter.emit(contentHandler, this); 161 } 162 163 /** 164 * @see nu.validator.servlet.VerifierServletTransaction#doctype(int) 165 */ 166 public void doctype(int doctype) throws SAXException { 167 // No-op 168 } 169 170 }