001: /*
002: * Copyright (c) 2002-2008 Gargoyle Software Inc. All rights reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * 1. Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: * 2. Redistributions in binary form must reproduce the above copyright notice,
010: * this list of conditions and the following disclaimer in the documentation
011: * and/or other materials provided with the distribution.
012: * 3. The end-user documentation included with the redistribution, if any, must
013: * include the following acknowledgment:
014: *
015: * "This product includes software developed by Gargoyle Software Inc.
016: * (http://www.GargoyleSoftware.com/)."
017: *
018: * Alternately, this acknowledgment may appear in the software itself, if
019: * and wherever such third-party acknowledgments normally appear.
020: * 4. The name "Gargoyle Software" must not be used to endorse or promote
021: * products derived from this software without prior written permission.
022: * For written permission, please contact info@GargoyleSoftware.com.
023: * 5. Products derived from this software may not be called "HtmlUnit", nor may
024: * "HtmlUnit" appear in their name, without prior written permission of
025: * Gargoyle Software Inc.
026: *
027: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
028: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
029: * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GARGOYLE
030: * SOFTWARE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
031: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
032: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
033: * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
034: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
035: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
036: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
037: */
038: package com.gargoylesoftware.htmlunit;
039:
040: import java.io.IOException;
041: import java.io.Serializable;
042:
043: import com.gargoylesoftware.htmlunit.html.HTMLParser;
044: import com.gargoylesoftware.htmlunit.html.HtmlPage;
045: import com.gargoylesoftware.htmlunit.xml.XmlPage;
046:
047: /**
048: * The default implementation of PageCreator. Designed to be extended for easier
049: * handling of new content types. Just check the content type in createPage()
050: * and call super(createPage()) if your custom type isn't found. There are
051: * also protected createXXXXPage() methods for creating the Page types HtmlUnit
052: * already knows about for your custom content types.
053: *
054: * @version $Revision: 2132 $
055: * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
056: * @author <a href="mailto:cse@dynabean.de">Christian Sell</a>
057: * @author <a href="mailto:yourgod@users.sourceforge.net">Brad Clarke</a>
058: * @author Marc Guillemot
059: * @author Ahmed Ashour
060: */
061: public class DefaultPageCreator implements PageCreator, Serializable {
062:
063: private static final long serialVersionUID = -4420355214574495577L;
064:
065: /**
066: * Create an instance.
067: */
068: public DefaultPageCreator() {
069: }
070:
071: /**
072: * Create a Page object for the specified web response.
073: *
074: * @param webResponse The response from the server
075: * @param webWindow The window that this page will be loaded into.
076: * @exception IOException If an io problem occurs
077: * @return The new page object
078: */
079: public Page createPage(final WebResponse webResponse,
080: final WebWindow webWindow) throws IOException {
081: final String contentType = webResponse.getContentType()
082: .toLowerCase();
083: final Page newPage;
084:
085: final String pageType = determinePageType(contentType);
086: if (pageType.equals("html")) {
087: newPage = createHtmlPage(webResponse, webWindow);
088: } else if (pageType.equals("javascript")) {
089: newPage = createJavaScriptPage(webResponse, webWindow);
090: } else if (pageType.equals("xml")) {
091: newPage = createXmlPage(webResponse, webWindow);
092: } else if (pageType.equals("text")) {
093: newPage = createTextPage(webResponse, webWindow);
094: } else {
095: newPage = createUnexpectedPage(webResponse, webWindow);
096: }
097: return newPage;
098: }
099:
100: /**
101: * Create a HtmlPage for this WebResponse
102: *
103: * @param webResponse The page's source
104: * @param webWindow The WebWindow to place the HtmlPage in
105: * @return The newly created HtmlPage
106: * @throws IOException If the page could not be created
107: */
108: protected HtmlPage createHtmlPage(final WebResponse webResponse,
109: final WebWindow webWindow) throws IOException {
110: final HtmlPage newPage;
111: newPage = HTMLParser.parse(webResponse, webWindow);
112: return newPage;
113: }
114:
115: /**
116: * Create a JavaScriptPage for this WebResponse
117: *
118: * @param webResponse The page's source
119: * @param webWindow The WebWindow to place the JavaScriptPage in
120: * @return The newly created JavaScriptPage
121: */
122: protected JavaScriptPage createJavaScriptPage(
123: final WebResponse webResponse, final WebWindow webWindow) {
124: final JavaScriptPage newPage;
125: newPage = new JavaScriptPage(webResponse, webWindow);
126: webWindow.setEnclosedPage(newPage);
127: return newPage;
128: }
129:
130: /**
131: * Create a TextPage for this WebResponse
132: *
133: * @param webResponse The page's source
134: * @param webWindow The WebWindow to place the TextPage in
135: * @return The newly created TextPage
136: */
137: protected TextPage createTextPage(final WebResponse webResponse,
138: final WebWindow webWindow) {
139: final TextPage newPage;
140: newPage = new TextPage(webResponse, webWindow);
141: webWindow.setEnclosedPage(newPage);
142: return newPage;
143: }
144:
145: /**
146: * Create an UnexpectedPage for this WebResponse
147: *
148: * @param webResponse The page's source
149: * @param webWindow The WebWindow to place the UnexpectedPage in
150: * @return The newly created UnexpectedPage
151: */
152: protected UnexpectedPage createUnexpectedPage(
153: final WebResponse webResponse, final WebWindow webWindow) {
154: final UnexpectedPage newPage;
155: newPage = new UnexpectedPage(webResponse, webWindow);
156: webWindow.setEnclosedPage(newPage);
157: return newPage;
158: }
159:
160: /**
161: * Create an XmlPage for this WebResponse
162: *
163: * @param webResponse The page's source
164: * @param webWindow The WebWindow to place the TextPage in
165: * @return The newly created TextPage
166: * @throws IOException If the page could not be created
167: */
168: protected XmlPage createXmlPage(final WebResponse webResponse,
169: final WebWindow webWindow) throws IOException {
170: final XmlPage newPage = new XmlPage(webResponse, webWindow);
171: webWindow.setEnclosedPage(newPage);
172: return newPage;
173: }
174:
175: /**
176: * Determines the kind of page to create from the content type
177: * @param contentType The content type to evaluate
178: * @return "xml", "html", "javascript", "text" or "unknown"
179: */
180: protected String determinePageType(final String contentType) {
181: if (contentType.equals("text/html")
182: || contentType.equals("text/xhtml")) {
183: return "html";
184: } else if (contentType.endsWith("xhtml+xml")) {
185: //Should create a validated XML document but for now just make what we can
186: return "html";
187: } else if (contentType.equals("text/javascript")
188: || contentType.equals("application/x-javascript")) {
189: return "javascript";
190: } else if (contentType.equals("text/xml")
191: || contentType.equals("application/xml")
192: || contentType.matches(".*\\+xml")
193: || contentType.equals("text/vnd.wap.wml")) {
194: return "xml";
195: } else if (contentType.startsWith("text/")) {
196: return "text";
197: } else {
198: return "unknown";
199: }
200: }
201: }
|