?? dispatcher.java
字號:
/* * Copyright (c) 2001 Sun Microsystems, Inc. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Sun Microsystems, Inc. for Project JXTA." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact Project JXTA at http://www.jxta.org. * * 5. Products derived from this software may not be called "JXTA", * nor may "JXTA" appear in their name, without prior written * permission of Sun. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of Project JXTA. For more * information on Project JXTA, please see * <http://www.jxta.org/>. * * This license is based on the BSD license adopted by the Apache Foundation. * * $Id: Dispatcher.java,v 1.1 2003/08/01 17:41:02 gonzo Exp $ */package net.jxta.test.http;import java.net.URL;import java.net.MalformedURLException;import java.net.URLEncoder;import java.util.Map;import java.util.List;import java.util.ArrayList;import java.util.Iterator;import java.util.Timer;import java.util.TimerTask;import java.io.IOException;import java.io.UnsupportedEncodingException;/** * * @version $Id: Dispatcher.java,v 1.1 2003/08/01 17:41:02 gonzo Exp $ * * @author james todd [gonzo at jxta dot org] */public class Dispatcher { private static final String QUESTION_MARK = "?"; private static final String EQUAL = "="; private static final String AMPERSAND = "&"; private static final String DEFAULT_URL_ENCODING = "UTF-8"; private static final int SLEEP = 100; private static final boolean VERBOSE = false; private List cookies = new ArrayList(); private boolean isCookieEnabled = false; private int maxWait = 0; public Dispatcher() {} public boolean isCookieEnabled() { return this.isCookieEnabled; } public void setCookieEnabled(boolean isCookieEnabled) { this.isCookieEnabled = isCookieEnabled; } public void setMaxWait(int maxWait) { this.maxWait = maxWait; } public int getMaxWait() { return this.maxWait; } public Message dispatch(URL url) throws IOException { return dispatch(url, (Map)null); } public Message dispatch(URL url, Map queryString) throws IOException { return dispatch(url, queryString, (Message)null); } public Message dispatch(URL url, Message message) throws IOException { return dispatch(url, (Map)null, message); } public Message dispatch(URL url, Map queryString, Message message) throws IOException { URL u = bindQueryString(url, queryString); Dispatchable dispatcher = DispatchableFactory.create(u, message); String header = null; for (Iterator c = this.cookies.iterator(); c.hasNext(); ) { header = (String)c.next(); if (isCookieEnabled()) { dispatcher.setHeader(Constants.MIME.Key.COOKIE, header); } } Dispatch dispatch = new Dispatch(dispatcher); new Thread(dispatch, Dispatcher.class.getName() + ":dispatch").start(); Timer timer = null; if (getMaxWait() > 0) { timer = new Timer(); timer.schedule(new DispatchTimerTask(dispatch), getMaxWait()); } while (! dispatch.isDone()) { try { Thread.sleep(SLEEP); } catch (InterruptedException ie) { if (VERBOSE) { ie.printStackTrace(); } } } Message response = dispatch.getResponse(); dispatcher.close(); if (timer != null) { timer.cancel(); } if (response != null) { for (Iterator h = response.getHeaders(Constants.MIME.Key.SET_COOKIE); h.hasNext(); ) { this.cookies.add((String)h.next()); } } return response; } private URL bindQueryString(URL requestURL, Map queryString) { URL u = requestURL; if (u != null && queryString != null) { StringBuffer sb = new StringBuffer(); Iterator keys = queryString.keySet().iterator(); String key = null; String value = null; while (keys.hasNext()) { key = (String)keys.next(); value = (String)queryString.get(key); if (sb.length() > 0) { sb.append(AMPERSAND); } sb.append(urlEncode(key) + EQUAL + urlEncode(value)); } String s = sb.toString().trim(); try { u = new URL(u.toString() + ((s.length() > 0 ? QUESTION_MARK + s : ""))); } catch (MalformedURLException mue) { if (VERBOSE) { mue.printStackTrace(); } } } return u; } private String urlEncode(String value) { return urlEncode(value, DEFAULT_URL_ENCODING); } private String urlEncode(String value, String encoding) { String s = null; try { s = URLEncoder.encode(value, encoding); } catch (UnsupportedEncodingException use) { if (VERBOSE) { use.printStackTrace(); } } return s; }}class DispatchTimerTask extends TimerTask { private Dispatch dispatcher = null; public DispatchTimerTask(Dispatch dispatcher) { this.dispatcher = dispatcher; } public void run() { if (! this.dispatcher.isDone()) { this.dispatcher.interrupt(); } }}class Dispatch implements Runnable { private static int SLEEP = 100; private Dispatchable dispatchable = null; private Message response = null; private boolean isDone = false; private boolean interrupted = false; public Dispatch(Dispatchable dispatchable) { this.dispatchable = dispatchable; } public Message getResponse() { return this.response; } public boolean isDone() { return this.isDone; } public void interrupt() { setInterrupted(true); } public void run() { Thread t = new Thread(new Runnable() { public void run() { try { response = dispatchable.dispatch(); } catch (IOException ioe) {} isDone = true; } } , Dispatcher.class.getName() + ":timer"); t.start(); while (! this.isDone && ! isInterrupted()) { try { Thread.sleep(SLEEP); } catch (InterruptedException ie) { setInterrupted(true); } } if (isInterrupted()) { this.dispatchable.close(); t.interrupt(); } this.isDone = true; } private boolean isInterrupted() { return (this.interrupted = this.interrupted ? true : Thread.interrupted()); } private void setInterrupted(boolean interrupted) { this.interrupted = interrupted; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -