Changeset 888
- Timestamp:
- 10/04/06 08:52:34 (2 years ago)
- Files:
-
- trunk/source/org/kolaka/freecast/node/DefaultNode.java (modified) (2 diffs)
- trunk/source/org/kolaka/freecast/peer/PeerReferences.java (added)
- trunk/source/org/kolaka/freecast/tracker/ClientInfoProvider.java (added)
- trunk/source/org/kolaka/freecast/tracker/ClientInfoProviderUser.java (added)
- trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java (modified) (6 diffs)
- trunk/source/org/kolaka/freecast/tracker/DefaultTracker.java (modified) (7 diffs)
- trunk/source/org/kolaka/freecast/tracker/DefaultTrackerStatistics.java (added)
- trunk/source/org/kolaka/freecast/tracker/HessianClientInfoProvider.java (modified) (1 diff)
- trunk/source/org/kolaka/freecast/tracker/HttpMultiTrackerConnector.java (modified) (1 diff)
- trunk/source/org/kolaka/freecast/tracker/HttpSimpleTrackerConnector.java (modified) (1 diff)
- trunk/source/org/kolaka/freecast/tracker/HttpTracker.java (modified) (4 diffs)
- trunk/source/org/kolaka/freecast/tracker/HttpTrackerConfigurator.java (modified) (1 diff)
- trunk/source/org/kolaka/freecast/tracker/HttpTrackerConnector.java (added)
- trunk/source/org/kolaka/freecast/tracker/IceStatsServlet.java (added)
- trunk/source/org/kolaka/freecast/tracker/MultiTrackerStatisticsProvider.java (added)
- trunk/source/org/kolaka/freecast/tracker/TrackerStatistics.java (added)
- trunk/source/org/kolaka/freecast/tracker/TrackerStatisticsComputer.java (added)
- trunk/source/org/kolaka/freecast/tracker/TrackerStatisticsProvider.java (added)
- trunk/source/org/kolaka/freecast/tracker/test/TrackerStatisticsComputerTest.java (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/source/org/kolaka/freecast/node/DefaultNode.java
r405 r888 162 162 Validate.notNull(receiverControler, "No specified ReceiverControler"); 163 163 164 if (receiverControler instanceof PeerReceiverControler) { 165 order = Order.UNKNOWN; 166 } else { 167 order = Order.ZERO; 164 if (!(receiverControler instanceof PeerReceiverControler)) { 165 changeOrder(Order.ZERO); 168 166 } 169 167 … … 229 227 LogFactory.getLog(getClass()).debug("set order to " + order); 230 228 this.order = order; 229 reference.setAttribute(PeerReference.ORDER_ATTRIBUTE, order); 231 230 nodeStatusProvider.fireNodeStatus(); 232 231 } trunk/source/org/kolaka/freecast/tracker/DefaultMultiTracker.java
r832 r888 38 38 import org.kolaka.freecast.timer.Timer; 39 39 import org.kolaka.freecast.timer.TimerUser; 40 import org.kolaka.freecast.tracker.DefaultTracker.ClientInfoProvider;41 40 42 public class DefaultMultiTracker implements TimerUser {41 public class DefaultMultiTracker implements MultiTracker, TimerUser, ClientInfoProviderUser, MultiTrackerStatisticsProvider { 43 42 44 43 private Map trackers = new TreeMap(); 45 44 46 private finalClientInfoProvider clientInfoProvider;45 private ClientInfoProvider clientInfoProvider; 47 46 48 public DefaultMultiTracker(final ClientInfoProvider clientInfoProvider) { 49 this.clientInfoProvider = clientInfoProvider; 50 47 public DefaultMultiTracker() { 51 48 Runnable purgeRunnable = new Runnable() { 52 49 public void run() { … … 55 52 }; 56 53 timer.executePeriodically(DefaultTimer.minutes(1), purgeRunnable , false); 57 } 54 } 55 56 public TrackerStatistics getStatistics(NetworkIdentifier identifier) { 57 Tracker tracker = (Tracker) trackers.get(identifier); 58 if (tracker == null) { 59 return new DefaultTrackerStatistics(); 60 } 61 return ((TrackerStatisticsProvider) tracker).getStatistics(); 62 } 63 64 public void setClientInfoProvider(ClientInfoProvider clientInfoProvider) { 65 this.clientInfoProvider = clientInfoProvider; 66 } 67 68 private ClientInfoProvider getClientInfoProvider() { 69 if (clientInfoProvider == null) { 70 throw new IllegalStateException("No specified ClientInfoProvider"); 71 } 72 return clientInfoProvider; 73 } 58 74 59 75 private synchronized Tracker getTracker(NetworkIdentifier identifier) { … … 61 77 if (tracker == null) { 62 78 LogFactory.getLog(getClass()).info("create tracker for network " + identifier); 63 tracker = createTracker( clientInfoProvider);79 tracker = createTracker(getClientInfoProvider()); 64 80 trackers.put(identifier, tracker); 65 81 } … … 68 84 69 85 protected Tracker createTracker(ClientInfoProvider clientInfoProvider) { 70 return new TimedTracker(new DefaultTracker(clientInfoProvider)); 86 DefaultTracker tracker = new DefaultTracker(); 87 tracker.setClientInfoProvider(clientInfoProvider); 88 return new TimedTracker(tracker); 71 89 } 72 90 … … 114 132 } 115 133 116 static class TimedTracker implements Tracker {134 static class TimedTracker implements Tracker, TrackerStatisticsProvider { 117 135 118 136 private final Tracker delegate; … … 122 140 Validate.notNull(delegate); 123 141 this.delegate = delegate; 142 } 143 144 public TrackerStatistics getStatistics() { 145 return ((TrackerStatisticsProvider) delegate).getStatistics(); 124 146 } 125 147 trunk/source/org/kolaka/freecast/tracker/DefaultTracker.java
r832 r888 41 41 import org.kolaka.freecast.peer.InetPeerReference; 42 42 import org.kolaka.freecast.peer.PeerReference; 43 import org.kolaka.freecast.peer.PeerReferences; 43 44 import org.kolaka.freecast.service.ControlException; 44 45 … … 48 49 * @author <a href="mailto:alban.peignier@free.fr">Alban Peignier </a> 49 50 */ 50 public class DefaultTracker implements Tracker {51 public class DefaultTracker implements Tracker, ClientInfoProviderUser, TrackerStatisticsProvider { 51 52 52 53 private Map entries = new HashMap(); … … 54 55 private final Tracker.Auditor auditor; 55 56 56 private final ClientInfoProvider clientInfoProvider; 57 58 public DefaultTracker(ClientInfoProvider clientInfoProvider) { 59 this.clientInfoProvider = clientInfoProvider; 57 private ClientInfoProvider clientInfoProvider; 58 59 private final TrackerStatisticsComputer statisticsComputer = new TrackerStatisticsComputer(); 60 61 public TrackerStatistics getStatistics() { 62 return statisticsComputer.getStatistics(); 63 } 64 65 public DefaultTracker() { 60 66 this.auditor = (Tracker.Auditor) AuditorFactory.getInstance().get( 61 67 Tracker.Auditor.class, this); 62 68 } 69 70 public void setClientInfoProvider(ClientInfoProvider clientInfoProvider) { 71 this.clientInfoProvider = clientInfoProvider; 72 } 63 73 64 74 public Set getPeerReferences(NodeIdentifier identifier) { … … 123 133 "registration performed with id " + identifier); 124 134 125 auditor.register(validatedReference); 135 nodeConnected(validatedReference); 136 137 return identifier; 138 } 139 140 private void nodeConnected(PeerReference reference) { 141 auditor.register(reference); 126 142 auditor.connectedNodes(entries.size()); 127 128 return identifier; 129 } 130 143 144 statisticsComputer.nodeConnected(PeerReferences.isRootNode(reference)); 145 } 146 147 private void nodeDisconnected(PeerReference reference) { 148 auditor.unregister(reference); 149 auditor.connectedNodes(entries.size()); 150 151 statisticsComputer.nodeDisconnected(PeerReferences.isRootNode(reference)); 152 } 153 131 154 public void unregister(NodeIdentifier identifier) { 132 155 NodeEntry entry = (NodeEntry) entries.remove(identifier); 133 156 if (entry != null) { 134 157 LogFactory.getLog(getClass()).debug("unregister " + entry); 135 auditor.unregister(entry.getReference());158 nodeDisconnected(entry.getReference()); 136 159 } else { 137 160 String clientHost = "unknown"; … … 146 169 LogFactory.getLog(getClass()).warn(msg); 147 170 } 148 149 auditor.connectedNodes(entries.size());150 171 } 151 172 … … 203 224 LogFactory.getLog(getClass()).debug("remove " + entry); 204 225 iter.remove(); 205 auditor.unregister(entry.getReference()); 206 } 207 } 208 auditor.connectedNodes(entries.size()); 226 nodeDisconnected(entry.getReference()); 227 } 228 } 209 229 } 210 230 … … 288 308 } 289 309 290 interface ClientInfoProvider {291 292 public String getClientHost() throws TrackerException;293 294 }295 296 310 } trunk/source/org/kolaka/freecast/tracker/HessianClientInfoProvider.java
r830 r888 26 26 import com.caucho.services.server.ServiceContext; 27 27 28 final class HessianClientInfoProvider implements DefaultTracker.ClientInfoProvider {28 final class HessianClientInfoProvider implements ClientInfoProvider { 29 29 public String getClientHost() throws TrackerException { 30 30 return ServiceContext.getContextRequest().getRemoteHost(); trunk/source/org/kolaka/freecast/tracker/HttpMultiTrackerConnector.java
r840 r888 26 26 import java.util.Set; 27 27 28 import javax.servlet.ServletException; 29 28 30 import org.kolaka.freecast.node.NodeIdentifier; 29 31 import org.kolaka.freecast.node.NodeStatus; 30 32 import org.kolaka.freecast.peer.PeerReference; 31 33 32 import com.caucho.hessian.server.HessianServlet; 33 34 public class HttpMultiTrackerConnector extends HessianServlet implements MultiTracker { 34 public class HttpMultiTrackerConnector extends HttpTrackerConnector implements MultiTracker { 35 35 36 36 private static final long serialVersionUID = 1568160755433034061L; 37 private final DefaultMultiTracker tracker;37 private MultiTracker tracker; 38 38 39 public HttpMultiTrackerConnector() { 40 tracker = new DefaultMultiTracker(new HessianClientInfoProvider()); 39 public void init() throws ServletException { 40 super.init(); 41 tracker = (MultiTracker) getTracker(); 41 42 } 42 43 trunk/source/org/kolaka/freecast/tracker/HttpSimpleTrackerConnector.java
r830 r888 26 26 import java.util.Set; 27 27 28 import javax.servlet.ServletException; 29 28 30 import org.kolaka.freecast.node.NodeIdentifier; 29 31 import org.kolaka.freecast.node.NodeStatus; 30 32 import org.kolaka.freecast.peer.PeerReference; 31 33 32 import com.caucho.hessian.server.HessianServlet; 33 34 public class HttpSimpleTrackerConnector extends HessianServlet implements Tracker { 34 public class HttpSimpleTrackerConnector extends HttpTrackerConnector implements Tracker { 35 35 36 36 private static final long serialVersionUID = 8802338594786705476L; 37 private final Tracker tracker; 38 39 public HttpSimpleTrackerConnector() { 40 tracker = new DefaultTracker(new HessianClientInfoProvider()); 37 private Tracker tracker; 38 39 public void init() throws ServletException { 40 super.init(); 41 tracker = (Tracker) getTracker(); 41 42 } 42 43 trunk/source/org/kolaka/freecast/tracker/HttpTracker.java
r840 r888 31 31 import org.mortbay.http.SocketListener; 32 32 import org.mortbay.jetty.Server; 33 import org.mortbay.jetty.servlet.ServletHolder; 33 34 import org.mortbay.jetty.servlet.ServletHttpContext; 34 35 … … 55 56 } 56 57 57 p ublic Class connectorClass;58 59 public void set ConnectorClass(Class connectorClass) {60 this. connectorClass = connectorClass;58 private boolean multiTracker; 59 60 public void setMultiTracker(boolean multiTracker) { 61 this.multiTracker = multiTracker; 61 62 } 62 63 … … 64 65 LogFactory.getLog(Main.class).info( 65 66 "start a HttpConnector on port " + listenAddress); 67 68 Class connectorClass = HttpSimpleTrackerConnector.class; 69 Object tracker = new DefaultTracker(); 70 71 if (multiTracker) { 72 LogFactory.getLog(Main.class).info("multi network support enabled"); 73 74 connectorClass = HttpMultiTrackerConnector.class; 75 tracker = new DefaultMultiTracker(); 76 } 77 66 78 LogFactory.getLog(Main.class).trace( 67 79 "use connector " + connectorClass.getName()); 68 if (connectorClass.equals(HttpMultiTrackerConnector.class)) {69 LogFactory.getLog(Main.class).info("multi network support enabled");70 }71 80 72 81 server = new Server(); … … 80 89 81 90 try { 82 context.addServlet("Tracker", "/tracker", connectorClass.getName()); 91 ServletHolder servletHolder = context.addServlet("Tracker", "/tracker", connectorClass.getName()); 92 servletHolder.getServletContext().setAttribute(HttpTrackerConnector.TRACKER_ATTRIBUTE, tracker); 83 93 } catch (Exception e) { 84 94 throw new ControlException("Can't install the tracker servlet", e); 85 95 } 96 97 try { 98 ServletHolder servletHolder = context.addServlet("Statistics", "/stats.xml", IceStatsServlet.class.getName()); 99 servletHolder.getServletContext().setAttribute(IceStatsServlet.STATSPROVIDER_ATTRIBUTE, tracker); 100 } catch (Exception e) { 101 throw new ControlException("Can't install the statistics servlet", e); 102 } 86 103 87 104 try { trunk/source/org/kolaka/freecast/tracker/HttpTrackerConfigurator.java
r840 r888 42 42 */ 43 43 String trackerClass = configuration.getString("class", "single"); 44 Class connectorClass = HttpSimpleTrackerConnector.class;44 boolean multiTracker = false; 45 45 if (trackerClass.equals("multi")) { 46 connectorClass = HttpMultiTrackerConnector.class;46 multiTracker = true; 47 47 } else if (trackerClass.equals("none")) { 48 48 throw new NoConfiguredTrackerException(); 49 49 } 50 tracker.set ConnectorClass(connectorClass);50 tracker.setMultiTracker(multiTracker); 51 51 52 52 Configuration listenAddressConfiguration = configuration
