]> sjero.net Git - linphone/blob - p2pproxy/dependencies-src/jxse-src-2.5/impl/src/net/jxta/impl/endpoint/cbjx/CbJxMessenger.java
remove mediastreamer2 and add it as a submodule instead.
[linphone] / p2pproxy / dependencies-src / jxse-src-2.5 / impl / src / net / jxta / impl / endpoint / cbjx / CbJxMessenger.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.endpoint.cbjx;
57
58
59 import net.jxta.endpoint.EndpointAddress;
60 import net.jxta.endpoint.Message;
61 import net.jxta.endpoint.Messenger;
62 import net.jxta.impl.endpoint.BlockingMessenger;
63 import net.jxta.logging.Logging;
64
65 import java.io.IOException;
66 import java.util.logging.Level;
67 import java.util.logging.Logger;
68
69
70 /**
71  * This class is the Messenger used to send CbJx Messages
72  */
73 public class CbJxMessenger extends BlockingMessenger {
74
75     /**
76      * Logger
77      */
78     private final static transient Logger LOG = Logger.getLogger(CbJxMessenger.class.getName());
79
80     /**
81      * the new destination address computed by the CbJx Endpoint
82      * this address is of the form jxta://<peerID>/CbJxService/<peerGroupID>
83      */
84     private final EndpointAddress newDestAddr;
85
86     /**
87      * A string which we can lock on while acquiring new messengers. We don't
88      * want to lock the whole object.
89      */
90     private final Object acquireMessengerLock = new String("Messenger Acquire Lock");
91
92     /**
93      * Cached messenger for sending to {@link #newDestAddr}
94      */
95     private Messenger outBoundMessenger = null;
96
97     /**
98      *  The transport we are working for.
99      */
100     private final CbJxTransport transport;
101
102     /**
103      * constructor
104      *
105      * @param dest the destination address
106      */
107     public CbJxMessenger(CbJxTransport transport, EndpointAddress dest, Object hintIgnored) throws IOException {
108         this(transport, dest);
109     }
110
111     /**
112      * constructor
113      *
114      * @param dest the destination address
115      */
116     public CbJxMessenger(CbJxTransport transport, EndpointAddress dest) throws IOException {
117
118         // Do not use self destruction. There's nothing we have that can't just let be GC'ed
119         super(transport.group.getPeerGroupID(), dest, false);
120
121         this.transport = transport;
122
123         newDestAddr = new EndpointAddress("jxta", dest.getProtocolAddress(), CbJxTransport.cbjxServiceName, null);
124
125         outBoundMessenger = transport.endpoint.getMessengerImmediate(newDestAddr, null);
126
127         if (null == outBoundMessenger) {
128             if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) {
129                 LOG.severe("Could not get messenger for " + newDestAddr);
130             }
131
132             throw new IOException("Could not get messenger for " + newDestAddr);
133         }
134     }
135
136     /**
137      * {@inheritDoc}
138      */
139     @Override
140     public void closeImpl() {
141         synchronized (acquireMessengerLock) {
142             outBoundMessenger.close();
143             outBoundMessenger = null;
144         }
145     }
146
147     /**
148      * {@inheritDoc}
149      */
150     @Override
151     public EndpointAddress getLogicalDestinationImpl() {
152         return newDestAddr;
153     }
154
155     /**
156      * {@inheritDoc}
157      * <p/>
158      * Since CbJx is a virtual transport and consumes very few resources there
159      * is no point to doing idle teardown.
160      */
161     @Override
162     public boolean isIdleImpl() {
163         return false;
164     }
165
166     /**
167      * {@inheritDoc}
168      */
169     @Override
170     public void sendMessageBImpl(Message msg, String service, String serviceParam) throws IOException {
171         msg = msg.clone();
172
173         EndpointAddress destAddressToUse = getDestAddressToUse(service, serviceParam);
174
175         if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
176             LOG.fine("Messenger: sending out " + msg + " to: " + destAddressToUse);
177         }
178
179         // add the cbjx info to the message
180         msg = transport.addCryptoInfo(msg, destAddressToUse);
181
182             if (isClosed()) {
183                 IOException failure = new IOException("Messenger was closed, it cannot be used to send messages.");
184
185                 if (Logging.SHOW_INFO && LOG.isLoggable(Level.INFO)) {
186                     LOG.info(failure.toString());
187                 }
188
189                 throw failure;
190             }
191
192             // and sends out the message
193         sendTo( msg );
194     }
195
196     /**
197      * Send a message via the underlying messenger.
198      *
199      * @param msg The message to send to the remote peer.
200      * @throws IOException if there was a problem sending the message.
201      **/
202     void sendTo( Message msg ) throws IOException {
203
204         synchronized (acquireMessengerLock) {
205             if ((null == outBoundMessenger) || outBoundMessenger.isClosed()) {
206
207                 if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
208                     LOG.fine("Getting messenger for " + newDestAddr);
209                 }
210
211                 outBoundMessenger = transport.endpoint.getMessengerImmediate(newDestAddr, null);
212
213                 if (outBoundMessenger == null) {
214                     if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) {
215                         LOG.severe("Could not get messenger for " + newDestAddr);
216                     }
217
218                     throw new IOException("Underlying messenger could not be repaired");
219                 }
220             }
221         }
222
223         if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
224             LOG.fine("Sending " + msg + " to endpoint " + newDestAddr);
225         }
226
227         // Good we have a messenger. Send the message.
228         outBoundMessenger.sendMessageB(msg, null, null);
229     }
230 }