Changeset 830
- Timestamp:
- 09/05/06 23:17:07 (2 years ago)
- Files:
-
- trunk/source/org/kolaka/freecast/NodeConfigurator.java (modified) (4 diffs)
- trunk/source/org/kolaka/freecast/manager/gui/MainFrame.java (modified) (4 diffs)
- trunk/source/org/kolaka/freecast/node/DefaultNodeService.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java (added)
- trunk/source/org/kolaka/freecast/tracker/HessianClientInfoProvider.java (added)
- trunk/source/org/kolaka/freecast/tracker/HttpMultiTrackerConnector.java (added)
- trunk/source/org/kolaka/freecast/tracker/HttpMultiTrackerLocator.java (added)
- trunk/source/org/kolaka/freecast/tracker/HttpSimpleTrackerConnector.java (added)
- trunk/source/org/kolaka/freecast/tracker/HttpTracker.java (modified) (5 diffs)
- trunk/source/org/kolaka/freecast/tracker/HttpTrackerConfigurator.java (modified) (1 diff)
- trunk/source/org/kolaka/freecast/tracker/HttpTrackerLocator.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/Main.java (modified) (3 diffs)
- trunk/source/org/kolaka/freecast/tracker/MultiTracker.java (added)
- trunk/source/org/kolaka/freecast/tracker/MultiTrackerAdapter.java (added)
- trunk/source/org/kolaka/freecast/tracker/NetworkIdentifier.java (added)
- trunk/source/org/kolaka/freecast/tracker/ProtectedTracker.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/RemoteTracker.java (deleted)
- trunk/source/org/kolaka/freecast/tracker/Tracker.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/TrackerLocator.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/tracker/TrackerService.java (added)
- trunk/source/org/kolaka/freecast/tracker/test/TrackerServletTest.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/source/org/kolaka/freecast/NodeConfigurator.java
r405 r830 31 31 import java.text.ParseException; 32 32 import java.util.Iterator; 33 import java.util.NoSuchElementException; 33 34 import java.util.Set; 34 35 import java.util.TreeSet; … … 65 66 import org.kolaka.freecast.resource.ResourceLocator; 66 67 import org.kolaka.freecast.resource.ResourceLocators; 68 import org.kolaka.freecast.tracker.NetworkIdentifier; 67 69 import org.kolaka.freecast.transport.MinaPeerReceivingConnectionFactory; 68 70 import org.kolaka.freecast.transport.MinaPeerSendingConnectionFactory; … … 107 109 public void configure(ConfigurableNode node, Configuration configuration) 108 110 throws ConfigurationException, IOException { 109 Configuration trackerAddressConfiguration = configuration 110 .subset("peerprovider.trackeraddress");111 Configuration peerProviderConfiguration = configuration.subset("peerprovider"); 112 Configuration trackerAddressConfiguration = peerProviderConfiguration.subset("trackeraddress"); 111 113 InetSocketAddress trackerAddress = new InetSocketAddress( 112 114 trackerAddressConfiguration.getString("host"), … … 116 118 "install a NodeService connected to the tracker " 117 119 + trackerAddress); 118 node.setNodeService(new DefaultNodeService(trackerAddress)); 120 DefaultNodeService nodeService = new DefaultNodeService(trackerAddress); 121 122 try { 123 nodeService.setNetworkId(NetworkIdentifier.getInstance(peerProviderConfiguration.getString("networkid"))); 124 } catch (NoSuchElementException e) { 125 LogFactory.getLog(getClass()).trace("no network identifier in configuration", e); 126 } 127 128 node.setNodeService(nodeService); 119 129 120 130 ConfigurablePeerControler peerControler = new DefaultPeerControler(); trunk/source/org/kolaka/freecast/manager/gui/MainFrame.java
r691 r830 56 56 import org.kolaka.freecast.swing.ResourcesException; 57 57 import org.kolaka.freecast.tracker.Tracker; 58 import org.kolaka.freecast.tracker.TrackerService; 58 59 import org.kolaka.freecast.transport.receiver.Receiver; 59 60 import org.kolaka.freecast.transport.receiver.Receiver.Source; … … 68 69 private static final long serialVersionUID = -5807144656289901506L; 69 70 70 private final Tracker tracker;71 private final TrackerService tracker; 71 72 72 73 private final Node node; … … 78 79 private final Action setupAction; 79 80 80 public MainFrame(Resources resources, Tracker tracker, ConfigurableNode node,81 public MainFrame(Resources resources, TrackerService tracker, ConfigurableNode node, 81 82 InetSocketAddress publicHttpServer) throws ResourcesException { 82 83 super(resources); … … 176 177 private static final long serialVersionUID = 7865840587031612121L; 177 178 178 public TrackerControlPanel(Tracker tracker) {179 public TrackerControlPanel(TrackerService tracker) { 179 180 super("Tracker"); 180 181 trunk/source/org/kolaka/freecast/node/DefaultNodeService.java
r405 r830 32 32 import org.kolaka.freecast.service.ControlException; 33 33 import org.kolaka.freecast.service.LoopService; 34 import org.kolaka.freecast.tracker.HttpMultiTrackerLocator; 34 35 import org.kolaka.freecast.tracker.HttpTrackerLocator; 36 import org.kolaka.freecast.tracker.NetworkIdentifier; 35 37 import org.kolaka.freecast.tracker.Tracker; 36 38 import org.kolaka.freecast.tracker.TrackerException; … … 44 46 public class DefaultNodeService extends LoopService implements NodeService { 45 47 46 private ConfigurableNode node;48 private ConfigurableNode node; 47 49 48 private InetSocketAddress trackerAddress; 50 private InetSocketAddress trackerAddress; 51 private NetworkIdentifier networkId; 49 52 50 /**51 *52 */53 protected Loop createLoop() {54 return new Loop() {55 private int loopCount = 0;53 /** 54 * 55 */ 56 protected Loop createLoop() { 57 return new Loop() { 58 private int loopCount = 0; 56 59 57 public long loop() throws LoopInterruptedException {58 node.checkQoS();59 loopCount++;60 public long loop() throws LoopInterruptedException { 61 node.checkQoS(); 62 loopCount++; 60 63 61 if (loopCount % 2 == 0) { 62 NodeStatus status = node.getNodeStatus(); 63 LogFactory.getLog(getClass()).debug( 64 "refresh node status " + status); 64 if (loopCount % 2 == 0) { 65 NodeStatus status = node.getNodeStatus(); 66 LogFactory.getLog(getClass()).debug("refresh node status " + status); 65 67 66 try { 67 try { 68 tracker.refresh(status); 69 } catch (TrackerException.UnknownNode e) { 70 LogFactory.getLog(getClass()).debug( 71 "the tracker forgot our existence, register again"); 72 registerNode(); 73 } 74 } catch (Throwable t) { 75 LogFactory.getLog(getClass()).error( 76 "failed to refresh status", t); 77 } 78 } 68 try { 69 try { 70 tracker.refresh(status); 71 } catch (TrackerException.UnknownNode e) { 72 LogFactory.getLog(getClass()).debug( 73 "the tracker forgot our existence, register again"); 74 registerNode(); 75 } 76 } catch (Throwable t) { 77 LogFactory.getLog(getClass()).error("failed to refresh status", t); 78 } 79 } 79 80 80 return 30 * 1000; 81 } 82 }; 83 } 84 private TrackerLocator trackerLocator = HttpTrackerLocator.getInstance(); 81 return 30 * 1000; 82 } 83 }; 84 } 85 85 86 private Tracker tracker;86 private Tracker tracker; 87 87 88 /** 89 * 90 */ 91 public void init() throws ControlException { 92 try { 93 tracker = trackerLocator.resolve(trackerAddress); 94 } catch (TrackerException e) { 95 throw new ControlException("Can't connect to the tracker " 96 + trackerAddress, e); 97 } 88 /** 89 * 90 */ 91 public void init() throws ControlException { 92 TrackerLocator trackerLocator; 93 94 if (networkId == null) { 95 trackerLocator = new HttpTrackerLocator(trackerAddress); 96 } else { 97 trackerLocator = new HttpMultiTrackerLocator(trackerAddress, networkId); 98 } 99 100 LogFactory.getLog(getClass()).debug("connect tracker " + trackerAddress + " (" + networkId + ")"); 101 102 try { 103 tracker = trackerLocator.resolve(); 104 } catch (TrackerException e) { 105 throw new ControlException("Can't connect to the tracker " 106 + trackerAddress, e); 107 } 98 108 99 super.init();100 }109 super.init(); 110 } 101 111 102 /**103 * @param node104 *The node to set.105 */106 public void setNode(ConfigurableNode node) {107 this.node = node;108 }112 /** 113 * @param node 114 * The node to set. 115 */ 116 public void setNode(ConfigurableNode node) { 117 this.node = node; 118 } 109 119 110 /** 111 * @param trackerAddress 112 * The trackerAddress to set. 113 */ 114 public void setTrackerAddress(InetSocketAddress trackerAddress) { 115 this.trackerAddress = trackerAddress; 116 } 120 /** 121 * @param trackerAddress 122 * The trackerAddress to set. 123 */ 124 public void setTrackerAddress(InetSocketAddress trackerAddress) { 125 this.trackerAddress = trackerAddress; 126 } 127 128 public void setNetworkId(NetworkIdentifier networkId) { 129 this.networkId = networkId; 130 } 117 131 118 /**119 *120 */132 /** 133 * 134 */ 121 135 122 public void start() throws ControlException {123 try {124 registerNode();125 } catch (TrackerException e) {126 throw new ControlException("Can't connect to the tracker "127 + trackerAddress, e);128 }136 public void start() throws ControlException { 137 try { 138 registerNode(); 139 } catch (TrackerException e) { 140 throw new ControlException("Can't connect to the tracker " 141 + trackerAddress, e); 142 } 129 143 130 // TODO move the PeerProvider setting (to allow 131 // MinimumOrderPeerProvider) 132 LogFactory.getLog(getClass()).debug( 133 "change the peer provider to use tracker"); 134 node.getConfigurablePeerControler().setPeerProvider( 135 createPeerProvider()); 144 // TODO move the PeerProvider setting (to allow 145 // MinimumOrderPeerProvider) 146 LogFactory.getLog(getClass()).debug( 147 "change the peer provider to use tracker"); 148 node.getConfigurablePeerControler().setPeerProvider(createPeerProvider()); 136 149 137 super.start();138 }150 super.start(); 151 } 139 152 140 /**141 * @throws TrackerException142 */143 private void registerNode() throws TrackerException {144 NodeIdentifier identifier = tracker.register(node.getPeerReference());145 LogFactory.getLog(getClass()).info( 146 "received node identifier " + identifier);147 node.setIdentifier(identifier);148 }153 /** 154 * @throws TrackerException 155 */ 156 private void registerNode() throws TrackerException { 157 NodeIdentifier identifier = tracker.register(node.getPeerReference()); 158 LogFactory.getLog(getClass()) 159 .info("received node identifier " + identifier); 160 node.setIdentifier(identifier); 161 } 149 162 150 protected PeerProvider createPeerProvider() {151 return new PeerProvider() {152 public Set getPeerReferences() throws PeerProviderException {153 try {154 return tracker.getPeerReferences(node.getIdentifier());155 } catch (TrackerException e) {156 String msg = "Can't retrieve new peer references from the tracker";157 throw new PeerProviderException(msg, e);158 }159 }160 };161 }163 protected PeerProvider createPeerProvider() { 164 return new PeerProvider() { 165 public Set getPeerReferences() throws PeerProviderException { 166 try { 167 return tracker.getPeerReferences(node.getIdentifier()); 168 } catch (TrackerException e) { 169 String msg = "Can't retrieve new peer references from the tracker"; 170 throw new PeerProviderException(msg, e); 171 } 172 } 173 }; 174 } 162 175 163 /**164 * @param trackerAddress165 */166 public DefaultNodeService(InetSocketAddress trackerAddress) {167 this.trackerAddress = trackerAddress;168 }176 /** 177 * @param trackerAddress 178 */ 179 public DefaultNodeService(InetSocketAddress trackerAddress) { 180 this.trackerAddress = trackerAddress; 181 } 169 182 170 public void stop() throws ControlException {171 super.stop();183 public void stop() throws ControlException { 184 super.stop(); 172 185 173 LogFactory.getLog(getClass()).info("unregister node");186 LogFactory.getLog(getClass()).info("unregister node"); 174 187 175 if (tracker != null) {176 try {177 tracker.unregister(node.getIdentifier());178 } catch (TrackerException e) {179 throw new ControlException("Can't unregister the node", e);180 }181 }182 }188 if (tracker != null) { 189 try { 190 tracker.unregister(node.getIdentifier()); 191 } catch (TrackerException e) { 192 throw new ControlException("Can't unregister the node", e); 193 } 194 } 195 } 183 196 } trunk/source/org/kolaka/freecast/tracker/HttpTracker.java
r405 r830 25 25 26 26 import java.net.InetSocketAddress; 27 import java.util.Set;28 27 29 import org.kolaka.freecast.node.NodeIdentifier; 30 import org.kolaka.freecast.node.NodeStatus; 31 import org.kolaka.freecast.peer.PeerReference; 28 import org.apache.commons.logging.LogFactory; 32 29 import org.kolaka.freecast.service.ControlException; 33 30 import org.kolaka.freecast.transport.cas.ConnectionAssistantServer; … … 36 33 import org.mortbay.jetty.servlet.ServletHttpContext; 37 34 38 import com.caucho.hessian.server.HessianServlet;39 import com.caucho.services.server.ServiceContext;40 41 35 /** 42 36 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 43 37 */ 44 public class HttpTracker extends HessianServlet implements Tracker { 45 private static final long serialVersionUID = 3546076977887720249L; 46 47 private final Tracker tracker; 48 38 public class HttpTracker implements TrackerService { 39 49 40 private InetSocketAddress listenAddress; 50 41 51 42 private Server server; 52 53 43 private ConnectionAssistantServer caServer; 54 44 … … 64 54 this.listenAddress = listenAddress; 65 55 } 56 57 public Class connectorClass; 58 59 public void setConnectorClass(Class connectorClass) { 60 this.connectorClass = connectorClass; 61 } 66 62 67 63 public void start() throws ControlException { 68 server = new Server(); 64 LogFactory.getLog(Main.class).info( 65 "start a HttpConnector on port " + listenAddress); 66 LogFactory.getLog(Main.class).trace( 67 "use connector " + connectorClass.getName()); 68 69 server = new Server(); 69 70 SocketListener listener = new SocketListener(); 70 71 listener.setInetAddress(listenAddress.getAddress()); … … 76 77 77 78 try { 78 context.addServlet("Tracker", "/tracker", HttpTracker.class 79 .getName()); 79 context.addServlet("Tracker", "/tracker", connectorClass.getName()); 80 80 } catch (Exception e) { 81 81 throw new ControlException("Can't install the tracker servlet", e); … … 105 105 } 106 106 107 public HttpTracker() {108 DefaultTracker.ClientInfoProvider clientInfoProvider = new DefaultTracker.ClientInfoProvider() {109 public String getClientHost() throws TrackerException {110 return ServiceContext.getRequest().getRemoteHost();111 }112 };113 tracker = new DefaultTracker(clientInfoProvider);114 }115 116 public Set getPeerReferences(NodeIdentifier identifier)117 throws TrackerException {118 return tracker.getPeerReferences(identifier);119 }120 121 public NodeIdentifier register(PeerReference reference)122 throws TrackerException {123 return tracker.register(reference);124 }125 126 public void unregister(NodeIdentifier identifier) throws TrackerException {127 tracker.unregister(identifier);128 }129 130 public void refresh(NodeStatus status) throws TrackerException {131 tracker.refresh(status);132 }133 134 107 } trunk/source/org/kolaka/freecast/tracker/HttpTrackerConfigurator.java
r405 r830 37 37 38 38 public void configure(HttpTracker tracker, Configuration configuration) { 39 /* 40 * for the moment, the tracker.class changes the Connector implementation 41 * which creates its own Tracker instance 42 */ 43 String trackerClass = configuration.getString("class", "single"); 44 Class connectorClass = HttpSimpleTrackerConnector.class; 45 if (trackerClass.equals("multi")) { 46 connectorClass = HttpMultiTrackerConnector.class; 47 } 48 tracker.setConnectorClass(connectorClass); 49 39 50 Configuration listenAddressConfiguration = configuration 40 51 .subset("connector.listenaddress"); trunk/source/org/kolaka/freecast/tracker/HttpTrackerLocator.java
r405 r830 27 27 import java.net.MalformedURLException; 28 28 29 import org.apache.commons.lang.Validate; 30 29 31 import com.caucho.hessian.client.HessianProxyFactory; 30 32 … … 36 38 public class HttpTrackerLocator implements TrackerLocator { 37 39 38 private static final TrackerLocator instance = new HttpTrackerLocator();40 private InetSocketAddress trackerAddress; 39 41 40 public static TrackerLocator getInstance() { 41 return instance; 42 } 42 public HttpTrackerLocator(InetSocketAddress trackerAddress) { 43 Validate.notNull(trackerAddress); 44 this.trackerAddress = trackerAddress; 45 } 43 46 44 public Tracker resolve( InetSocketAddress address) throws TrackerException {45 String url = "http://" + address.getHostName() + ":"46 + address.getPort() + "/tracker";47 public Tracker resolve() throws TrackerException { 48 String url = "http://" + trackerAddress.getHostName() + ":" 49 + trackerAddress.getPort() + "/tracker"; 47 50 48 51 try { trunk/source/org/kolaka/freecast/tracker/Main.java
r405 r830 25 25 26 26 import org.apache.commons.configuration.Configuration; 27 import org.apache.commons.logging.LogFactory;28 27 import org.kolaka.freecast.Application; 29 28 … … 32 31 */ 33 32 public class Main extends Application { 34 private HttpTracker tracker; 33 34 private TrackerService tracker; 35 35 36 36 public Main() { … … 46 46 new HttpTrackerConfigurator().configure(tracker, configuration 47 47 .subset("tracker")); 48 this.tracker = tracker;48 this.tracker = tracker; 49 49 } 50 50 51 51 protected void run() throws Exception { 52 LogFactory.getLog(Main.class).info(53 "start a HttpTracker on port " + tracker.getListenAddress());54 52 tracker.start(); 55 53 trunk/source/org/kolaka/freecast/tracker/ProtectedTracker.java
r405 r830 30 30 import org.kolaka.freecast.node.NodeStatus; 31 31 import org.kolaka.freecast.peer.PeerReference; 32 import org.kolaka.freecast.service.ControlException;33 32 34 33 /** … … 43 42 public ProtectedTracker(final Tracker tracker) { 44 43 this.tracker = tracker; 45 }46 47 public void start() throws ControlException {48 tracker.start();49 }50 51 public void stop() throws ControlException {52 tracker.stop();53 44 } 54 45 trunk/source/org/kolaka/freecast/tracker/Tracker.java
r405 r830 29 29 import org.kolaka.freecast.node.NodeStatus; 30 30 import org.kolaka.freecast.peer.PeerReference; 31 import org.kolaka.freecast.service.Startable;32 31 33 32 /** … … 36 35 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 37 36 */ 38 public interface Tracker extends Startable{37 public interface Tracker { 39 38 40 39 public NodeIdentifier register(PeerReference reference) trunk/source/org/kolaka/freecast/tracker/TrackerLocator.java
r405 r830 24 24 package org.kolaka.freecast.tracker; 25 25 26 import java.net.InetSocketAddress;27 26 28 27 /** … … 33 32 public interface TrackerLocator { 34 33 35 public Tracker resolve( InetSocketAddress address) throws TrackerException;34 public Tracker resolve() throws TrackerException; 36 35 37 36 } trunk/source/org/kolaka/freecast/tracker/test/TrackerServletTest.java
r405 r830 48 48 tracker.start(); 49 49 50 Tracker remoteTracker = HttpTrackerLocator.getInstance().resolve( 51 address); 50 Tracker remoteTracker = new HttpTrackerLocator(address).resolve(); 52 51 remoteTracker.register(InetPeerReference 53 52 .getInstance(new InetSocketAddress(4000)));
