Changeset 309

Show
Ignore:
Timestamp:
03/16/06 08:53:42 (3 years ago)
Author:
alban
Message:

[Bug 11] first release of an UDP transport

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/.classpath

    r73 r309  
    22<classpath> 
    33        <classpathentry kind="src" path="source"/> 
    4         <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    54        <classpathentry kind="lib" path="track/commons-cli/releases/1.0/commons-cli-1.0.jar"/> 
    65        <classpathentry kind="lib" path="track/commons-collections/releases/3.1/commons-collections-3.1.jar"/> 
     
    2625        <classpathentry kind="lib" path="track/tritonus/patches/0.3.6/tritonus-vorbis.jar"/> 
    2726        <classpathentry kind="lib" path="track/vorbisspi/releases/1.0.2/lib/tritonus_share.jar"/> 
     27        <classpathentry kind="lib" path="track/commons-discovery/releases/0.2/commons-discovery.jar"/> 
     28        <classpathentry sourcepath="track/mina/releases/0.9.2/core/src" kind="lib" path="track/mina/releases/0.9.2/mina-core-0.9.2.jar"/> 
     29        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    2830        <classpathentry kind="output" path=".eclipse"/> 
    2931</classpath> 
  • trunk/build.properties

    r62 r309  
    99track.commons.compress.dir=${track.dir}/commons-compress/patches/1.0-dev-kolaka20041211 
    1010track.commons.compress.jar=${track.commons.compress.dir}/commons-compress-0.1-dev.jar 
    11 track.commons.logging.url=http://mir2.ovh.net/ftp.apache.org/dist/jakarta/commons/logging/binaries/commons-logging-1.0.4.tar.gz 
    12 track.commons.logging.dir=${track.dir}/commons-logging/releases/1.0.4 
    13 track.commons.logging.jar=${track.commons.logging.dir}/commons-logging.jar 
     11track.commons.logging.url=http://resources.tryphon.org/kolaka/track/commons/logging/commons-logging-20060312.tar.gz 
     12track.commons.logging.dir=${track.dir}/commons-logging/releases/1.1.0 
     13track.commons.logging.jar=${track.commons.logging.dir}/commons-logging-1.1-RC5.jar 
    1414track.xmlreleasenotes.dir=${track.dir}/xmlreleasenotes/releases/0.17.2 
    1515track.ant-jxr.dir=track/ant-jxr/releases/1.0 
  • trunk/build.xml

    r264 r309  
    7777 
    7878        <target name="prepare.track.commons-logging.download" depends="prepare.track.commons-logging.download.check" unless="prepare.track.commons-logging.download.notRequired"> 
    79                 <prepare.track.httpdownload url="${track.commons.logging.url}" target="${track.commons.logging.dir}" prefix="commons-logging-1.0.4" /> 
     79                <prepare.track.httpdownload url="${track.commons.logging.url}" target="${track.commons.logging.dir}" prefix="commons-logging" /> 
    8080        </target> 
    8181 
     
    193193                        </library> 
    194194 
     195                        <library id="lib.mina"> 
     196                                <lib-entry groupid="mina" version="0.9.2" artifactid="mina-core" /> 
     197                                <lib-entry groupid="slf4j" version="1.0" artifactid="slf4j-log4j12" /> 
     198                        </library> 
     199 
    195200                        <library id="core"> 
    196201                                <lib-entry groupid="commons-collections" version="3.1" /> 
    197                                 <lib-entry groupid="commons-logging" version="1.0.4" /> 
     202                                <lib-entry groupid="commons-logging" version="1.1.0" artifactid="commons-logging-1.1-RC5" /> 
    198203                                <lib-entry groupid="commons-cli" version="1.0" /> 
    199204                                <lib-entry groupid="commons-codec" version="1.3" /> 
    200205                                <lib-entry groupid="commons-io" version="1.0" /> 
    201206                                <lib-entry groupid="commons-discovery" version="0.2" /> 
    202                                 <lib-entry groupid="log4j" version="1.2.9" /> 
     207                                <lib-entry groupid="log4j" version="1.2.13" /> 
    203208                                <lib-entry groupid="commons-lang" version="nightly-20041229" artifactid="commons-lang-2.0" /> 
    204209                                <lib-entry groupid="commons-configuration" version="nightly-20050307" artifactid="commons-configuration-1.1RC2" /> 
    205210                                <lib-entry groupid="concurrent" version="kolaka" /> 
     211                                <library refid="lib.mina" /> 
    206212                        </library> 
    207213 
  • trunk/source/org/kolaka/freecast/NodeConfigurator.java

    r71 r309  
    4242import org.kolaka.freecast.net.InetSocketAddressSpecification; 
    4343import org.kolaka.freecast.net.InetSocketAddressSpecificationParser; 
     44import org.kolaka.freecast.net.SpecificationDatagramSelector; 
    4445import org.kolaka.freecast.net.SpecificationServerSocketBinder; 
    4546import org.kolaka.freecast.node.ConfigurableNode; 
     
    6566import org.kolaka.freecast.resource.ResourceLocator; 
    6667import org.kolaka.freecast.resource.ResourceLocators; 
    67 import org.kolaka.freecast.transport.SocketPeerConnectionFactory; 
    68 import org.kolaka.freecast.transport.SocketPeerConnectionSource
     68import org.kolaka.freecast.transport.MinaPeerReceivingConnectionFactory; 
     69import org.kolaka.freecast.transport.MinaPeerSendingConnectionFactory
    6970import org.kolaka.freecast.transport.receiver.BandwidthControler; 
    7071import org.kolaka.freecast.transport.receiver.EncoderFormat; 
     
    132133                                InetSocketAddressSpecification listenAddressSpecification = loadInetSocketAddressSpecification(listenAddressConfiguration); 
    133134 
    134                                 InetSocketAddress listenAddress = SpecificationServerSocketBinder 
     135                                InetSocketAddress listenAddress = new SpecificationDatagramSelector() 
    135136                                                .select(listenAddressSpecification); 
    136137 
     
    138139                                                "install a PeerSenderControler which can accept other peers at " 
    139140                                                                + listenAddress); 
    140                                 peerControler.register(new SocketPeerConnectionSource( 
    141                                                 listenAddress)); 
    142                                 node.setSenderControler(new PeerSenderControler()); 
     141                                MinaPeerSendingConnectionFactory sendingFactory = new MinaPeerSendingConnectionFactory(listenAddress); 
     142                                peerControler.register(sendingFactory); 
     143                                sendingFactory.setStatusProvider(node.getNodeStatusProvider()); 
     144                                 
     145                                node.setSenderControler(new PeerSenderControler(sendingFactory)); 
    143146 
    144147                                PeerReferenceLoader peerReferenceLoader = new PeerReferenceLoader(); 
     
    211214                        receiver = new ShoutServerReceiver(listenAddress); 
    212215                } else if (receiverClass.equals("peer")) { 
    213                         peerControler.register(new SocketPeerConnectionFactory()); 
    214                         receiverControler = new PeerReceiverControler(peerControler); 
     216                        MinaPeerReceivingConnectionFactory connectionFactory = new MinaPeerReceivingConnectionFactory(); 
     217                        peerControler.register(connectionFactory); 
     218                        connectionFactory.setStatusProvider(node.getNodeStatusProvider()); 
     219                        receiverControler = new PeerReceiverControler(peerControler, connectionFactory); 
    215220                } else { 
    216221                        throw new ConfigurationException("Unknown receiver class: '" 
  • trunk/source/org/kolaka/freecast/config/resources/defaults-manager.xml

    r75 r309  
    1010                        <url>http://download.freecast.org/jws/default/audio.m3u</url> 
    1111                        <bandwidth>40</bandwidth> 
    12                         <checksummer> 
    13                                 <class>digest</class> 
    14                         </checksummer> 
    1512                </receiver> 
    1613        <sender> 
  • trunk/source/org/kolaka/freecast/manager/gui/MainFrame.java

    r75 r309  
    4545import org.kolaka.freecast.node.ConfigurableNode; 
    4646import org.kolaka.freecast.node.Node; 
     47import org.kolaka.freecast.peer.Peer; 
    4748import org.kolaka.freecast.peer.PeerControler; 
    4849import org.kolaka.freecast.peer.PeerReference; 
     
    221222 
    222223                        PeerControler.Auditor peerAuditor = new PeerControler.Auditor() { 
    223                                 public void acceptConnection(PeerReference reference) { 
    224  
    225                                 } 
    226  
    227                                 public void closeConnection(PeerReference reference) { 
     224                                public void acceptConnection(Peer peer) { 
     225 
     226                                } 
     227 
     228                                public void closeConnection(Peer peer) { 
    228229 
    229230                                } 
  • trunk/source/org/kolaka/freecast/net/SpecificationServerSocketBinder.java

    r71 r309  
    6666        } 
    6767 
     68        // TODO incompatible with UDP acceptor ... 
    6869        public static InetSocketAddress select( 
    6970                        InetSocketAddressSpecification specification) throws IOException { 
  • trunk/source/org/kolaka/freecast/node/DefaultNode.java

    r75 r309  
    2424package org.kolaka.freecast.node; 
    2525 
    26 import java.beans.PropertyChangeEvent; 
    27 import java.beans.PropertyChangeListener; 
    2826import java.util.Iterator; 
    2927import java.util.Set; 
     
    3533import org.kolaka.freecast.node.event.NodeStatusSupport; 
    3634import org.kolaka.freecast.peer.ConfigurablePeerControler; 
    37 import org.kolaka.freecast.peer.Peer; 
    3835import org.kolaka.freecast.peer.PeerConnection; 
    3936import org.kolaka.freecast.peer.PeerControler; 
     37import org.kolaka.freecast.peer.PeerReceivingConnection; 
    4038import org.kolaka.freecast.peer.PeerReference; 
     39import org.kolaka.freecast.peer.PeerStatus; 
     40import org.kolaka.freecast.peer.event.PeerStatusEvent; 
     41import org.kolaka.freecast.peer.event.PeerStatusListener; 
    4142import org.kolaka.freecast.pipe.DefaultPipe; 
    4243import org.kolaka.freecast.pipe.Pipe; 
     
    4950import org.kolaka.freecast.transport.receiver.ReceiverControler; 
    5051import org.kolaka.freecast.transport.sender.NullSenderControler; 
    51 import org.kolaka.freecast.transport.sender.PeerSenderControler; 
    5252import org.kolaka.freecast.transport.sender.SenderControler; 
    5353 
     
    9191                nodeService.init(); 
    9292 
    93                 if (receiverControler instanceof PeerReceiverControler) { 
    94                         ((PeerReceiverControler) receiverControler) 
    95                                         .setPeerControler(peerControler); 
    96                 } 
    97  
    98                 if (senderControler instanceof PeerSenderControler) { 
    99                         ((PeerSenderControler) senderControler) 
    100                                         .setPeerControler(peerControler); 
    101                 } 
    102  
    103                 peerControler.addPeerListener(new PeerPropertyChangeListener()); 
    104  
     93                peerControler.add(peerStatusListener); 
    10594                 
    10695                senderControler.setPipe(pipe); 
     
    228217 
    229218        protected void changeOrder(Order order) { 
    230                 LogFactory.getLog(getClass()).debug("set order to " + order); 
    231                 this.order = order; 
    232                 nodeStatusProvider.fireNodeStatus(); 
     219                if (!this.order.equals(order)) { 
     220                        LogFactory.getLog(getClass()).debug("set order to " + order); 
     221                        this.order = order; 
     222                        nodeStatusProvider.fireNodeStatus(); 
     223                } 
    233224        } 
    234225 
    235226        private final StatusProvider nodeStatusProvider = new StatusProvider(); 
     227         
     228        public StatusProvider getNodeStatusProvider() { 
     229                return nodeStatusProvider; 
     230        } 
    236231 
    237232        class StatusProvider implements NodeStatusProvider { 
    238233 
    239                 private NodeStatusSupport support = new NodeStatusSupport(); 
     234                private final NodeStatusSupport support = new NodeStatusSupport(); 
     235                 
     236                public NodeIdentifier getNodeIdentifier() { 
     237                        return identifier; 
     238                } 
    240239 
    241240                public void add(NodeStatusListener listener) { 
     
    307306                return ToStringBuilder.reflectionToString(this); 
    308307        } 
    309  
    310         class PeerPropertyChangeListener implements PropertyChangeListener
    311  
    312                 public void propertyChange(PropertyChangeEvent event) { 
    313                         LogFactory.getLog(getClass()).debug("receive " + event); 
    314                         Peer peer = (Peer) event.getSource(); 
    315                         if (peer.isConnected() 
    316                                        && peer.getConnection().getType().equals( 
    317                                                        PeerConnection.Type.SOURCE)) { 
    318                                 changeOrder(peer.getOrder().lower()); 
     308         
     309        private PeerStatusListener peerStatusListener = new  PeerStatusListener()
     310                 
     311                public void peerStatusChanged(PeerStatusEvent event) { 
     312                        PeerStatus status = event.getStatus(); 
     313                        if (event.getSource() instanceof PeerReceivingConnection) { 
     314                               PeerReceivingConnection connection = (PeerReceivingConnection) event.getSource(); 
     315                                if (connection.getStatus().equals(PeerConnection.Status.ACTIVATED)) { 
     316                                        changeOrder(status.getOrder().lower()); 
     317                                } 
    319318                        } 
    320319                } 
    321  
    322         } 
     320                 
     321        }; 
    323322 
    324323} 
  • trunk/source/org/kolaka/freecast/node/DefaultNodeIdentifier.java

    r71 r309  
    5959                return new HashCodeBuilder().append(value).toHashCode(); 
    6060        } 
     61         
     62        public long longValue() { 
     63                return value; 
     64        } 
    6165 
    6266        public String toString() { 
  • trunk/source/org/kolaka/freecast/node/Node.java

    r71 r309  
    2424package org.kolaka.freecast.node; 
    2525 
     26import org.kolaka.freecast.node.DefaultNode.StatusProvider; 
    2627import org.kolaka.freecast.peer.PeerControler; 
    2728import org.kolaka.freecast.peer.PeerReference; 
     
    5354 
    5455        public NodeStatus getNodeStatus(); 
     56         
     57        StatusProvider getNodeStatusProvider(); 
    5558 
    5659        public void checkQoS(); 
  • trunk/source/org/kolaka/freecast/node/NodeIdentifier.java

    r71 r309  
    4343        public abstract boolean equals(NodeIdentifier identifier); 
    4444 
    45         public abstract int hashCode(); 
     45        public abstract long longValue(); 
    4646 
    4747        public String toString() { 
  • trunk/source/org/kolaka/freecast/node/NodeStatusProvider.java

    r71 r309  
    3333public interface NodeStatusProvider { 
    3434 
     35        public NodeIdentifier getNodeIdentifier(); 
     36         
    3537        public NodeStatus getNodeStatus(); 
    3638 
  • trunk/source/org/kolaka/freecast/node/Order.java

    r71 r309  
    8080                return new Order(value + 1); 
    8181        } 
     82         
     83        /** 
     84         * Note that order:1 is lower than order:0 .. 
     85         *  
     86         * @param other 
     87         * @return 
     88         */ 
     89        public boolean isLower(Order other) { 
     90                return value > other.value; 
     91        } 
    8292 
    8393        public static Order getInstance(int value) { 
  • trunk/source/org/kolaka/freecast/packet/DefaultPacket.java

    r71 r309  
    7979                return other != null && sequenceNumber == other.sequenceNumber; 
    8080        } 
     81         
     82        public int hashCode() { 
     83                return (int) (sequenceNumber % Integer.MAX_VALUE); 
     84        } 
    8185 
    8286        public String toString() { 
  • trunk/source/org/kolaka/freecast/packet/LogicalPageBuilder.java

    r71 r309  
    2828import org.apache.commons.lang.Validate; 
    2929import org.apache.commons.lang.builder.ToStringBuilder; 
     30import org.apache.commons.logging.LogFactory; 
    3031import org.kolaka.freecast.collections.SortedList; 
    3132 
     
    5455 
    5556        public void add(Packet packet) { 
     57                if (packets.contains(packet)) { 
     58                        LogFactory.getLog(getClass()).debug("duplicate packet received: " + packet); 
     59                        return; 
     60                } 
    5661                packets.add(packet); 
    5762        } 
  • trunk/source/org/kolaka/freecast/packet/Packet.java

    r71 r309  
    3131public interface Packet extends SequenceElement, PacketData { 
    3232 
    33         public static final int DEFAULT_SIZE = 1024
     33        public static final int DEFAULT_SIZE = 1300
    3434 
    3535        public Checksum getChecksum(); 
  • trunk/source/org/kolaka/freecast/peer/BasePeerConnection1.java

    r254 r309  
    4848import org.kolaka.freecast.transport.ProxyMessageWriter; 
    4949 
    50 public abstract class BasePeerConnection implements PeerConnection
     50public abstract class BasePeerConnection1 extends BasePeerConnection implements PeerConnection1
    5151 
    5252        private Peer peer; 
     
    5555 
    5656        // private PeerReference peerReference; 
    57         private final PeerConnection.Type type; 
    58  
    59         private PeerConnection.Status status = PeerConnection.Status.OPENING; 
     57        private final PeerConnection1.Type type; 
    6058 
    6159        private MessageWriter writer; 
     
    6361        private MessageReader reader; 
    6462 
    65         protected BasePeerConnection(PeerConnection.Type type) { 
     63        protected BasePeerConnection1(PeerConnection1.Type type) { 
    6664                this.type = type; 
    6765        } 
    6866 
    69         public PeerConnection.Type getType() { 
     67        public PeerConnection1.Type getType() { 
    7068                return type; 
    71         } 
    72  
    73         public PeerConnection.Status getStatus() { 
    74                 return status; 
    7569        } 
    7670 
     
    8882        } 
    8983 
    90         protected void setStatus(PeerConnection.Status status) { 
    91                 if (ObjectUtils.equals(status, this.status)) { 
    92                         return; 
    93                 } 
    94  
    95                 LogFactory.getLog(getClass()).debug("set status " + status); 
    96  
    97                 this.status = status; 
    98                 support.fireStatus(status); 
    99         } 
    100  
    10184        private void sendStatus(PeerConnection.Status status) { 
    10285                SendStatusTask sendStatus = new SendStatusTask(status); 
     
    119102                this.timer = timer; 
    120103        } 
     104         
     105        public PeerStatus getRemoteStatus() { 
     106                return getLastPeerStatus(); 
     107        } 
    121108 
    122109        public PeerStatus getLastPeerStatus() { 
     
    137124                lastPeerStatusUpdate = timeBase.currentTimeMillis(); 
    138125                if (peer != null) { 
    139                         peer.update(status); 
     126                        ((MutablePeer) peer).update(status); 
    140127                } else { 
    141128                        lastPeerStatus = status; 
     
    201188                 * messages 
    202189                 */ 
    203                 if (type.equals(PeerConnection.Type.RELAY)) { 
     190                if (type.equals(PeerConnection1.Type.RELAY)) { 
    204191                        receiveLoop = new ReceiveLoop(); 
    205192                        timer.execute(receiveLoop); 
     
    213200        public void close() { 
    214201                LogFactory.getLog(getClass()).debug("close"); 
    215                 if (status.equals(PeerConnection.Status.CLOSING) || status.equals(PeerConnection.Status.CLOSED)) { 
     202                if (getStatus().equals(PeerConnection.Status.CLOSING) || getStatus().equals(PeerConnection.Status.CLOSED)) { 
    216203                        return; 
    217204                } 
     
    256243        protected abstract void disposeImpl() throws PeerConnectionException; 
    257244 
    258         private PeerConnectionStatusSupport support = new PeerConnectionStatusSupport(this); 
    259  
    260         public void add(PeerConnectionStatusListener listener) { 
    261                 support.add(listener); 
    262         } 
    263  
    264         public void remove(PeerConnectionStatusListener listener) { 
    265                 support.remove(listener); 
    266         } 
    267  
    268  
    269245        class FilterWriter extends ProxyMessageWriter { 
    270246 
     
    274250 
    275251                public int write(Message message) throws IOException { 
    276                         if (status.equals(PeerConnection.Status.CLOSED)) { 
    277                                 throw new NotOpenConnectionException(status); 
     252                        if (getStatus().equals(PeerConnection.Status.CLOSED)) { 
     253                                throw new NotOpenConnectionException(getStatus()); 
    278254                        } 
    279255 
     
    291267 
    292268                private void checkClosed() throws EOFException { 
    293                         if (status.equals(PeerConnection.Status.CLOSED)) { 
     269                        if (getStatus().equals(PeerConnection.Status.CLOSED)) { 
    294270                                throw new EOFException("connection is closed"); 
    295271                        } 
     
    348324 
    349325                public void run() { 
    350                         NDC.push(BasePeerConnection.this.toString()); 
     326                        NDC.push(BasePeerConnection1.this.toString()); 
    351327 
    352328                        try { 
     
    424400                                message = getReader().read(); 
    425401                        } catch (EOFException e) { 
    426                                 if (status.equals(PeerConnection.Status.CLOSED)) { 
     402                                if (getStatus().equals(PeerConnection.Status.CLOSED)) { 
    427403                                        LogFactory.getLog(getClass()).debug( 
    428404                                                        "reader stopped for " + this, e); 
     
    433409                                                "connection read stream ended", e); 
    434410                        } catch (IOException e) { 
    435                                 if (status.equals(PeerConnection.Status.CLOSED)) { 
     411                                if (getStatus().equals(PeerConnection.Status.CLOSED)) { 
    436412                                        LogFactory.getLog(getClass()).debug( 
    437413                                                        "reader stopped for " + this, e); 
     
    454430                        long now = timeBase.currentTimeMillis(); 
    455431                        if (now - lastPeerStatusUpdate > DefaultTimer.minutes(1)) { 
    456                                 String msg = "status update timeout on " + BasePeerConnection.this 
     432                                String msg = "status update timeout on " + BasePeerConnection1.this 
    457433                                                + ", connection is disposed"; 
    458434                                LogFactory.getLog(getClass()).info(msg); 
  • trunk/source/org/kolaka/freecast/peer/ConfigurablePeerControler.java

    r71 r309  
    3838        public void register(PeerConnectionFactory factory); 
    3939 
    40         public void register(PeerConnectionSource source); 
    41  
    4240} 
  • trunk/source/org/kolaka/freecast/peer/DefaultPeer.java

    r71 r309  
    2424package org.kolaka.freecast.peer; 
    2525 
    26 import java.beans.PropertyChangeListener; 
    27 import java.beans.PropertyChangeSupport; 
     26import java.util.HashSet; 
     27import java.util.Iterator; 
     28import java.util.Set; 
    2829 
    2930import org.apache.commons.lang.ObjectUtils; 
    30 import org.apache.commons.lang.Validate; 
    3131import org.apache.commons.lang.builder.HashCodeBuilder; 
    3232import org.apache.commons.lang.builder.ToStringBuilder; 
     
    3434import org.kolaka.freecast.node.NodeIdentifier; 
    3535import org.kolaka.freecast.node.Order; 
    36 import org.kolaka.freecast.peer.event.PeerConnectionStatusEvent; 
    37 import org.kolaka.freecast.peer.event.PeerConnectionStatusListener; 
     36import org.kolaka.freecast.peer.event.PeerStatusEvent; 
     37import org.kolaka.freecast.peer.event.PeerStatusListener; 
    3838 
    3939/** 
     
    4242 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 
    4343 */ 
    44 public class DefaultPeer implements Peer { 
     44public class DefaultPeer implements MutablePeer { 
    4545 
    46         /** 
    47          * Identifies of the <code>Node</code> designed by this <code>Peer</code>. 
    48          * Can be null if unknown. 
    49          */ 
    5046        private NodeIdentifier identifier; 
    51  
    5247        private PeerReference reference; 
    53  
    5448        private Order order; 
    55  
    56         private ConnectivityScoring connectivityScoring; 
     49        private long latency = INFINITE_LATENCY; 
    5750 
    5851      &nbs