Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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 }