From 8d13a16417c4adefa4bce490d0ed62bcd7b4f74d Mon Sep 17 00:00:00 2001 From: matsfunk Date: Fri, 30 Mar 2018 11:32:17 +0200 Subject: [PATCH] client version 1.3.7 - added call-response pattern for channel responders - fixed JavaDoc - new connection built-up and handling --- dist/oocsi.zip | Bin 1077659 -> 1086671 bytes .../SendResponseChannel.pde | 93 +++++++ dist/oocsi/library.properties | 4 +- dist/oocsi/library/oocsi.jar | Bin 118288 -> 123525 bytes dist/oocsi/reference/allclasses-frame.html | 4 +- dist/oocsi/reference/allclasses-noframe.html | 4 +- dist/oocsi/reference/constant-values.html | 6 +- dist/oocsi/reference/deprecated-list.html | 4 +- dist/oocsi/reference/help-doc.html | 4 +- dist/oocsi/reference/index-all.html | 138 +++++++--- dist/oocsi/reference/index.html | 2 +- .../nl/tue/id/oocsi/Constellation.html | 4 +- .../nl/tue/id/oocsi/EventRecorder.html | 4 +- .../reference/nl/tue/id/oocsi/OOCSI.html | 218 +++++++++++++--- .../nl/tue/id/oocsi/OOCSIBoolean.html | 8 +- .../nl/tue/id/oocsi/OOCSICommunicator.html | 210 ++++++++++++--- .../reference/nl/tue/id/oocsi/OOCSIData.html | 4 +- .../nl/tue/id/oocsi/OOCSIDouble.html | 10 +- .../reference/nl/tue/id/oocsi/OOCSIEvent.html | 4 +- .../reference/nl/tue/id/oocsi/OOCSIFloat.html | 10 +- .../reference/nl/tue/id/oocsi/OOCSIInt.html | 10 +- .../reference/nl/tue/id/oocsi/OOCSILong.html | 10 +- .../nl/tue/id/oocsi/OOCSIString.html | 8 +- .../nl/tue/id/oocsi/OOCSIVariable.html | 4 +- .../nl/tue/id/oocsi/StateMachine.State.html | 4 +- .../nl/tue/id/oocsi/StateMachine.html | 4 +- .../nl/tue/id/oocsi/client/OOCSIClient.html | 46 +++- .../oocsi/client/behavior/OOCSIAwareness.html | 4 +- .../oocsi/client/behavior/OOCSIConsensus.html | 4 +- .../id/oocsi/client/behavior/OOCSIGather.html | 4 +- .../behavior/OOCSISpatial.DistanceMetric.html | 4 +- .../oocsi/client/behavior/OOCSISpatial.html | 7 +- .../id/oocsi/client/behavior/OOCSISpread.html | 4 +- .../id/oocsi/client/behavior/OOCSISync.html | 4 +- .../behavior/OOCSISystemCommunicator.html | 4 +- .../oocsi/client/behavior/OOCSIVariable.html | 4 +- .../oocsi/client/behavior/package-frame.html | 4 +- .../client/behavior/package-summary.html | 4 +- .../oocsi/client/behavior/package-tree.html | 4 +- .../state/OOCSIStateMachine.State.html | 4 +- .../state/OOCSIStateMachine.Transition.html | 4 +- .../behavior/state/OOCSIStateMachine.html | 4 +- .../client/behavior/state/package-frame.html | 4 +- .../behavior/state/package-summary.html | 4 +- .../client/behavior/state/package-tree.html | 4 +- .../id/oocsi/client/data/OOCSIVariable.html | 11 +- .../id/oocsi/client/data/package-frame.html | 4 +- .../id/oocsi/client/data/package-summary.html | 4 +- .../id/oocsi/client/data/package-tree.html | 4 +- .../nl/tue/id/oocsi/client/package-frame.html | 4 +- .../tue/id/oocsi/client/package-summary.html | 4 +- .../nl/tue/id/oocsi/client/package-tree.html | 4 +- .../id/oocsi/client/protocol/DataHandler.html | 4 +- .../oocsi/client/protocol/EventHandler.html | 4 +- .../tue/id/oocsi/client/protocol/Handler.html | 12 +- .../oocsi/client/protocol/MultiHandler.html | 4 +- .../oocsi/client/protocol/MultiMessage.html | 4 +- .../oocsi/client/protocol/OOCSIMessage.html | 4 +- .../RateLimitedClientEventHandler.html | 10 +- .../protocol/RateLimitedEventHandler.html | 14 +- .../oocsi/client/protocol/package-frame.html | 4 +- .../client/protocol/package-summary.html | 8 +- .../oocsi/client/protocol/package-tree.html | 4 +- .../id/oocsi/client/services/OOCSICall.html | 12 +- .../id/oocsi/client/services/Responder.html | 4 +- .../client/services/Service.ServiceField.html | 4 +- .../services/Service.ServiceMethod.html | 4 +- .../tue/id/oocsi/client/services/Service.html | 4 +- .../oocsi/client/services/package-frame.html | 4 +- .../client/services/package-summary.html | 4 +- .../oocsi/client/services/package-tree.html | 4 +- .../id/oocsi/client/socket/Base64Coder.html | 4 +- .../id/oocsi/client/socket/SocketClient.html | 16 +- .../id/oocsi/client/socket/package-frame.html | 4 +- .../oocsi/client/socket/package-summary.html | 4 +- .../id/oocsi/client/socket/package-tree.html | 4 +- .../nl/tue/id/oocsi/package-frame.html | 4 +- .../nl/tue/id/oocsi/package-summary.html | 4 +- .../nl/tue/id/oocsi/package-tree.html | 4 +- dist/oocsi/reference/overview-frame.html | 4 +- dist/oocsi/reference/overview-summary.html | 4 +- dist/oocsi/reference/overview-tree.html | 4 +- dist/oocsi/reference/serialized-form.html | 4 +- dist/oocsi/src/nl/tue/id/oocsi/OOCSI.java | 98 ++++++- .../src/nl/tue/id/oocsi/OOCSIBoolean.java | 2 +- .../nl/tue/id/oocsi/OOCSICommunicator.java | 135 +++++++++- .../src/nl/tue/id/oocsi/OOCSIDouble.java | 4 +- .../oocsi/src/nl/tue/id/oocsi/OOCSIFloat.java | 4 +- dist/oocsi/src/nl/tue/id/oocsi/OOCSIInt.java | 4 +- dist/oocsi/src/nl/tue/id/oocsi/OOCSILong.java | 4 +- .../src/nl/tue/id/oocsi/OOCSIString.java | 2 +- .../nl/tue/id/oocsi/client/OOCSIClient.java | 22 +- .../oocsi/client/behavior/OOCSISpatial.java | 3 +- .../id/oocsi/client/data/OOCSIVariable.java | 9 +- .../tue/id/oocsi/client/protocol/Handler.java | 4 +- .../RateLimitedClientEventHandler.java | 4 +- .../protocol/RateLimitedEventHandler.java | 6 +- .../id/oocsi/client/services/OOCSICall.java | 4 +- .../id/oocsi/client/socket/SocketClient.java | 241 ++++++++++++------ src/nl/tue/id/oocsi/OOCSI.java | 98 ++++++- 100 files changed, 1294 insertions(+), 449 deletions(-) create mode 100644 dist/oocsi/examples/Connectivity/SendResponseChannel/SendResponseChannel.pde diff --git a/dist/oocsi.zip b/dist/oocsi.zip index ca202b3bf4f8815f9a8cd638ecd10c8aed7c0da6..b9d67136cd1ed8e4657c267254e56559ad4201da 100644 GIT binary patch delta 360718 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 + + + +
    +
  • +

    disconnect

    +
    public void disconnect()
    +
    disconnect this client from the OOCSI network
    +
  • +
@@ -517,7 +575,7 @@

