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.net.URL;
042:
043: import org.apache.commons.logging.Log;
044: import org.apache.commons.logging.LogFactory;
045:
046: /**
047: * This refresh handler waits the specified number of seconds (or a user defined maximum)
048: * before refreshing the specified page, using the specified URL. Waiting happens
049: * on the current thread
050: *
051: * If you want a refresh handler that ignores the wait time, see
052: * {@link ImmediateRefreshHandler}.
053: *
054: * @version $Revision: 2132 $
055: * @author <a href="mailto:mbowler@GargoyleSoftware.com">Mike Bowler</a>
056: * @author Daniel Gredler
057: */
058: public class WaitingRefreshHandler implements RefreshHandler {
059:
060: /** Logging support. */
061: private static final Log LOG = LogFactory
062: .getLog(ThreadManager.class);
063:
064: private final int maxwait_;
065:
066: /**
067: * Create a WaitingRefreshHandler that will wait whatever time the server or
068: * content asks unless it it longer than maxwait.
069: *
070: * @param maxwait The maximum wait time before the refresh (in seconds). A value
071: * less than one (1) will cause WaitingRefreshHandler to wait for whatever time the server or content asks.
072: */
073: public WaitingRefreshHandler(final int maxwait) {
074: maxwait_ = maxwait;
075: }
076:
077: /**
078: * Create a WaitingRefreshHandler that will always wait whatever time the server or
079: * content asks.
080: */
081: public WaitingRefreshHandler() {
082: maxwait_ = 0;
083: }
084:
085: /**
086: * Refreshes the specified page using the specified URL after the specified number
087: * of seconds.
088: * @param page The page that is going to be refreshed.
089: * @param url The URL where the new page will be loaded.
090: * @param requestedWait The number of seconds to wait before reloading the page. If this is
091: * greater than maxwait than maxwait will be used instead.
092: * @throws IOException if the refresh fails
093: */
094: public void handleRefresh(final Page page, final URL url,
095: final int requestedWait) throws IOException {
096: int seconds = requestedWait;
097: if (seconds > maxwait_ && maxwait_ > 0) {
098: seconds = maxwait_;
099: }
100: try {
101: Thread.sleep(seconds * 1000);
102: } catch (final InterruptedException e) {
103: /* This can happen when the refresh is happening from a navigation that started
104: * from a setTimeout or setInterval. The navigation will cause all threads to get
105: * interrupted, including the current thread in this case. It should be safe to
106: * ignore it since this is the thread now doing the navigation. Eventually we should
107: * refactor to force all navigation to happen back on the main thread.
108: */
109: LOG
110: .debug("Waiting thread was interrupted. Ignoring interruption to continue navigation.");
111: }
112: final WebWindow window = page.getEnclosingWindow();
113: if (window == null) {
114: return;
115: }
116: final WebClient client = window.getWebClient();
117: client.getPage(window, new WebRequestSettings(url));
118: }
119:
120: }
|