]> sjero.net Git - linphone/blob - p2pproxy/dependencies-src/jxse-src-2.5/impl/src/net/jxta/impl/pipe/WireHeader.java
e6abfb4f894f0e005fe44717ee30b78206b223fe
[linphone] / p2pproxy / dependencies-src / jxse-src-2.5 / impl / src / net / jxta / impl / pipe / WireHeader.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 package net.jxta.impl.pipe;
57
58 import net.jxta.document.Attribute;
59 import net.jxta.document.Document;
60 import net.jxta.document.Element;
61 import net.jxta.document.MimeMediaType;
62 import net.jxta.document.StructuredDocumentFactory;
63 import net.jxta.document.StructuredTextDocument;
64 import net.jxta.document.XMLDocument;
65 import net.jxta.document.XMLElement;
66 import net.jxta.id.ID;
67 import net.jxta.id.IDFactory;
68 import net.jxta.logging.Logging;
69
70 import java.net.URI;
71 import java.net.URISyntaxException;
72 import java.util.Enumeration;
73 import java.util.logging.Level;
74 import java.util.logging.Logger;
75
76 /**
77  * This class implements a JXTA-WIRE header.
78  */
79 public class WireHeader {
80
81     /**
82      * Logger
83      */
84     private final static Logger LOG = Logger.getLogger(WireHeader.class.getName());
85
86     private static final String Name = "JxtaWire";
87     private static final String MsgIdTag = "MsgId";
88     private static final String PipeIdTag = "PipeId";
89     private static final String SrcTag = "SrcPeer";
90     private static final String TTLTag = "TTL";
91     private static final String PeerTag = "VisitedPeer";
92
93     private ID srcPeer = ID.nullID;
94     private ID pipeID = ID.nullID;
95     private String msgId = null;
96     private int TTL = Integer.MIN_VALUE;
97
98     public WireHeader() {}
99
100     public WireHeader(Element root) {
101         initialize(root);
102     }
103
104     public void setSrcPeer(ID p) {
105         srcPeer = p;
106     }
107
108     public ID getSrcPeer() {
109         return srcPeer;
110     }
111
112     public void setTTL(int t) {
113         TTL = t;
114     }
115
116     public int getTTL() {
117         return TTL;
118     }
119
120     public String getMsgId() {
121         return msgId;
122     }
123
124     public void setMsgId(String id) {
125         this.msgId = id;
126     }
127
128     public ID getPipeID() {
129         return pipeID;
130     }
131
132     public void setPipeID(ID id) {
133         this.pipeID = id;
134     }
135
136     /**
137      * Called to handle elements during parsing.
138      *
139      * @param elem Element to parse
140      * @return true if element was handled, otherwise false.
141      */
142     protected boolean handleElement(XMLElement elem) {
143         if (elem.getName().equals(SrcTag)) {
144             try {
145                 URI pID = new URI(elem.getTextValue());
146                 setSrcPeer(IDFactory.fromURI(pID));
147             } catch (URISyntaxException badID) {
148                 throw new IllegalArgumentException("Bad PeerID ID in header: " + elem.getTextValue());
149             }
150             return true;
151         }
152
153         if (elem.getName().equals(MsgIdTag)) {
154             msgId = elem.getTextValue();
155             return true;
156         }
157
158         if (elem.getName().equals(PipeIdTag)) {
159             try {
160                 URI pipeID = new URI(elem.getTextValue());
161                 setPipeID(IDFactory.fromURI(pipeID));
162             } catch (URISyntaxException badID) {
163                 throw new IllegalArgumentException("Bad pipe ID in header");
164             }
165             return true;
166         }
167
168         if (elem.getName().equals(TTLTag)) {
169             TTL = Integer.parseInt(elem.getTextValue());
170             return true;
171         }
172
173         // IGNORE obsolete element "VisitedPeer"
174         return elem.getName().equals(PeerTag);
175
176     }
177
178     /**
179      * internal method to process a document into a header.
180      *
181      * @param root where to start.
182      */
183     protected void initialize(Element root) {
184         if (!XMLElement.class.isInstance(root)) {
185             throw new IllegalArgumentException(getClass().getName() + " only supports XLMElement");
186         }
187
188         XMLElement doc = (XMLElement) root;
189         String doctype = doc.getName();
190         String typedoctype = "";
191         Attribute itsType = doc.getAttribute("type");
192
193         if (null != itsType) {
194             typedoctype = itsType.getValue();
195         }
196
197         if (!doctype.equals(Name) && !Name.equals(typedoctype)) {
198             throw new IllegalArgumentException(
199                     "Could not construct : " + getClass().getName() + "from doc containing a " + doc.getName());
200         }
201
202         Enumeration elements = doc.getChildren();
203         while (elements.hasMoreElements()) {
204             XMLElement elem = (XMLElement) elements.nextElement();
205
206             if (!handleElement(elem)) {
207                 if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
208                     LOG.fine("Unhandled Element: " + elem.getName());
209                 }
210             }
211         }
212
213         // Sanity Check!
214
215         if (null == getMsgId()) {
216             throw new IllegalArgumentException("Header does not contain a message id");
217         }
218
219         if (ID.nullID == getPipeID()) {
220             throw new IllegalArgumentException("Header does not contain a pipe id");
221         }
222
223         if (TTL < 1) {
224             throw new IllegalArgumentException("TTL must be >= 1");
225         }
226     }
227
228     /**
229      * Returns the docment for this header
230      *
231      * @param encodeAs mime type encoding
232      * @return the docment for this header
233      */
234     public Document getDocument(MimeMediaType encodeAs) {
235         StructuredTextDocument doc = (StructuredTextDocument)
236                 StructuredDocumentFactory.newStructuredDocument(encodeAs, Name);
237
238         if (doc instanceof XMLDocument) {
239             ((XMLDocument) doc).addAttribute("xmlns:jxta", "http://jxta.org");
240         }
241
242         if (null == getMsgId()) {
243             throw new IllegalStateException("Message id is not initialized");
244         }
245
246         if (ID.nullID == getPipeID()) {
247             throw new IllegalStateException("PipeID is not initialized");
248         }
249
250         if (TTL < 1) {
251             throw new IllegalStateException("TTL must be >= 1");
252         }
253
254         Element e;
255         if ((srcPeer != null) && (srcPeer != ID.nullID)) {
256             e = doc.createElement(SrcTag, srcPeer.toString());
257             doc.appendChild(e);
258         }
259
260         e = doc.createElement(PipeIdTag, getPipeID().toString());
261         doc.appendChild(e);
262
263         e = doc.createElement(MsgIdTag, getMsgId());
264         doc.appendChild(e);
265
266         e = doc.createElement(TTLTag, Integer.toString(TTL));
267         doc.appendChild(e);
268
269         return doc;
270     }
271 }