⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dispatcher.java

📁 jxta_src_2.41b jxta 2.41b 最新版源码 from www.jxta.org
💻 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 + -