]> sjero.net Git - linphone/blob - p2pproxy/dependencies-src/jxse-src-2.5/impl/src/net/jxta/impl/protocol/RouteResponse.java
22a60fe1415f3c24b945ff6f199cecd6b444a394
[linphone] / p2pproxy / dependencies-src / jxse-src-2.5 / impl / src / net / jxta / impl / protocol / RouteResponse.java
1 /*
2  * Copyright (c) 2001-2007 Sun Microsystems, Inc.  All rights reserved.
3  *  
4  *  The Sun Project JXTA(TM) Software License
5  *  
6  *  Redistribution and use in source and binary forms, with or without 
7  *  modification, are permitted provided that the following conditions are met:
8  *  
9  *  1. Redistributions of source code must retain the above copyright notice,
10  *     this list of conditions and the following disclaimer.
11  *  
12  *  2. Redistributions in binary form must reproduce the above copyright notice, 
13  *     this list of conditions and the following disclaimer in the documentation 
14  *     and/or other materials provided with the distribution.
15  *  
16  *  3. The end-user documentation included with the redistribution, if any, must 
17  *     include the following acknowledgment: "This product includes software 
18  *     developed by Sun Microsystems, Inc. for JXTA(TM) technology." 
19  *     Alternately, this acknowledgment may appear in the software itself, if 
20  *     and wherever such third-party acknowledgments normally appear.
21  *  
22  *  4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must 
23  *     not be used to endorse or promote products derived from this software 
24  *     without prior written permission. For written permission, please contact 
25  *     Project JXTA at http://www.jxta.org.
26  *  
27  *  5. Products derived from this software may not be called "JXTA", nor may 
28  *     "JXTA" appear in their name, without prior written permission of Sun.
29  *  
30  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
31  *  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
32  *  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN 
33  *  MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
34  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
35  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
36  *  OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
37  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
38  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
39  *  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  *  
41  *  JXTA is a registered trademark of Sun Microsystems, Inc. in the United 
42  *  States and other countries.
43  *  
44  *  Please see the license information page at :
45  *  <http://www.jxta.org/project/www/license.html> for instructions on use of 
46  *  the license in source files.
47  *  
48  *  ====================================================================
49  *  
50  *  This software consists of voluntary contributions made by many individuals 
51  *  on behalf of Project JXTA. For more information on Project JXTA, please see 
52  *  http://www.jxta.org.
53  *  
54  *  This license is based on the BSD license adopted by the Apache Foundation. 
55  */
56
57 package net.jxta.impl.protocol;
58
59
60 import net.jxta.document.*;
61 import net.jxta.protocol.RouteAdvertisement;
62 import net.jxta.protocol.RouteResponseMsg;
63
64 import java.lang.reflect.UndeclaredThrowableException;
65 import java.util.Enumeration;
66
67
68 /**
69  * Used by the Endpoint Routing protocol in response to Route Query Messages.
70  * The Route Response Message contains a route advertisement for the destination
71  * peer.
72  * <p/>
73  * <p/><pre>
74  * &lt;xs:complexType name="ERR">
75  *   &lt;xs:sequence>
76  *     &lt;xs:element name="Dst">
77  *       &lt;xs:complexType>
78  *         &lt;xs:sequence>
79  *           &lt;xs:element ref="jxta:RA" />
80  *         &lt;/xs:sequence>
81  *       &lt;/xs:complexType>
82  *     &lt;/xs:element>
83  *     &lt;xs:element name="Src">
84  *       &lt;xs:complexType>
85  *         &lt;xs:sequence>
86  *           &lt;xs:element ref="jxta:RA" />
87  *         &lt;/xs:sequence>
88  *       &lt;/xs:complexType>
89  *     &lt;/xs:element>
90  *   &lt;/xs:sequence>
91  * &lt;/xs:complexType>
92  * </pre>
93  *
94  * @see net.jxta.impl.endpoint.router.EndpointRouter
95  * @see <a href="https://jxta-spec.dev.java.net/nonav/JXTAProtocols.html#proto-erp"
96  *      target="_blank">JXTA Protocols Specification : Endpoint Routing Protocol</a>
97  */
98 public class RouteResponse extends RouteResponseMsg {
99
100     private static final String destRouteTag = "Dst";
101     private static final String srcRouteTag = "Src";
102
103     /**
104      * Construct a new Route Response Message
105      */
106     public RouteResponse() {}
107
108     /**
109      * Construct from an XML document fragment.
110      *
111      * @param doc the element
112      */
113     public RouteResponse(XMLElement doc) {
114
115         String doctype = doc.getName();
116
117         if (!doctype.equals(getAdvertisementType())) {
118             throw new IllegalArgumentException(
119                     "Could not construct : " + getClass().getName() + " from doc containing a " + doctype);
120         }
121
122         Enumeration<XMLElement> elements = doc.getChildren();
123
124         while (elements.hasMoreElements()) {
125             XMLElement elem = elements.nextElement();
126
127             if (elem.getName().equals(destRouteTag)) {
128                 for (Enumeration<XMLElement> eachXpt = elem.getChildren(); eachXpt.hasMoreElements();) {
129                     XMLElement aXpt = eachXpt.nextElement();
130
131                     RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(aXpt);
132
133                     setDestRoute(route);
134                 }
135                 continue;
136             }
137
138             if (elem.getName().equals(srcRouteTag)) {
139                 for (Enumeration<XMLElement> eachXpt = elem.getChildren(); eachXpt.hasMoreElements();) {
140                     XMLElement aXpt = eachXpt.nextElement();
141
142                     RouteAdvertisement route = (RouteAdvertisement) AdvertisementFactory.newAdvertisement(aXpt);
143
144                     setSrcRoute(route);
145                 }
146             }
147         }
148         
149         // Validate.
150         
151         if (null == getSrcRoute()) {
152             throw new IllegalArgumentException("Missing source route.");
153         }
154         
155         if (null == getDestRoute()) {
156             throw new IllegalArgumentException("Missing destination route.");
157         }
158
159         if (null == getSrcRoute().getDestPeerID()) {
160             throw new IllegalArgumentException("Bad source route.");
161         }
162         
163         if (null == getDestRoute().getDestPeerID()) {
164             throw new IllegalArgumentException("Bad destination route.");
165         }
166     }
167
168     /**
169      * return a Document representation of this object
170      */
171     @Override
172     public Document getDocument(MimeMediaType asMimeType) {        
173         if (null == getSrcRoute()) {
174             throw new IllegalStateException("Missing source route.");
175         }
176         
177         if (null == getDestRoute()) {
178             throw new IllegalStateException("Missing destination route.");
179         }
180
181         if (null == getSrcRoute().getDestPeerID()) {
182             throw new IllegalStateException("Bad source route.");
183         }
184         
185         if (null == getDestRoute().getDestPeerID()) {
186             throw new IllegalStateException("Bad destination route.");
187         }
188
189         StructuredDocument adv = StructuredDocumentFactory.newStructuredDocument(asMimeType, getAdvertisementType());
190
191         if (adv instanceof XMLDocument) {
192             ((XMLDocument) adv).addAttribute("xmlns:jxta", "http://jxta.org");
193             ((XMLDocument) adv).addAttribute("xml:space", "preserve");
194         }
195
196         Element e;
197
198         RouteAdvertisement route = getDestRoute();
199
200         if (route != null) {
201             e = adv.createElement(destRouteTag);
202             adv.appendChild(e);
203             StructuredTextDocument xptDoc = (StructuredTextDocument)
204                     route.getDocument(asMimeType);
205
206             StructuredDocumentUtils.copyElements(adv, e, xptDoc);
207         }
208
209         route = getSrcRoute();
210         if (route != null) {
211             e = adv.createElement(srcRouteTag);
212             adv.appendChild(e);
213             StructuredTextDocument xptDoc = (StructuredTextDocument)
214                     route.getDocument(asMimeType);
215
216             StructuredDocumentUtils.copyElements(adv, e, xptDoc);
217         }
218         return adv;
219     }
220
221     /**
222      * {@inheritDoc}
223      * 
224      * <p/>String representation of this RouteResponse doc.
225      */
226     @Override
227     public String toString() {
228         XMLDocument doc = (XMLDocument) getDocument(MimeMediaType.XMLUTF8);
229
230         doc.addAttribute("xml:space", "default");
231
232         return doc.toString();
233     }
234 }