2 * Copyright (c) 2001-2007 Sun Microsystems, Inc. All rights reserved.
4 * The Sun Project JXTA(TM) Software License
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
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.
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.
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.
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.
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.
41 * JXTA is a registered trademark of Sun Microsystems, Inc. in the United
42 * States and other countries.
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.
48 * ====================================================================
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.
54 * This license is based on the BSD license adopted by the Apache Foundation.
57 package net.jxta.impl.endpoint.tls;
62 import java.util.logging.Logger;
63 import java.util.logging.Level;
64 import net.jxta.logging.Logging;
66 import net.jxta.endpoint.*;
67 import net.jxta.impl.endpoint.*;
68 import net.jxta.impl.endpoint.tls.TlsConn.HandshakeState;
72 * This class implements sending messages through a TLS connection.
74 public class TlsMessenger extends BlockingMessenger {
76 private static final Logger LOG = Logger.getLogger(TlsMessenger.class.getName());
78 private TlsTransport transport = null;
79 private TlsConn conn = null;
82 * The source address of messages sent on this messenger.
84 private final EndpointAddress srcAddress;
86 private final MessageElement srcAddressElement;
88 TlsMessenger(EndpointAddress destAddress, TlsConn conn, TlsTransport tp) {
90 // No need for self destruction.
91 super(tp.getPeerGroup().getPeerGroupID(), destAddress, false);
94 if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
95 LOG.fine("null TLS connection!");
97 throw new IllegalArgumentException("null TLS connection!");
103 this.srcAddress = transport.getPublicAddress();
105 srcAddressElement = new StringMessageElement(EndpointServiceImpl.MESSAGE_SOURCE_NAME, srcAddress.toString()
107 (MessageElement) null);
111 * The cost of just having a finalize routine is high. The finalizer is
112 * a bottleneck and can delay garbage collection all the way to heap
113 * exhaustion. Leave this comment as a reminder to future maintainers.
114 * Below is the reason why finalize is not needed here.
116 * These messengers never go to the application layer. The endpoint code
117 * always invokes close when needed.
119 protected void finalize() {
128 public synchronized void closeImpl() {
137 public boolean isIdleImpl() {
138 // No need for self destruction.
145 * <p/>The peer that is the destination is the logical address
148 public EndpointAddress getLogicalDestinationImpl() {
149 return new EndpointAddress("jxta", dstAddress.getProtocolAddress(), null, null);
156 public synchronized void sendMessageBImpl(Message message, String service, String serviceParam) throws IOException {
158 if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
159 LOG.fine("Starting send for " + message);
162 // check if the connection has died.
163 if (HandshakeState.CONNECTIONDEAD == conn.getHandshakeState()) {
165 // FIXME - jice@jxta.org 20040413: This will do but it causes the below exception to be shown as the cause of the
166 // failure, which is not true: nobody realy closed the messenger before it failed. It failed first. Also, it used to
167 // shutdown this messenger, now it does not. What does is the call to closeImpl() that follows our IOException...(and
168 // that's how it should be). Transports should get a deeper retrofit eventually.
174 IOException failure = new IOException("Messenger is closed, it cannot be used to send messages.");
176 if (Logging.SHOW_WARNING && LOG.isLoggable(Level.WARNING)) {
177 LOG.log(Level.WARNING, failure.getMessage(), failure);
183 // Set the message with the appropriate src and dest address
184 message.replaceMessageElement(EndpointServiceImpl.MESSAGE_SOURCE_NS, srcAddressElement);
186 MessageElement dstAddressElement = new StringMessageElement(EndpointServiceImpl.MESSAGE_DESTINATION_NAME
188 getDestAddressToUse(service, serviceParam).toString(), (MessageElement) null);
190 message.replaceMessageElement(EndpointServiceImpl.MESSAGE_DESTINATION_NS, dstAddressElement);
192 // Give the message to the TLS connection
194 conn.sendMessage(message);
195 } catch (IOException caught) {
197 if (Logging.SHOW_SEVERE && LOG.isLoggable(Level.SEVERE)) {
198 LOG.log(Level.SEVERE, "Message send to \'" + dstAddress + "\' failed for " + message, caught);
203 if (Logging.SHOW_FINE && LOG.isLoggable(Level.FINE)) {
204 LOG.fine("Message send to \'" + dstAddress + "\' succeeded for " + message);