channel

  • call

    public OOCSICall call(java.lang.String callName)
    -
    create a call for service method
    +
    create a call for service method "callName"
    Parameters:
    callName -
    @@ -525,6 +583,23 @@

    call

  • + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName)
      +
      create a call for service method "callName" on channel "channelName"
      +
      +
      Parameters:
      +
      channelName -
      +
      callName -
      +
      Returns:
      +
      +
    • +
    @@ -533,9 +608,28 @@

    call

    call

    public OOCSICall call(java.lang.String callName,
                           int timeoutMS)
    -
    create a call for service method
    +
    create a call for service method "callName" with a specific timeout
    +
    +
    Parameters:
    +
    callName -
    +
    timeoutMS -
    +
    Returns:
    +
    + + + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName,
      +                      int timeoutMS)
      +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      Parameters:
      +
      channelName -
      callName -
      timeoutMS -
      Returns:
      @@ -551,9 +645,30 @@

      call

      public OOCSICall call(java.lang.String callName,
                             int timeoutMS,
                             int maxResponses)
      -
      create a call for service method
      +
      create a call for service method "callName" with a specific timeout
      +
      +
      Parameters:
      +
      callName -
      +
      timeoutMS -
      +
      maxResponses -
      +
      Returns:
      +
      +
    • +
    + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName,
      +                      int timeoutMS,
      +                      int maxResponses)
      +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      Parameters:
      +
      channelName -
      callName -
      timeoutMS -
      maxResponses -
      @@ -599,7 +714,7 @@

      subscribe

      subscribe

      public void subscribe(java.lang.String channelName,
                             java.lang.String handlerName)
      -
      subscribe to a channel with a given handler method name
      +
      subscribe to a channel with a given handler method name "handlerName"
      Parameters:
      channelName -
      @@ -617,8 +732,8 @@

      subscribe

      java.lang.String handlerName, int rate, int seconds) -
      subscribe to a channel with a given handler method name ; limits the rate of incoming events to - events per secs
      +
      subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + "rate" events per "seconds" secs
      Parameters:
      channelName -
      @@ -639,8 +754,8 @@

      subscribe

      int rate, int seconds, boolean ratePerSender) -
      subscribe to a channel with a given handler method name ; limits the rate of incoming events to - events per secs; controls whether we limit the rate of incoming event per sender +
      subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + "rate" events per "seconds" secs; "ratePerSender" controls whether we limit the rate of incoming event per sender or for all events coming in from all senders
      Parameters:
      @@ -674,9 +789,46 @@

      register

      register

      public void register(java.lang.String responderName,
                            java.lang.String responderFunctionName)
      -
      register a responder; requires a method with the given responderName with parameters (OOCSIEvent, OOCSIData)
      +
      register a responder "responderName"; requires a method with the given name "responderName" with parameters + (OOCSIEvent, OOCSIData)
      +
      +
      Parameters:
      +
      responderName -
      +
      responderFunctionName -
      +
      +
    • +
    + + + +
      +
    • +

      registerChannel

      +
      public void registerChannel(java.lang.String channelName,
      +                            java.lang.String responderName)
      +
      register a responder "responderName" on channel "channelName"; requires a method with the responder name + "responderName" with parameters (OOCSIEvent, OOCSIData)
      Parameters:
      +
      channelName -
      +
      responderName -
      +
      +
    • +
    + + + +
      +
    • +

      registerChannel

      +
      public void registerChannel(java.lang.String channelName,
      +                            java.lang.String responderName,
      +                            java.lang.String responderFunctionName)
      +
      register a responder "responderName" on channel "channelName"; requires a method with the given name + "responderName" with parameters (OOCSIEvent, OOCSIData)
      +
      +
      Parameters:
      +
      channelName -
      responderName -
      responderFunctionName -
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIBoolean.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIBoolean.html index 37baf47..74f13de 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIBoolean.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIBoolean.html @@ -2,9 +2,9 @@ - + OOCSIBoolean - + @@ -207,7 +207,7 @@

      Method Summary

      OOCSIBoolean limit(int rate, int seconds) -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      @@ -308,7 +308,7 @@

      Method Detail

      limit

      public OOCSIBoolean limit(int rate,
                                 int seconds)
      -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      Overrides:
      limit in class OOCSIVariable<java.lang.Boolean>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSICommunicator.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSICommunicator.html index fcd4042..a34a34e 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSICommunicator.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSICommunicator.html @@ -2,9 +2,9 @@ - + OOCSICommunicator - + @@ -18,7 +18,7 @@ catch(err) { } //--> -var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10}; +var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -176,14 +176,14 @@

      Method Summary

      OOCSICall call(java.lang.String callName) -
      create a call for service method
      +
      create a call for service method "callName"
      OOCSICall call(java.lang.String callName, int timeoutMS) -
      create a call for service method
      +
      create a call for service method "callName" with a specific timeout
      @@ -191,86 +191,128 @@

      Method Summary

      call(java.lang.String callName, int timeoutMS, int maxResponses) -
      create a call for service method
      +
      create a call for service method "callName" with a specific timeout
      +OOCSICall +call(java.lang.String channelName, + java.lang.String callName) +
      create a call for service method "callName" on channel "channelName"
      + + + +OOCSICall +call(java.lang.String channelName, + java.lang.String callName, + int timeoutMS) +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      + + + +OOCSICall +call(java.lang.String channelName, + java.lang.String callName, + int timeoutMS, + int maxResponses) +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      + + + OOCSIMessage channel(java.lang.String channelName)
      send data through a channel given by the channelName
      - + boolean connect()
      connect to OOCSI network without a concrete server given, i.e., wait for multi-cast messages broadcasting a server to connect to
      - + boolean connect(java.lang.String hostname, int port)
      connect to OOCSI network
      - + Handler createSimpleCallerHandler(java.lang.String handlerName)
      create a simple handler that calls the method with the given handlerName in the parent object (without parameters)
      - + boolean register(java.lang.String responderName) -
      subscribe to channel for handler method in the parent class; the handler method +
      subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try - 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for
      + 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName"
      - + boolean register(java.lang.String responderName, java.lang.String handlerName) -
      register a handler method in the parent class with the given name for the channel ; +
      register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      - + +boolean +registerChannel(java.lang.String channelName, + java.lang.String responderName) +
      subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method + will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try + 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName"
      + + + +boolean +registerChannel(java.lang.String channelName, + java.lang.String responderName, + java.lang.String handlerName) +
      register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; + the handler method will be called with an OOCSIEvent object upon occurrence of an event
      + + + boolean subscribe(java.lang.String channelName) -
      subscribe to channel for handler method in the parent class; the handler method will +
      subscribe to channel "channelName" for handler method "channelName" in the parent class; the handler method will be called with an OOCSIEvent object upon occurrence of an event; will try 'handleOOCSIEvent' as a fall-back in - case no matching handler method is found for
      + case no matching handler method is found for "channelName"
      - + boolean subscribe(java.lang.String channelName, java.lang.String handlerName) -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      - + boolean subscribe(java.lang.String channelName, java.lang.String handlerName, int rate, int seconds) -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      - + boolean subscribe(java.lang.String channelName, java.lang.String handlerName, int rate, int seconds, boolean ratePerSender) -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      @@ -280,7 +322,7 @@

      Method Summary

      Methods inherited from class nl.tue.id.oocsi.client.OOCSIClient

      -channels, channels, clients, disconnect, getName, isConnected, kill, log, reconnect, register, register, send, send, setReconnect, subscribe, subscribe, unsubscribe
    • +channels, channels, clients, disconnect, getName, isConnected, kill, log, reconnect, register, register, register, send, send, setReconnect, subscribe, subscribe, unsubscribe
    + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName)
      +
      create a call for service method "callName" on channel "channelName"
      Parameters:
      +
      channelName -
      callName -
      Returns:
      @@ -399,9 +458,28 @@

      call

      call

      public OOCSICall call(java.lang.String callName,
                             int timeoutMS)
      -
      create a call for service method
      +
      create a call for service method "callName" with a specific timeout
      +
      +
      Parameters:
      +
      callName -
      +
      timeoutMS -
      +
      Returns:
      +
      +
    • +
    + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName,
      +                      int timeoutMS)
      +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      Parameters:
      +
      channelName -
      callName -
      timeoutMS -
      Returns:
      @@ -417,9 +495,30 @@

      call

      public OOCSICall call(java.lang.String callName,
                             int timeoutMS,
                             int maxResponses)
      -
      create a call for service method
      +
      create a call for service method "callName" with a specific timeout
      +
      +
      Parameters:
      +
      callName -
      +
      timeoutMS -
      +
      maxResponses -
      +
      Returns:
      +
      +
    • +
    + + + +
      +
    • +

      call

      +
      public OOCSICall call(java.lang.String channelName,
      +                      java.lang.String callName,
      +                      int timeoutMS,
      +                      int maxResponses)
      +
      create a call for service method "callName" with a specific timeout on channel "channelName"
      Parameters:
      +
      channelName -
      callName -
      timeoutMS -
      maxResponses -
      @@ -434,9 +533,9 @@

      call

    • subscribe

      public boolean subscribe(java.lang.String channelName)
      -
      subscribe to channel for handler method in the parent class; the handler method will +
      subscribe to channel "channelName" for handler method "channelName" in the parent class; the handler method will be called with an OOCSIEvent object upon occurrence of an event; will try 'handleOOCSIEvent' as a fall-back in - case no matching handler method is found for
      + case no matching handler method is found for "channelName"
      Parameters:
      channelName -
      @@ -452,7 +551,7 @@

      subscribe

      subscribe

      public boolean subscribe(java.lang.String channelName,
                                java.lang.String handlerName)
      -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      Parameters:
      @@ -472,7 +571,7 @@

      subscribe

      java.lang.String handlerName, int rate, int seconds) -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      Parameters:
      @@ -495,7 +594,7 @@

      subscribe

      int rate, int seconds, boolean ratePerSender) -
      subscribe to channel for handler method in the parent class with the given name ; the +
      subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
      Parameters:
      @@ -531,9 +630,9 @@

      createSimpleCallerHandler

    • register

      public boolean register(java.lang.String responderName)
      -
      subscribe to channel for handler method in the parent class; the handler method +
      subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try - 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for
      + 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName"
      Parameters:
      responderName -
      @@ -544,15 +643,54 @@

      register

      -
        +
        • register

          public boolean register(java.lang.String responderName,
                                   java.lang.String handlerName)
          -
          register a handler method in the parent class with the given name for the channel ; +
          register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; + the handler method will be called with an OOCSIEvent object upon occurrence of an event
          +
          +
          Parameters:
          +
          responderName -
          +
          handlerName -
          +
          Returns:
          +
          +
        • +
        + + + +
          +
        • +

          registerChannel

          +
          public boolean registerChannel(java.lang.String channelName,
          +                               java.lang.String responderName)
          +
          subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method + will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try + 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName"
          +
          +
          Parameters:
          +
          channelName -
          +
          responderName -
          +
          Returns:
          +
          +
        • +
        + + + +
          +
        • +

          registerChannel

          +
          public boolean registerChannel(java.lang.String channelName,
          +                               java.lang.String responderName,
          +                               java.lang.String handlerName)
          +
          register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; the handler method will be called with an OOCSIEvent object upon occurrence of an event
          Parameters:
          +
          channelName -
          responderName -
          handlerName -
          Returns:
          diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIData.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIData.html index 60158aa..ac53c70 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIData.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIData.html @@ -2,9 +2,9 @@ - + OOCSIData - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIDouble.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIDouble.html index 526b507..8f45baf 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIDouble.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIDouble.html @@ -2,9 +2,9 @@ - + OOCSIDouble - + @@ -256,7 +256,7 @@

          Method Summary

          OOCSIDouble limit(int rate, int seconds) -
          set the limiting of incoming events in terms of and timeframe; supports chained invocation
          +
          set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
          @@ -480,7 +480,7 @@

          timeout

          limit

          public OOCSIDouble limit(int rate,
                                    int seconds)
          -
          set the limiting of incoming events in terms of and timeframe; supports chained invocation
          +
          set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
          Overrides:
          limit in class OOCSIVariable<java.lang.Double>
          @@ -593,7 +593,7 @@

          generator

          java.lang.String outputKey)
          creates a periodic feedback loop that feed either the last input value or the reference value into the variable (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - addition, the new value of the variable is sent out to the channel with the given key
          + addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey"
    • Overrides:
      generator in class OOCSIVariable<java.lang.Double>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIEvent.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIEvent.html index 1011f0c..de456d8 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIEvent.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIEvent.html @@ -2,9 +2,9 @@ - + OOCSIEvent - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIFloat.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIFloat.html index ec0d87b..233d01d 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIFloat.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIFloat.html @@ -2,9 +2,9 @@ - + OOCSIFloat - + @@ -256,7 +256,7 @@

      Method Summary

      OOCSIFloat limit(int rate, int seconds) -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      @@ -480,7 +480,7 @@

      timeout

      limit

      public OOCSIFloat limit(int rate,
                               int seconds)
      -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      Overrides:
      limit in class OOCSIVariable<java.lang.Float>
      @@ -593,7 +593,7 @@

      generator

      java.lang.String outputKey)
      creates a periodic feedback loop that feed either the last input value or the reference value into the variable (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - addition, the new value of the variable is sent out to the channel with the given key
      + addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey"
      Overrides:
      generator in class OOCSIVariable<java.lang.Float>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIInt.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIInt.html index fbbe95d..c0716c0 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIInt.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIInt.html @@ -2,9 +2,9 @@ - + OOCSIInt - + @@ -256,7 +256,7 @@

      Method Summary

      OOCSIInt limit(int rate, int seconds) -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      @@ -485,7 +485,7 @@

      timeout

      limit

      public OOCSIInt limit(int rate,
                             int seconds)
      -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      Overrides:
      limit in class OOCSIVariable<java.lang.Integer>
      @@ -598,7 +598,7 @@

      generator

      java.lang.String outputKey)
      creates a periodic feedback loop that feed either the last input value or the reference value into the variable (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - addition, the new value of the variable is sent out to the channel with the given key
      + addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey"
      Overrides:
      generator in class OOCSIVariable<java.lang.Integer>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSILong.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSILong.html index bd90ff9..84eaa0f 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSILong.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSILong.html @@ -2,9 +2,9 @@ - + OOCSILong - + @@ -256,7 +256,7 @@

      Method Summary

      OOCSILong limit(int rate, int seconds) -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      @@ -480,7 +480,7 @@

      timeout

      limit

      public OOCSILong limit(int rate,
                              int seconds)
      -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      Overrides:
      limit in class OOCSIVariable<java.lang.Long>
      @@ -593,7 +593,7 @@

      generator

      java.lang.String outputKey)
      creates a periodic feedback loop that feed either the last input value or the reference value into the variable (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - addition, the new value of the variable is sent out to the channel with the given key
      + addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey"
      Overrides:
      generator in class OOCSIVariable<java.lang.Long>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIString.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIString.html index f1ea384..9992b00 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIString.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIString.html @@ -2,9 +2,9 @@ - + OOCSIString - + @@ -203,7 +203,7 @@

      Method Summary

      OOCSIString limit(int rate, int seconds) -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      @@ -294,7 +294,7 @@

      Method Detail

      limit

      public OOCSIString limit(int rate,
                                int seconds)
      -
      set the limiting of incoming events in terms of and timeframe; supports chained invocation
      +
      set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
      Overrides:
      limit in class OOCSIVariable<java.lang.String>
      diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIVariable.html b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIVariable.html index 0da2927..57a3481 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIVariable.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/OOCSIVariable.html @@ -2,9 +2,9 @@ - + OOCSIVariable - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.State.html b/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.State.html index 72a34bf..eb59fc6 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.State.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.State.html @@ -2,9 +2,9 @@ - + StateMachine.State - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.html b/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.html index dd4f45c..861c026 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/StateMachine.html @@ -2,9 +2,9 @@ - + StateMachine - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/OOCSIClient.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/OOCSIClient.html index 9a2b3e5..6ca1d34 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/OOCSIClient.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/OOCSIClient.html @@ -2,9 +2,9 @@ - + OOCSIClient - + @@ -18,7 +18,7 @@ catch(err) { } //--> -var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10}; +var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -274,43 +274,51 @@

      Method Summary

      void register(java.lang.String callName, Responder responder) -
      register a responder with the socket client with a given handle
      +
      register a responder with the socket client with a given handle "callName"
      void +register(java.lang.String channelName, + java.lang.String callName, + Responder responder) +
      register a responder with the socket client with a given handle "callName" on channel "channelName"
      + + + +void send(java.lang.String channelName, java.util.Map<java.lang.String,java.lang.Object> data)
      send a composite message (map) to the channel with the given name
      - + void send(java.lang.String channelName, java.lang.String message)
      send a string message to the channel with the given name
      - + void setReconnect(boolean reconnect)
      set whether or not a reconnection attempt should be made if a connection fails
      - + void subscribe(Handler handler)
      subscribe to my own channel
      - + void subscribe(java.lang.String channelName, Handler handler)
      subscribe to the channel with the given name
      - + void unsubscribe(java.lang.String channelName)
      unsubscribe from the channel with the given name
      @@ -589,7 +597,7 @@

      register

      register

      public void register(java.lang.String callName,
                            Responder responder)
      -
      register a responder with the socket client with a given handle
      +
      register a responder with the socket client with a given handle "callName"
      Parameters:
      callName -
      @@ -597,6 +605,24 @@

      register

    + + + +
      +
    • +

      register

      +
      public void register(java.lang.String channelName,
      +                     java.lang.String callName,
      +                     Responder responder)
      +
      register a responder with the socket client with a given handle "callName" on channel "channelName"
      +
      +
      Parameters:
      +
      channelName -
      +
      callName -
      +
      responder -
      +
      +
    • +
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIAwareness.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIAwareness.html index 0113b0a..1561d8b 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIAwareness.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIAwareness.html @@ -2,9 +2,9 @@ - + OOCSIAwareness - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIConsensus.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIConsensus.html index bfdefc3..f1c1726 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIConsensus.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIConsensus.html @@ -2,9 +2,9 @@ - + OOCSIConsensus - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIGather.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIGather.html index 2f6e89e..6ac81d8 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIGather.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIGather.html @@ -2,9 +2,9 @@ - + OOCSIGather - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.DistanceMetric.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.DistanceMetric.html index ba0d5b6..4f8a021 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.DistanceMetric.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.DistanceMetric.html @@ -2,9 +2,9 @@ - + OOCSISpatial.DistanceMetric - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.html index d05781b..196c264 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpatial.html @@ -2,9 +2,9 @@ - + OOCSISpatial - + @@ -325,8 +325,7 @@

    OOCSISpatial

    client -
    channelName -
    key -
    -
    myPosition -
    -
    neighbourThreshold -
    +
    neighborDistance -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpread.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpread.html index 8ac35ec..aa2cbf1 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpread.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISpread.html @@ -2,9 +2,9 @@ - + OOCSISpread - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISync.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISync.html index df1aff5..b95771b 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISync.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISync.html @@ -2,9 +2,9 @@ - + OOCSISync - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISystemCommunicator.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISystemCommunicator.html index 1ae1ab1..757084a 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISystemCommunicator.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSISystemCommunicator.html @@ -2,9 +2,9 @@ - + OOCSISystemCommunicator - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIVariable.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIVariable.html index ebece11..72f74d2 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIVariable.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/OOCSIVariable.html @@ -2,9 +2,9 @@ - + OOCSIVariable - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-frame.html index e68c4ac..2377aec 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-summary.html index 2b00b16..80f706c 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-tree.html index 66245df..fe7fb99 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.State.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.State.html index bdc1a84..23ef9e3 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.State.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.State.html @@ -2,9 +2,9 @@ - + OOCSIStateMachine.State - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.Transition.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.Transition.html index f1e439b..7479e19 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.Transition.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.Transition.html @@ -2,9 +2,9 @@ - + OOCSIStateMachine.Transition - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.html index 4cb20ad..900bc7d 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/OOCSIStateMachine.html @@ -2,9 +2,9 @@ - + OOCSIStateMachine - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-frame.html index 375a489..869517c 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior.state - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-summary.html index 975c10c..5ed7691 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior.state - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-tree.html index 6acef6b..2684055 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/behavior/state/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.behavior.state Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/OOCSIVariable.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/OOCSIVariable.html index 4a709b6..325befd 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/OOCSIVariable.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/OOCSIVariable.html @@ -2,9 +2,9 @@ - + OOCSIVariable - + @@ -321,7 +321,7 @@

    Method Summary

    OOCSIVariable<T> limit(int rate, int seconds) -
    set the limiting of incoming events in terms of and timeframe; supports chained invocation
    +
    set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
    @@ -789,7 +789,7 @@

    timeout

    limit

    public OOCSIVariable<T> limit(int rate,
                                   int seconds)
    -
    set the limiting of incoming events in terms of and timeframe; supports chained invocation
    +
    set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation
    Parameters:
    rate -
    @@ -844,7 +844,6 @@

    smooth

    Parameters:
    windowLength -
    -
    sigma -
    Returns:
    @@ -897,7 +896,7 @@

    generator

    java.lang.String outputKey)
    creates a periodic feedback loop that feed either the last input value or the reference value into the variable (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - addition, the new value of the variable is sent out to the channel with the given key
    + addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey"
    Parameters:
    periodMS -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-frame.html index 8f89fc0..a6f0497 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.data - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-summary.html index 7966e5d..8610c03 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.data - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-tree.html index a50d756..3e098b3 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/data/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.data Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-frame.html index a7a82f5..6c46853 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-summary.html index e7ddee8..85162a4 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-tree.html index faa74a9..eff5245 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/DataHandler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/DataHandler.html index 5f7cdc9..266b603 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/DataHandler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/DataHandler.html @@ -2,9 +2,9 @@ - + DataHandler - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/EventHandler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/EventHandler.html index 548af50..dd8fa1a 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/EventHandler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/EventHandler.html @@ -2,9 +2,9 @@ - + EventHandler - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/Handler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/Handler.html index a4b0fc4..7b5a89a 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/Handler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/Handler.html @@ -2,9 +2,9 @@ - + Handler - + @@ -157,13 +157,13 @@

    Method Summary

    static java.util.Map<java.lang.String,java.lang.Object> parseData(java.lang.String data) -
    parse the given String into a Map
    +
    parse the given "data" String into a Map
    static long parseTimestamp(java.lang.String timestamp) -
    parse the given String into a long value
    +
    parse the given "timestamp" String into a long value
    @@ -280,7 +280,7 @@

    parseData

    public static java.util.Map<java.lang.String,java.lang.Object> parseData(java.lang.String data)
                                                                       throws java.io.IOException,
                                                                              java.lang.ClassNotFoundException
    -
    parse the given String into a Map
    +
    parse the given "data" String into a Map
    Parameters:
    data -
    @@ -298,7 +298,7 @@

    parseData

  • parseTimestamp

    public static long parseTimestamp(java.lang.String timestamp)
    -
    parse the given String into a long value
    +
    parse the given "timestamp" String into a long value
    Parameters:
    timestamp -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiHandler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiHandler.html index 3461fb8..c1eee86 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiHandler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiHandler.html @@ -2,9 +2,9 @@ - + MultiHandler - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiMessage.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiMessage.html index c61c7a8..eaf4830 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiMessage.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/MultiMessage.html @@ -2,9 +2,9 @@ - + MultiMessage - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/OOCSIMessage.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/OOCSIMessage.html index 8c8f6cf..7df6d4d 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/OOCSIMessage.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/OOCSIMessage.html @@ -2,9 +2,9 @@ - + OOCSIMessage - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.html index a530c99..9b42710 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.html @@ -2,9 +2,9 @@ - + RateLimitedClientEventHandler - + @@ -125,7 +125,7 @@

    Class RateLimitedC
    public abstract class RateLimitedClientEventHandler
     extends RateLimitedEventHandler
    -
    rate limited event handler for events with structured data that will only let through events per +
    rate limited event handler for events with structured data that will only let through "rate" events per "second" secs; this counts for all incoming events per sender which protects against single senders overloading the system
    Author:
    @@ -166,7 +166,7 @@

    Constructor Summary

    RateLimitedClientEventHandler(int rate, int seconds) -
    creates a rate limited event handler that will at most let through event per secs
    +
    creates a rate limited event handler that will at most let through "rate" event per "second" secs
    @@ -246,7 +246,7 @@

    Constructor Detail

    RateLimitedClientEventHandler

    public RateLimitedClientEventHandler(int rate,
                                          int seconds)
    -
    creates a rate limited event handler that will at most let through event per secs
    +
    creates a rate limited event handler that will at most let through "rate" event per "second" secs
    Parameters:
    rate -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.html index 607ebcb..f8cc702 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.html @@ -2,9 +2,9 @@ - + RateLimitedEventHandler - + @@ -124,7 +124,7 @@

    Class RateLimitedEventHa
    public abstract class RateLimitedEventHandler
     extends EventHandler
    -
    rate limited event handler for events with structured data that will only let through events per +
    rate limited event handler for events with structured data that will only let through "rate" events per "second" secs; this counts for all incoming events
    Author:
    @@ -177,7 +177,7 @@

    Constructor Summary

    RateLimitedEventHandler(int rate, int seconds) -
    creates a rate limited event handler that will at most let through event per secs
    +
    creates a rate limited event handler that will at most let through "rate" event per "second" secs
    @@ -217,7 +217,7 @@

    Method Summary

    void limit(int rate, int seconds) -
    reconfigure the rate limitation to different and timeframe
    +
    reconfigure the rate limitation to different "rate" and "seconds" timeframe
    @@ -310,7 +310,7 @@

    Constructor Detail

    RateLimitedEventHandler

    public RateLimitedEventHandler(int rate,
                                    int seconds)
    -
    creates a rate limited event handler that will at most let through event per secs
    +
    creates a rate limited event handler that will at most let through "rate" event per "second" secs
    Parameters:
    rate -
    @@ -389,7 +389,7 @@

    exceeded

    limit

    public void limit(int rate,
                       int seconds)
    -
    reconfigure the rate limitation to different and timeframe
    +
    reconfigure the rate limitation to different "rate" and "seconds" timeframe
    Parameters:
    rate -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-frame.html index 0ddada1..5ce87aa 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.protocol - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-summary.html index cfe2efd..9aa0c6e 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.protocol - + @@ -119,14 +119,14 @@

    Package nl.tue.id.oocsi.client.protocol RateLimitedClientEventHandler -
    rate limited event handler for events with structured data that will only let through events per +
    rate limited event handler for events with structured data that will only let through "rate" events per "second" secs; this counts for all incoming events per sender which protects against single senders overloading the system
    RateLimitedEventHandler -
    rate limited event handler for events with structured data that will only let through events per +
    rate limited event handler for events with structured data that will only let through "rate" events per "second" secs; this counts for all incoming events
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-tree.html index 5cb51d2..3ebffba 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/protocol/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.protocol Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/OOCSICall.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/OOCSICall.html index 4f6ed7e..a5a02b0 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/OOCSICall.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/OOCSICall.html @@ -2,9 +2,9 @@ - + OOCSICall - + @@ -184,7 +184,7 @@

    Constructor Summary

    java.lang.String callName, int timeoutMS, int maxResponses) -
    create a new message to the channel
    +
    create a new message to the channel "channelName"
    @@ -193,7 +193,7 @@

    Constructor Summary

    java.lang.String callName, int timeoutMS, int maxResponses) -
    create a new message to the channel
    +
    create a new message to the channel "channelName"
    @@ -400,7 +400,7 @@

    OOCSICall

    java.lang.String callName, int timeoutMS, int maxResponses) -
    create a new message to the channel
    +
    create a new message to the channel "channelName"
    Parameters:
    oocsi -
    @@ -421,7 +421,7 @@

    OOCSICall

    java.lang.String callName, int timeoutMS, int maxResponses) -
    create a new message to the channel
    +
    create a new message to the channel "channelName"
    Parameters:
    oocsi -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Responder.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Responder.html index ebc7a26..82e99ad 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Responder.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Responder.html @@ -2,9 +2,9 @@ - + Responder - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceField.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceField.html index be65f01..bb220b5 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceField.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceField.html @@ -2,9 +2,9 @@ - + Service.ServiceField - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceMethod.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceMethod.html index d46c0e5..1553090 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceMethod.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.ServiceMethod.html @@ -2,9 +2,9 @@ - + Service.ServiceMethod - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.html index 3d47f3a..4aba84d 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/Service.html @@ -2,9 +2,9 @@ - + Service - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-frame.html index aedfe23..153b94e 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.services - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-summary.html index 579e498..589f7d0 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.services - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-tree.html index 590550a..93d4f63 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/services/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.services Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/Base64Coder.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/Base64Coder.html index 4e52c8d..dbb5c30 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/Base64Coder.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/Base64Coder.html @@ -2,9 +2,9 @@ - + Base64Coder - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/SocketClient.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/SocketClient.html index d587893..f02e7fc 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/SocketClient.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/SocketClient.html @@ -2,9 +2,9 @@ - + SocketClient - + @@ -225,7 +225,7 @@

    Method Summary

    void register(java.lang.String callName, Responder responder) -
    register a responder with a handle
    +
    register a responder with a handle "callName"
    @@ -250,7 +250,9 @@

    Method Summary

    boolean -startMulticastLookup()  +startMulticastLookup() +
    start pinging for a multi-cast lookup
    + void @@ -331,6 +333,10 @@

    Method Detail

  • startMulticastLookup

    public boolean startMulticastLookup()
    +
    start pinging for a multi-cast lookup
    +
    +
    Returns:
    +
  • @@ -496,7 +502,7 @@

    register

    register

    public void register(java.lang.String callName,
                          Responder responder)
    -
    register a responder with a handle
    +
    register a responder with a handle "callName"
    Parameters:
    callName -
    diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-frame.html index 4ff5b63..6786bba 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.socket - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-summary.html index fc60e80..982390b 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.socket - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-tree.html index ab92930..3690061 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/client/socket/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi.client.socket Class Hierarchy - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/package-frame.html b/dist/oocsi/reference/nl/tue/id/oocsi/package-frame.html index e0983c8..72045aa 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/package-frame.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/package-frame.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/package-summary.html b/dist/oocsi/reference/nl/tue/id/oocsi/package-summary.html index 0b3844a..38b3b2c 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/package-summary.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/package-summary.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi - + diff --git a/dist/oocsi/reference/nl/tue/id/oocsi/package-tree.html b/dist/oocsi/reference/nl/tue/id/oocsi/package-tree.html index f836240..67422c3 100644 --- a/dist/oocsi/reference/nl/tue/id/oocsi/package-tree.html +++ b/dist/oocsi/reference/nl/tue/id/oocsi/package-tree.html @@ -2,9 +2,9 @@ - + nl.tue.id.oocsi Class Hierarchy - + diff --git a/dist/oocsi/reference/overview-frame.html b/dist/oocsi/reference/overview-frame.html index b7c6826..9873ea6 100644 --- a/dist/oocsi/reference/overview-frame.html +++ b/dist/oocsi/reference/overview-frame.html @@ -2,9 +2,9 @@ - + Overview List - + diff --git a/dist/oocsi/reference/overview-summary.html b/dist/oocsi/reference/overview-summary.html index 516b87d..65cf5b2 100644 --- a/dist/oocsi/reference/overview-summary.html +++ b/dist/oocsi/reference/overview-summary.html @@ -2,9 +2,9 @@ - + Overview - + diff --git a/dist/oocsi/reference/overview-tree.html b/dist/oocsi/reference/overview-tree.html index 3fcd9eb..5022ff8 100644 --- a/dist/oocsi/reference/overview-tree.html +++ b/dist/oocsi/reference/overview-tree.html @@ -2,9 +2,9 @@ - + Class Hierarchy - + diff --git a/dist/oocsi/reference/serialized-form.html b/dist/oocsi/reference/serialized-form.html index 8b10c3c..6688b87 100644 --- a/dist/oocsi/reference/serialized-form.html +++ b/dist/oocsi/reference/serialized-form.html @@ -2,9 +2,9 @@ - + Serialized Form - + diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSI.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSI.java index be5d9be..19ddb69 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSI.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSI.java @@ -109,7 +109,7 @@ private OOCSI(Object parent, OOCSICommunicator communicator) { } /** - * create a new OOCSI network connection with client handle (), server host, and port + * create a new OOCSI network connection with client handle ("name"), server host, and port * * @param parent * @param name @@ -221,6 +221,14 @@ public boolean isConnected() { return oocsi.isConnected(); } + /** + * disconnect this client from the OOCSI network + * + */ + public void disconnect() { + oocsi.disconnect(); + } + /** * send data through a channel given by the channelName * @@ -232,7 +240,7 @@ public OOCSIMessage channel(String channelName) { } /** - * create a call for service method + * create a call for service method "callName" * * @param callName * @return @@ -242,7 +250,18 @@ public OOCSICall call(String callName) { } /** - * create a call for service method + * create a call for service method "callName" on channel "channelName" + * + * @param channelName + * @param callName + * @return + */ + public OOCSICall call(String channelName, String callName) { + return oocsi.call(channelName, callName); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -253,7 +272,19 @@ public OOCSICall call(String callName, int timeoutMS) { } /** - * create a call for service method + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS) { + return oocsi.call(channelName, callName, timeoutMS); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -264,6 +295,19 @@ public OOCSICall call(String callName, int timeoutMS, int maxResponses) { return oocsi.call(callName, timeoutMS, maxResponses); } + /** + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @param maxResponses + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS, int maxResponses) { + return oocsi.call(channelName, callName, timeoutMS, maxResponses); + } + /** * send raw data to given channel * @@ -289,7 +333,7 @@ public void subscribe(String channelName) { } /** - * subscribe to a channel with a given handler method name + * subscribe to a channel with a given handler method name "handlerName" * * @param channelName * @param handlerName @@ -304,8 +348,8 @@ public void subscribe(String channelName, String handlerName) { } /** - * subscribe to a channel with a given handler method name ; limits the rate of incoming events to - * events per secs + * subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + * "rate" events per "seconds" secs * * @param channelName * @param handlerName @@ -322,8 +366,8 @@ public void subscribe(String channelName, String handlerName, int rate, int seco } /** - * subscribe to a channel with a given handler method name ; limits the rate of incoming events to - * events per secs; controls whether we limit the rate of incoming event per sender + * subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + * "rate" events per "seconds" secs; "ratePerSender" controls whether we limit the rate of incoming event per sender * or for all events coming in from all senders * * @param channelName @@ -356,7 +400,8 @@ public void register(String responderName) { } /** - * register a responder; requires a method with the given responderName with parameters (OOCSIEvent, OOCSIData) + * register a responder "responderName"; requires a method with the given name "responderName" with parameters + * (OOCSIEvent, OOCSIData) * * @param responderName * @param responderFunctionName @@ -370,6 +415,39 @@ public void register(String responderName, String responderFunctionName) { oocsi.register(responderName, responderFunctionName); } + /** + * register a responder "responderName" on channel "channelName"; requires a method with the responder name + * "responderName" with parameters (OOCSIEvent, OOCSIData) + * + * @param channelName + * @param responderName + */ + public void registerChannel(String channelName, String responderName) { + + if (!oocsi.isConnected()) { + return; + } + + oocsi.registerChannel(channelName, responderName); + } + + /** + * register a responder "responderName" on channel "channelName"; requires a method with the given name + * "responderName" with parameters (OOCSIEvent, OOCSIData) + * + * @param channelName + * @param responderName + * @param responderFunctionName + */ + public void registerChannel(String channelName, String responderName, String responderFunctionName) { + + if (!oocsi.isConnected()) { + return; + } + + oocsi.registerChannel(channelName, responderName, responderFunctionName); + } + /** * retrieve the list of clients on the server * diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIBoolean.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIBoolean.java index c258038..0b96b69 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIBoolean.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIBoolean.java @@ -30,7 +30,7 @@ public OOCSIBoolean(boolean referenceValue, int timeout) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSICommunicator.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSICommunicator.java index 5185286..f6bd4c3 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSICommunicator.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSICommunicator.java @@ -2,6 +2,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import nl.tue.id.oocsi.client.OOCSIClient; import nl.tue.id.oocsi.client.protocol.EventHandler; @@ -86,7 +87,7 @@ public OOCSIMessage channel(String channelName) { } /** - * create a call for service method + * create a call for service method "callName" * * @param callName * @return @@ -96,7 +97,18 @@ public OOCSICall call(String callName) { } /** - * create a call for service method + * create a call for service method "callName" on channel "channelName" + * + * @param channelName + * @param callName + * @return + */ + public OOCSICall call(String channelName, String callName) { + return call(channelName, callName, 1000, 1); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -107,7 +119,19 @@ public OOCSICall call(String callName, int timeoutMS) { } /** - * create a call for service method + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS) { + return call(channelName, callName, timeoutMS, 1); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -119,9 +143,22 @@ public OOCSICall call(String callName, int timeoutMS, int maxResponses) { } /** - * subscribe to channel for handler method in the parent class; the handler method will + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @param maxResponses + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS, int maxResponses) { + return new OOCSICall(this, channelName, callName, timeoutMS, maxResponses); + } + + /** + * subscribe to channel "channelName" for handler method "channelName" in the parent class; the handler method will * be called with an OOCSIEvent object upon occurrence of an event; will try 'handleOOCSIEvent' as a fall-back in - * case no matching handler method is found for + * case no matching handler method is found for "channelName" * * @param channelName * @return @@ -131,7 +168,7 @@ public boolean subscribe(String channelName) { } /** - * subscribe to channel for handler method in the parent class with the given name ; the + * subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the * handler method will be called with an OOCSIEvent object upon occurrence of an event * * @param channelName @@ -143,7 +180,7 @@ public boolean subscribe(String channelName, String handlerName) { } /** - * subscribe to channel for handler method in the parent class with the given name ; the + * subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the * handler method will be called with an OOCSIEvent object upon occurrence of an event * * @param channelName @@ -157,7 +194,7 @@ public boolean subscribe(String channelName, String handlerName, int rate, int s } /** - * subscribe to channel for handler method in the parent class with the given name ; the + * subscribe to channel "channelName" for handler method in the parent class with the given name "handlerName"; the * handler method will be called with an OOCSIEvent object upon occurrence of an event * * @param channelName @@ -167,12 +204,19 @@ public boolean subscribe(String channelName, String handlerName, int rate, int s * @param ratePerSender * @return */ - public boolean subscribe(String channelName, String handlerName, int rate, int seconds, boolean ratePerSender) { + public boolean subscribe(final String channelName, String handlerName, int rate, int seconds, + boolean ratePerSender) { // try event handler with OOCSIEvent parameter try { final Method handler = parent.getClass().getDeclaredMethod(handlerName, new Class[] { OOCSIEvent.class }); + if (!Modifier.isPublic(handler.getModifiers())) { + log(" - [ERROR] event handler for channel " + channelName + + " needs to be a public method: 'public void " + channelName + "(OOCSIEvent evt) { ... }'"); + return false; + } + if (rate > 0 && seconds > 0) { if (ratePerSender) { subscribe(channelName, new RateLimitedClientEventHandler(rate, seconds) { @@ -224,10 +268,13 @@ public void receive(OOCSIEvent event) { } }); } + log(" - subscribed to " + channelName + " with event handler"); return true; - } catch (Exception e) { + } catch ( + + Exception e) { // not found, just return false if (!name.equals(channelName)) { log(" - no event handler for channel " + channelName); @@ -270,9 +317,9 @@ public void receive(OOCSIEvent event) { } /** - * subscribe to channel for handler method in the parent class; the handler method + * subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method * will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try - * 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for + * 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName" * * @param responderName * @return @@ -282,7 +329,7 @@ public boolean register(String responderName) { } /** - * register a handler method in the parent class with the given name for the channel ; + * register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; * the handler method will be called with an OOCSIEvent object upon occurrence of an event * * @param responderName @@ -327,4 +374,66 @@ public void respond(OOCSIEvent event, OOCSIData response) { } } + + /** + * subscribe to channel "responderName" for handler method "responderName" in the parent class; the handler method + * will be called with an OOCSIEvent object and a response map object upon occurrence of an event; will try + * 'respondToOOCSIEvent' as a fall-back in case no matching handler method is found for "responderName" + * + * @param channelName + * @param responderName + * @return + */ + public boolean registerChannel(String channelName, String responderName) { + return registerChannel(channelName, responderName, responderName) ? true + : registerChannel(channelName, responderName, "respondToOOCSIEvent"); + } + + /** + * register a handler method in the parent class with the given name "handlerName" for the channel "channelName"; + * the handler method will be called with an OOCSIEvent object upon occurrence of an event + * + * @param channelName + * @param responderName + * @param handlerName + * @return + */ + public boolean registerChannel(String channelName, String responderName, String handlerName) { + + // try responder event handler with OOCSIEvent and response map parameters + + try { + final Method handler = parent.getClass().getDeclaredMethod(handlerName, + new Class[] { OOCSIEvent.class, OOCSIData.class }); + Responder responder = new Responder(this) { + + @Override + public void respond(OOCSIEvent event, OOCSIData response) { + try { + handler.invoke(parent, new Object[] { event, response }); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + }; + responder.setCallName(responderName); + register(channelName, responderName, responder); + + log(" - registered " + responderName + " as call responder"); + + return true; + } catch (Exception e) { + // not found, just return false + if (!name.equals(responderName)) { + log(" - no call responders found for channel " + responderName); + } + + return false; + } + + } } diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIDouble.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIDouble.java index 4e2eb2e..70f7102 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIDouble.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIDouble.java @@ -113,7 +113,7 @@ public OOCSIDouble timeout(int timeoutMS) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds @@ -188,7 +188,7 @@ public OOCSIDouble generator(long periodMS) { /** * creates a periodic feedback loop that feed either the last input value or the reference value into the variable * (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - * addition, the new value of the variable is sent out to the channel with the given key + * addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey" * * @param periodMS * @param outputChannel diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIFloat.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIFloat.java index 2502a3d..6cb673f 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIFloat.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIFloat.java @@ -113,7 +113,7 @@ public OOCSIFloat timeout(int timeoutMS) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds @@ -189,7 +189,7 @@ public OOCSIFloat generator(long periodMS) { /** * creates a periodic feedback loop that feed either the last input value or the reference value into the variable * (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - * addition, the new value of the variable is sent out to the channel with the given key + * addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey" * * @param periodMS * @param outputChannel diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIInt.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIInt.java index 1a47f89..6118ae7 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIInt.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIInt.java @@ -118,7 +118,7 @@ public OOCSIInt timeout(int timeoutMS) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds @@ -193,7 +193,7 @@ public OOCSIInt generator(long periodMS) { /** * creates a periodic feedback loop that feed either the last input value or the reference value into the variable * (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - * addition, the new value of the variable is sent out to the channel with the given key + * addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey" * * @param periodMS * @param outputChannel diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSILong.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSILong.java index efe6623..f534269 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSILong.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSILong.java @@ -114,7 +114,7 @@ public OOCSILong timeout(int timeoutMS) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds @@ -189,7 +189,7 @@ public OOCSILong generator(long periodMS) { /** * creates a periodic feedback loop that feed either the last input value or the reference value into the variable * (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - * addition, the new value of the variable is sent out to the channel with the given key + * addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey" * * @param periodMS * @param outputChannel diff --git a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIString.java b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIString.java index de0f895..d0f68db 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/OOCSIString.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/OOCSIString.java @@ -26,7 +26,7 @@ public OOCSIString(OOCSIClient client, String channelName, String key, String re } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/OOCSIClient.java b/dist/oocsi/src/nl/tue/id/oocsi/client/OOCSIClient.java index ee1e38a..bc7cde2 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/OOCSIClient.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/OOCSIClient.java @@ -16,7 +16,7 @@ */ public class OOCSIClient { - public static final String VERSION = "1.3.6"; + public static final String VERSION = "1.3.7"; private SocketClient sc; protected String name; @@ -46,8 +46,9 @@ public OOCSIClient(String name) { // check oocsi name if (name.contains(" ")) { - log("OOCSI name cannot contain spaces"); - System.exit(-1); + log("[ERROR] OOCSI name cannot contain spaces"); + log(" - OOCSI connection aborted"); + return; } this.name = name; @@ -172,7 +173,7 @@ public void register(OOCSICall call) { } /** - * register a responder with the socket client with a given handle + * register a responder with the socket client with a given handle "callName" * * @param callName * @param responder @@ -183,6 +184,19 @@ public void register(String callName, Responder responder) { sc.register(callName, responder); } + /** + * register a responder with the socket client with a given handle "callName" on channel "channelName" + * + * @param channelName + * @param callName + * @param responder + */ + public void register(String channelName, String callName, Responder responder) { + responder.setCallName(callName); + sc.subscribe(channelName, responder); + sc.register(callName, responder); + } + /** * send a string message to the channel with the given name * diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/behavior/OOCSISpatial.java b/dist/oocsi/src/nl/tue/id/oocsi/client/behavior/OOCSISpatial.java index d283c2f..7dc00d0 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/behavior/OOCSISpatial.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/behavior/OOCSISpatial.java @@ -50,8 +50,7 @@ public class OOCSISpatial extends OOCSISystemCommunicator { * @param client * @param channelName * @param key - * @param myPosition - * @param neighbourThreshold + * @param neighborDistance */ public OOCSISpatial(OOCSIClient client, String channelName, String key, Position neighborDistance) { this(client, channelName, key, (int) (Math.random() * REBALANCING_TIMEOUT), null); diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/data/OOCSIVariable.java b/dist/oocsi/src/nl/tue/id/oocsi/client/data/OOCSIVariable.java index 3fe9c86..0bdf773 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/data/OOCSIVariable.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/data/OOCSIVariable.java @@ -34,10 +34,10 @@ public class OOCSIVariable extends OOCSISystemCommunicator { // key of internal variable in the OOCSI network private String key; - // reference or default value for variable in case nothing has been received for milliseconds + // reference or default value for variable in case nothing has been received for "timeout" milliseconds private T internalReference; - // amount of milliseconds to wait until the reference value is applied to + // amount of milliseconds to wait until the reference value is applied to "internalVariable" private int timeout; // last time the variable was updated @@ -338,7 +338,7 @@ public OOCSIVariable timeout(int timeoutMS) { } /** - * set the limiting of incoming events in terms of and timeframe; supports chained invocation + * set the limiting of incoming events in terms of "rate" and "seconds" timeframe; supports chained invocation * * @param rate * @param seconds @@ -379,7 +379,6 @@ public OOCSIVariable max(T max) { * during operation, however, this will reset the buffer); supports chained invocation * * @param windowLength - * @param sigma * @return */ public OOCSIVariable smooth(int windowLength) { @@ -417,7 +416,7 @@ public OOCSIVariable generator(long periodMS) { /** * creates a periodic feedback loop that feed either the last input value or the reference value into the variable * (locally). If there is no reference value set, the former applies. The period is given in milliseconds. In - * addition, the new value of the variable is sent out to the channel with the given key + * addition, the new value of the variable is sent out to the channel "outputChannel" with the given key "outputKey" * * @param periodMS * @param outputChannel diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/Handler.java b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/Handler.java index de7359c..615efdb 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/Handler.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/Handler.java @@ -51,7 +51,7 @@ abstract public void receive(String sender, Map data, long times String recipient); /** - * parse the given String into a Map + * parse the given "data" String into a Map * * @param data * @return @@ -69,7 +69,7 @@ public static Map parseData(String data) throws IOException, Cla } /** - * parse the given String into a long value + * parse the given "timestamp" String into a long value * * @param timestamp * @return diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.java b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.java index 7ec5642..8434614 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedClientEventHandler.java @@ -4,7 +4,7 @@ import java.util.Map; /** - * rate limited event handler for events with structured data that will only let through events per + * rate limited event handler for events with structured data that will only let through "rate" events per "second" * secs; this counts for all incoming events per sender which protects against single senders overloading the system * * @author matsfunk @@ -15,7 +15,7 @@ abstract public class RateLimitedClientEventHandler extends RateLimitedEventHand private Map counter = new HashMap(100); /** - * creates a rate limited event handler that will at most let through event per secs + * creates a rate limited event handler that will at most let through "rate" event per "second" secs * * @param rate * @param seconds diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.java b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.java index 76f4384..36d5889 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/protocol/RateLimitedEventHandler.java @@ -3,7 +3,7 @@ import java.util.Map; /** - * rate limited event handler for events with structured data that will only let through events per + * rate limited event handler for events with structured data that will only let through "rate" events per "second" * secs; this counts for all incoming events * * @author matsfunk @@ -21,7 +21,7 @@ abstract public class RateLimitedEventHandler extends EventHandler { private int counter = 0; /** - * creates a rate limited event handler that will at most let through event per secs + * creates a rate limited event handler that will at most let through "rate" event per "second" secs * * @param rate * @param seconds @@ -85,7 +85,7 @@ public void exceeded(String sender, Map data, long timestamp, St } /** - * reconfigure the rate limitation to different and timeframe + * reconfigure the rate limitation to different "rate" and "seconds" timeframe * * @param rate * @param seconds diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/services/OOCSICall.java b/dist/oocsi/src/nl/tue/id/oocsi/client/services/OOCSICall.java index 4958823..590339a 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/services/OOCSICall.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/services/OOCSICall.java @@ -27,7 +27,7 @@ enum CALL_MODE { private OOCSIEvent response = null; /** - * create a new message to the channel + * create a new message to the channel "channelName" * * @param oocsi * @param callName @@ -39,7 +39,7 @@ public OOCSICall(OOCSIClient oocsi, String callName, int timeoutMS, int maxRespo } /** - * create a new message to the channel + * create a new message to the channel "channelName" * * @param oocsi * @param channelName diff --git a/dist/oocsi/src/nl/tue/id/oocsi/client/socket/SocketClient.java b/dist/oocsi/src/nl/tue/id/oocsi/client/socket/SocketClient.java index ce79f7a..8fee43f 100644 --- a/dist/oocsi/src/nl/tue/id/oocsi/client/socket/SocketClient.java +++ b/dist/oocsi/src/nl/tue/id/oocsi/client/socket/SocketClient.java @@ -41,21 +41,28 @@ public class SocketClient { private static final int MULTICAST_PORT = 4448; private static final String MULTICAST_GROUP = "224.0.0.144"; + private String hostname; + private int port; private String name; + private Map channels; private Map services; private Queue tempIncomingMessages = new LinkedBlockingQueue(1); private List openCalls = new LinkedList(); + // i/o private Socket socket; private BufferedReader input; private PrintWriter output; + + // connection flags private boolean disconnected = false; private boolean hasPrintedServerInfo = false; private boolean connectionEstablished = false; private boolean reconnect = false; private int reconnectCountDown = 100; + // thread pool private ExecutorService executor; /** @@ -72,6 +79,11 @@ public SocketClient(String name, Map channels, Map 0)) { - result = connectAttempt(hostname, port); - if (result) { - reconnectCountDown = 100; - break; - } else { - sleep(1000); - } + + // store the connection details + this.hostname = hostname; + this.port = port; + + // start connection thread + executor.submit(new SocketClientRunnable()); + + // check back on connection progress + while (!disconnected && !connectionEstablished && reconnectCountDown > 0) { + sleep(100); } - return result; + // return connection status + return connectionEstablished; } /** @@ -164,8 +168,9 @@ public boolean connect(final String hostname, final int port) { * @param hostname * @param port * @return + * @throws OOCSIAuthenticationException */ - private boolean connectAttempt(final String hostname, final int port) { + private boolean connectAttempt(final String hostname, final int port) throws OOCSIAuthenticationException { try { // configure and connect socket connectSocket(hostname, port); @@ -197,23 +202,35 @@ private boolean connectAttempt(final String hostname, final int port) { } /** + * connection handshake after the socket connection has been established + * * @param hostname * @param port * @return * @throws IOException + * @throws OOCSIAuthenticationException */ - private boolean connectionHandshake(final String hostname, final int port) throws IOException { + private boolean connectionHandshake(final String hostname, final int port) + throws IOException, OOCSIAuthenticationException { + // short timeout when connecting + socket.setSoTimeout(5000); + // check if we are ok to connect String serverWelcomeMessage; if (!socket.isClosed() && (serverWelcomeMessage = input.readLine()) != null) { + // name is not ok if (!serverWelcomeMessage.startsWith("welcome")) { disconnect(); log(" - disconnected (client name not accepted)"); - return false; - } else { - log(" - connected successfully"); + throw new OOCSIAuthenticationException(); } + // name is ok + log(" - connected successfully"); + + // longer timeout after successful connection + socket.setSoTimeout(20000); + // first data has arrived = connection is ok connectionEstablished = true; @@ -222,16 +239,16 @@ private boolean connectionHandshake(final String hostname, final int port) throw this.internalSubscribe(channelName); } - // if ok, run the communication in a different thread - executor.submit(new SocketClientRunnable(hostname, port)); + reconnectCountDown = 0; + return true; } reconnectCountDown = 0; - return true; + return false; } /** - * connect a socket + * configure and connect a socket * * @param hostname * @param port @@ -239,6 +256,8 @@ private boolean connectionHandshake(final String hostname, final int port) throw * @throws IOException */ private void connectSocket(final String hostname, final int port) throws SocketException, IOException { + + // open and configure socket socket = new Socket(); socket.setTcpNoDelay(true); socket.setTrafficClass(0x10); @@ -251,6 +270,7 @@ private void connectSocket(final String hostname, final int port) throws SocketE /** * print server hint once + * */ private void printServerInfo() { if (!hasPrintedServerInfo) { @@ -289,8 +309,10 @@ public String getName() { * */ public void disconnect() { - // disconnect from server with handshake and no reconnect + // disconnect from server with handshake disconnected = true; + + // and no reconnect reconnect = false; reconnectCountDown = 0; @@ -318,18 +340,17 @@ public void kill() { */ public void reconnect() { output.println("quit"); - internalDisconnect(); log(" - disconnected (by reconnect)"); } /** - * close all resources safely + * close all i/o resources safely * */ private void internalDisconnect() { - // shutdown IO + // shutdown I/O try { if (output != null) { output.close(); @@ -341,9 +362,9 @@ private void internalDisconnect() { socket.close(); } } catch (IOException e) { - e.printStackTrace(); + // do nothing } catch (NullPointerException e) { - e.printStackTrace(); + // do nothing } } @@ -487,7 +508,7 @@ public void register(OOCSICall call) { } /** - * register a responder with a handle + * register a responder with a handle "callName" * * @param callName * @param responder @@ -611,6 +632,19 @@ private String serialize(Map data) { } } + /** + * let thread sleep for ms milliseconds + * + */ + private void sleep(int ms) { + try { + // so, wait a bit before next trial + Thread.sleep(ms); + } catch (InterruptedException e) { + // do nothing + } + } + /** * logging of message on console (can be overridden by subclass) */ @@ -618,45 +652,85 @@ public void log(String message) { // no logging by default } + /** + * communication handler (to be run in a separate thread) + * + */ class SocketClientRunnable implements Runnable { - private String hostname; - private int port; + public SocketClientRunnable() { + // TODO Auto-generated constructor stub + } - /** - * - * - * @param hostname - * @param port - */ - public SocketClientRunnable(String hostname, int port) { - this.hostname = hostname; - this.port = port; + @Override + public void run() { + try { + int connections = 0; + + // SESSIONS + // only do if we either always reconnect, or it's the first connection + while (reconnect || connections == 0) { + connections++; + + // ATTEMPTS + // try 100 times per (re-)connection attempt + reconnectCountDown = 100; + while (reconnectCountDown-- > 0) { + // try to connect + if (connectAttempt(hostname, port)) { + // connection is fine, stop trials + break; + } + + // another trial, sleep before + sleep(1000); + } + + if (isConnected()) { + // connection rest forever + runCommunication(); + } else { + // take a rest before trying again + sleep(5000); + } + } + } catch (OOCSIAuthenticationException oae) { + disconnect(); + // quit this thread... + } } - /* - * (non-Javadoc) + /** + * all communications after the initial handshake happen here * - * @see java.lang.Runnable#run() */ - public void run() { + private void runCommunication() { try { String fromServer; - while (!socket.isClosed() && (fromServer = input.readLine()) != null) { - handleMessage(fromServer); - } + int cyclesSinceRead = 0; + while (!socket.isClosed()) { - } catch (IOException e) { - // do nothing - } finally { - internalDisconnect(); - log(" - OOCSI disconnected " - + (!connectionEstablished ? "(client name not accepted)" : "(server unavailable)")); + // main messaging loop + while (input.ready() && (fromServer = input.readLine()) != null) { + handleMessage(fromServer); + cyclesSinceRead = 0; + } - sleep(200); + // sleep if there is nothing to read + sleep(1); - // try reconnect - connect(hostname, port); + // if no data came in for 20 secs, kill connection and reconnect + if (cyclesSinceRead++ > 20000) { + internalDisconnect(); + log(" - OOCSI disconnected (application level timeout)"); + break; + } + } + } catch (Exception e) { + internalDisconnect(); + if (connectionEstablished) { + log(" - OOCSI disconnected (server unavailable)"); + } } } @@ -702,15 +776,21 @@ public void handleMessage(String fromServer) throws IOException { * @param c */ private void handleData(final String channel, final String data, final String timestamp, final String sender, - Handler c) { + final Handler c) { + // try to parse the data Map dataMap = parseData(data); if (dataMap != null) { handleMappedData(channel, data, timestamp, sender, c, dataMap); } + // if dataMap not parseable and channel ready else if (c != null) { - c.send(sender, data, timestamp, channel, name); + executor.submit(new Runnable() { + public void run() { + c.send(sender, data, timestamp, channel, name); + } + }); } } @@ -725,7 +805,7 @@ else if (c != null) { * @param dataMap */ private void handleMappedData(final String channel, final String data, final String timestamp, - final String sender, Handler c, Map dataMap) { + final String sender, final Handler c, final Map dataMap) { // try to find a responder if (dataMap.containsKey(OOCSICall.MESSAGE_HANDLE)) { final Responder r = services.get((String) dataMap.get(OOCSICall.MESSAGE_HANDLE)); @@ -736,7 +816,9 @@ public void run() { r.receive(sender, Handler.parseData(data), Handler.parseTimestamp(timestamp), channel, name); } catch (ClassNotFoundException e) { + // nothing } catch (Exception e) { + // nothing } } }); @@ -750,11 +832,15 @@ public void run() { // walk from back to allow for removal for (int i = openCalls.size() - 1; i >= 0; i--) { - OOCSICall call = openCalls.get(i); + final OOCSICall call = openCalls.get(i); if (!call.isValid()) { openCalls.remove(i); } else if (call.getId().equals(id)) { - call.respond(dataMap); + executor.submit(new Runnable() { + public void run() { + call.respond(dataMap); + } + }); break; } } @@ -763,11 +849,18 @@ public void run() { // if no responder or call and channel ready waiting if (c != null) { - c.send(sender, data, timestamp, channel, name); + executor.submit(new Runnable() { + public void run() { + c.send(sender, data, timestamp, channel, name); + } + }); } + } /** + * parse the message data + * * @param data * @return */ @@ -783,4 +876,10 @@ private Map parseData(String data) { return dataMap; } } + + class OOCSIAuthenticationException extends Exception { + + private static final long serialVersionUID = 5074228098705122200L; + + } } diff --git a/src/nl/tue/id/oocsi/OOCSI.java b/src/nl/tue/id/oocsi/OOCSI.java index be5d9be..19ddb69 100644 --- a/src/nl/tue/id/oocsi/OOCSI.java +++ b/src/nl/tue/id/oocsi/OOCSI.java @@ -109,7 +109,7 @@ private OOCSI(Object parent, OOCSICommunicator communicator) { } /** - * create a new OOCSI network connection with client handle (), server host, and port + * create a new OOCSI network connection with client handle ("name"), server host, and port * * @param parent * @param name @@ -221,6 +221,14 @@ public boolean isConnected() { return oocsi.isConnected(); } + /** + * disconnect this client from the OOCSI network + * + */ + public void disconnect() { + oocsi.disconnect(); + } + /** * send data through a channel given by the channelName * @@ -232,7 +240,7 @@ public OOCSIMessage channel(String channelName) { } /** - * create a call for service method + * create a call for service method "callName" * * @param callName * @return @@ -242,7 +250,18 @@ public OOCSICall call(String callName) { } /** - * create a call for service method + * create a call for service method "callName" on channel "channelName" + * + * @param channelName + * @param callName + * @return + */ + public OOCSICall call(String channelName, String callName) { + return oocsi.call(channelName, callName); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -253,7 +272,19 @@ public OOCSICall call(String callName, int timeoutMS) { } /** - * create a call for service method + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS) { + return oocsi.call(channelName, callName, timeoutMS); + } + + /** + * create a call for service method "callName" with a specific timeout * * @param callName * @param timeoutMS @@ -264,6 +295,19 @@ public OOCSICall call(String callName, int timeoutMS, int maxResponses) { return oocsi.call(callName, timeoutMS, maxResponses); } + /** + * create a call for service method "callName" with a specific timeout on channel "channelName" + * + * @param channelName + * @param callName + * @param timeoutMS + * @param maxResponses + * @return + */ + public OOCSICall call(String channelName, String callName, int timeoutMS, int maxResponses) { + return oocsi.call(channelName, callName, timeoutMS, maxResponses); + } + /** * send raw data to given channel * @@ -289,7 +333,7 @@ public void subscribe(String channelName) { } /** - * subscribe to a channel with a given handler method name + * subscribe to a channel with a given handler method name "handlerName" * * @param channelName * @param handlerName @@ -304,8 +348,8 @@ public void subscribe(String channelName, String handlerName) { } /** - * subscribe to a channel with a given handler method name ; limits the rate of incoming events to - * events per secs + * subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + * "rate" events per "seconds" secs * * @param channelName * @param handlerName @@ -322,8 +366,8 @@ public void subscribe(String channelName, String handlerName, int rate, int seco } /** - * subscribe to a channel with a given handler method name ; limits the rate of incoming events to - * events per secs; controls whether we limit the rate of incoming event per sender + * subscribe to a channel with a given handler method name "handlerName"; limits the rate of incoming events to + * "rate" events per "seconds" secs; "ratePerSender" controls whether we limit the rate of incoming event per sender * or for all events coming in from all senders * * @param channelName @@ -356,7 +400,8 @@ public void register(String responderName) { } /** - * register a responder; requires a method with the given responderName with parameters (OOCSIEvent, OOCSIData) + * register a responder "responderName"; requires a method with the given name "responderName" with parameters + * (OOCSIEvent, OOCSIData) * * @param responderName * @param responderFunctionName @@ -370,6 +415,39 @@ public void register(String responderName, String responderFunctionName) { oocsi.register(responderName, responderFunctionName); } + /** + * register a responder "responderName" on channel "channelName"; requires a method with the responder name + * "responderName" with parameters (OOCSIEvent, OOCSIData) + * + * @param channelName + * @param responderName + */ + public void registerChannel(String channelName, String responderName) { + + if (!oocsi.isConnected()) { + return; + } + + oocsi.registerChannel(channelName, responderName); + } + + /** + * register a responder "responderName" on channel "channelName"; requires a method with the given name + * "responderName" with parameters (OOCSIEvent, OOCSIData) + * + * @param channelName + * @param responderName + * @param responderFunctionName + */ + public void registerChannel(String channelName, String responderName, String responderFunctionName) { + + if (!oocsi.isConnected()) { + return; + } + + oocsi.registerChannel(channelName, responderName, responderFunctionName); + } + /** * retrieve the list of clients on the server *