001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    
019    package org.activemq.transport;
020    import java.lang.ref.WeakReference;
021    import java.net.InetAddress;
022    import java.net.InetSocketAddress;
023    import java.net.URI;
024    import java.net.UnknownHostException;
025    import java.util.Iterator;
026    import java.util.List;
027    
028    import javax.jms.JMSException;
029    
030    import org.apache.commons.logging.Log;
031    import org.apache.commons.logging.LogFactory;
032    
033    import EDU.oswego.cs.dl.util.concurrent.CopyOnWriteArrayList;
034    
035    /**
036     * An abstract base class useful for implementation inheritance
037     * 
038     * @version $Revision: 1.1.1.1 $
039     */
040    public abstract class TransportServerChannelSupport implements TransportServerChannel {
041        private static final Log log = LogFactory.getLog(TransportServerChannelSupport.class);
042        private String url;
043        private TransportChannelListener transportChannelListener;
044        private List channels = new CopyOnWriteArrayList();
045    
046        public TransportServerChannelSupport(URI url) {
047            this(url.toString());
048        }
049    
050        public TransportServerChannelSupport(String url) {
051            this.url = url;
052        }
053    
054        public void start() throws JMSException {
055            if (transportChannelListener == null) {
056                throw new JMSException("Must have a TransportChannelListener attached!");
057            }
058        }
059    
060        public synchronized void stop() throws JMSException {
061            for (Iterator iter = channels.iterator();iter.hasNext();) {
062                WeakReference channelRef = (WeakReference) iter.next();            
063                TransportChannel channel = (TransportChannel) channelRef.get();
064                if( channel!=null )
065                    channel.stop();
066            }
067        }
068    
069        public TransportChannelListener getTransportChannelListener() {
070            return transportChannelListener;
071        }
072    
073        public void setTransportChannelListener(TransportChannelListener listener) {
074            this.transportChannelListener = listener;
075        }
076    
077        public String getUrl() {
078            return url;
079        }
080    
081        public void setUrl(String url) {
082            this.url = url;
083        }
084    
085        public InetSocketAddress getSocketAddress() {
086            return null;
087        }
088    
089        /**
090         * Add a channel
091         * @param channel
092         */
093        public synchronized void addClient(TransportChannel channel) {
094            if (transportChannelListener == null) {
095                log.warn("No listener attached, cannot add channel: " + channel);
096            }
097            else {
098                transportChannelListener.addClient(channel);
099                channel.setTransportChannelListener(transportChannelListener);
100                channels.add(new WeakReference(channel));
101            }
102        }
103        
104        /**
105         * remove a channel
106         * @param channel
107         */
108        public synchronized void removeClient(TransportChannel channel){
109            for (Iterator iter = channels.iterator();iter.hasNext();) {
110                WeakReference channelRef = (WeakReference) iter.next();            
111                TransportChannel c = (TransportChannel) channelRef.get();
112                if( c!=null && c.equals(channel)){
113                    channels.remove(channelRef);
114                    break;
115                }
116            }
117        }
118    
119        protected String resolveHostName(String hostName) {
120            String result = hostName;
121            try {
122                //hostname can be null for vm:// protocol ...
123                if (hostName != null && (hostName.equalsIgnoreCase("localhost") || hostName.equals("127.0.0.1"))) {
124                    result = InetAddress.getLocalHost().getHostName();
125                }
126            }
127            catch (UnknownHostException e) {
128                log.debug("failed to resolve hostname", e);
129            }
130            return result;
131        }
132    }