Source code: net/jxta/ext/config/optimizers/RelayOptimizer.java
1 /*
2 * Copyright (c) 2001 Sun Microsystems, Inc. All rights
3 * reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. The end-user documentation included with the redistribution,
18 * if any, must include the following acknowledgment:
19 * "This product includes software developed by the
20 * Sun Microsystems, Inc. for Project JXTA."
21 * Alternately, this acknowledgment may appear in the software itself,
22 * if and wherever such third-party acknowledgments normally appear.
23 *
24 * 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
25 * must not be used to endorse or promote products derived from this
26 * software without prior written permission. For written
27 * permission, please contact Project JXTA at http://www.jxta.org.
28 *
29 * 5. Products derived from this software may not be called "JXTA",
30 * nor may "JXTA" appear in their name, without prior written
31 * permission of Sun.
32 *
33 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
37 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
45 * ====================================================================
46 *
47 * This software consists of voluntary contributions made by many
48 * individuals on behalf of Project JXTA. For more
49 * information on Project JXTA, please see
50 * <http://www.jxta.org/>.
51 *
52 * This license is based on the BSD license adopted by the Apache Foundation.
53 *
54 * $Id: RelayOptimizer.java,v 1.1 2004/10/30 02:27:00 gonzo Exp $
55 */
56 package net.jxta.ext.config.optimizers;
57
58 import net.jxta.ext.config.Configurator;
59 import net.jxta.ext.config.Optimizer;
60 import net.jxta.ext.config.probes.RelayProbe;
61
62 import net.jxta.ext.http.Dispatcher;
63 import net.jxta.ext.http.Message;
64
65 import java.io.IOException;
66 import java.io.StreamTokenizer;
67 import java.io.StringReader;
68 import java.net.URI;
69 import java.net.URISyntaxException;
70 import java.net.URL;
71 import java.net.MalformedURLException;
72 import java.util.ArrayList;
73 import java.util.Collections;
74 import java.util.List;
75
76 public class RelayOptimizer
77 extends BaseOptimizer {
78
79 public final static String REFLECTION_SERVICE_BOOTSTRAP_KEY = "reflection.service.bootstrap";
80 public final static String REFLECTION_SERVICE_MAX_WAIT_KEY = "reflection.service.max_wait";
81
82 private final static int MAX_WAIT = 7 * 1000;
83
84 private URI bootstrap = null;
85 private int max_wait = MAX_WAIT;
86
87 public RelayOptimizer() {
88 configure();
89 }
90
91 public void optimize(Configurator configurator) {
92 List reflection = this.bootstrap != null ? getReflectionServices(configurator, this.bootstrap) : null;
93
94 if (reflection != null &&
95 reflection.size() > 0) {
96 RelayProbe rp = new RelayProbe(reflection, configurator.getTransports());
97
98 configurator.setRelayOutgoing(! rp.probe());
99 }
100 }
101
102 private void configure() {
103 List l = getProperty(REFLECTION_SERVICE_BOOTSTRAP_KEY);
104
105 if (l != null &&
106 l.size() > 0) {
107 try {
108 this.bootstrap = new URI((String)l.get(0));
109 } catch (URISyntaxException use) {}
110 }
111
112 l = getProperty(REFLECTION_SERVICE_MAX_WAIT_KEY);
113
114 if (l != null &&
115 l.size() > 0) {
116 try {
117 this.max_wait = Integer.parseInt((String)l.get(0));
118 } catch (NumberFormatException nfe) {}
119 }
120 }
121
122 // private URI getBootstrap(Configurator configurator) {
123 // return configurator.getReflectionBootstrapAddress();
124 // }
125
126 private List getReflectionServices(Configurator configurator, URI bootstrap) {
127 URL u = null;
128
129 try {
130 u = bootstrap != null ? bootstrap.toURL() : null;
131 } catch (MalformedURLException mue) {}
132
133 List l = null;
134
135 if (u != null) {
136 Message results = null;
137
138 try {
139 results = new Dispatcher(u, this.max_wait).dispatch();
140 } catch (IOException ioe) {}
141
142 String s = (results != null ? results.getBody() : null);
143
144 if (s != null) {
145 StreamTokenizer st = new StreamTokenizer(new StringReader(s));
146 l = new ArrayList();
147
148 st.wordChars(' ', '~');
149 st.eolIsSignificant(true);
150
151 try {
152 while (st.nextToken() != StreamTokenizer.TT_EOF) {
153 switch (st.ttype) {
154 case StreamTokenizer.TT_WORD:
155 try {
156 l.add(new URI(st.sval.trim()));
157 } catch (URISyntaxException use) {}
158
159 break;
160 default:
161 }
162 }
163 } catch (IOException ioe) {}
164 }
165 }
166
167 return l != null ? l : Collections.EMPTY_LIST;
168 }
169 }