# RBNB Release Notes

# RBNB V3.2 Release Notes

## V3.2B3 to V3.2B4 Changes

V3.2B4 released 05/25/2010
This release corresponds to RBNB Subversion repository revision number 193

- Improved attach/detach logic. Now grows archive Filesets.
- Added MATLAB regression test to check the source reattachment enhancement.

## V3.2B2 to V3.2B3 Changes

V3.2B3 released 08/31/2009
This release corresponds to RBNB Subversion repository revision number 186

- Added RBNB Tools, a tool tray applet to manage RBNB servers.
- Implemented Terminate(String) method of SAPI Control class. Renamed Terminate(void) method to TerminateServer(). Added JUnit testing for the Control class.
- Upgraded built-in Tomcat version from 5.5.12 to 6.0.18.

## V3.2B1 to V3.2B2 Changes

V3.2B2 released 04/22/2009
This release corresponds to RBNB Subversion repository revision number 179

### Server

- Added synchronize call to Mirror write to confirm data sent. This avoids lost data on reconnect, but may incur unwanted additional network delay due to the fact that the server waits for confirmation that the data sent to the downstream mirror was actually delivered. To turn this feature off, include the following definition in the DataTurbine startup Java command: -DasyncMirror
- Added test code (currently commented out) in Mirror which can be used to check the latest time in the downstream mirror source to see if the last data frame should be resent (this would be used after the mirror connection was broken and then reconnected).
- If a mirror connection has been broken and is in a loop trying to reconnect, the user can manually terminate the mirror's sink connection (in rbnbAdmin) in order to break out of this loop and terminate the mirror.
- Changes to fix subscribe and mirror problem where multi-ringbuffer sources would not reliably send data for all channels.

### Applications

- Added ChartServlet and WebPlot (a front end to ChartServlet; a link to this on the main WebTurbine web page).
- Added FillInTree utility class (a class to provide a fully-filled in ChannelTree for clients that need it).
- Added KMLigPlugIn. As KMLitPlugIn, but by using the new PhotoOverlay element in KML2.2, it eliminates the need for the vastly more complicated DAE files.
- Made note about user data format in ChannelMap.PutUserData().
- Add DeadReckoningPlugIn: shows a dead reckoning "ring" around last known position based on latency and last known ground speed.

### Build Environment

- In JUnitTesting/build.xml, modified the compile target's classpath so it works under MAC OSX 10.4.

## V3.1a to V3.2B1 Changes

V3.2B1 released 08/28/2008
This release corresponds to RBNB Subversion repository revision number 162

### Server

- Fix RBNB Issue #8, "Monitoring a source which has multiple RingBuffers doesn't work" (http://code.google.com/p/dataturbine/issues/detail?id=8)
- If an Archive is loaded for Append, and the load fails, the old archive is now moved to a new name, of the form <old_name>.fail.001 (002, etc). A new archive is then created with the old name. The old behavior can be restored with: "`-Dcom.rbnb.api.RBO.noFailSafe=true"`
- Changed Metrics Rmaps to use zero-duration timestamps to reduce memory (cache and archive) utilization.

### Applications

- In WebDAVServlet, fixed delete of original file on MOVE
- Added UDPFragmenter, a utility to fragment UDP packets for transmission over networks without IP fragmentation support.
- Added ResponseMon application, an HttpMonitor variant to quantize webserver response times and log to DataTurbine; includes BASIC authentication support.

### Build Environment

- Added JUnit test framework, which requires Ant 1.7. Currently the only test is to check archive append load failures (see note in Server, above). The JUnitTesting subdirectory is excluded from the root library Ant build task.

# RBNB V3.1a Release Notes

## V3.1a Production Release

V3.1a released 07/09/2008
This release corresponds to RBNB Subversion repository revision number 151
Fixed a bug in rbnbPlot (RBNB Issue #9, "rbnbPlot throws NullPointerException on chans w/o MIME").
Add headless (no GUI) mode to UDPCaster; this is activated using the new "-g" command line flag.

# RBNB V3.1 Release Notes

## V3.1 Production Release

V3.1 released 06/27/2008
This release corresponds to RBNB Subversion repository revision number 146
The source for this release is identical to the source used for release V3.1B4a

## V3.1B4 to V3.1B4a Changes

V3.1B4a released 05/28/2008

### WebDAVServlet

- Tweeked previous attach-to-detached source change. Was not properly updating server channel metadata on WebDav channel put.

## V3.1B3 to V3.1B4 Changes

V3.1B4 released 05/23/2008

### General

- In the IzPack installation: changed URL to dataturbine.org
- Source/build.xml: Change 'target' to 'dir' in build.xml, was broken on netbeans.
- Update WebTurbine HTML home page to reference updated Developer Guide
- Updated DataTurbine Developer Guide V3

### Server

- When the upstream side of a Mirror is terminated, the downstream output Source side of the Mirror is now detached (data still available in RBNB) rather than stopped (unloaded from the RBNB). Add a new Java flag for overriding this default behavior: –Dpersistentmirror=<true|false>
- Source close synchs with server; lost frames zeroed to prevent deadlock.

### Matlab

- In Matlab/rbnb_getjpg.m and Matlab/rbnb_putjpg.m: Delete temp files after using them.

### PlugIns

- Corrected heading calculation in TrackDataPlugIn.
- Fix bug in TrackDataPlugIn dealaing with the display of "pseudo-alt" KML channels.
- Bound heading angle in TrackKMLPlugIn.
- Moved calculateHeading() to TrackDataPlugIn.

### WebDAVServlet

- Modified WebDAVServlet to enable appending to detached sources.
- Corrected start time issue in WebDAV interface when only duration specified on PUT.

### HttpMonitor

- Removed HttpMonitor dependency on sun.misc.Base64*
- Added check to HttpMonitor: if LastModified field is present, only update if changed.

### rbnbPlot

- Minor updates to RBNB Plot.
- rbnbPlot now uses MIME type to identify JPEGs for display.

## V3.1B2 to V3.1B3 Changes

V3.1B3 released 03/04/2008

### General

- On 03/01/08, the RBNB Subversion repository was switched from NEESforge to Google Code.
- Added "source" and "target" flags to "javac" tasks in build.xml files where they were not being set. In general, "source" and "target" are set to the value of "rbnb.javaver" (declared in definitions.xml), which is currently "1.4". Note that the RBNB server overrides this flag and sets Java 1.3 as the target and source version.
- In "Source/Scripts/OtherUnixScripts/Start_Webserver.sh" and "Source/Scripts/OtherUnixScripts/Stop_Webserver.sh", change shell to bash on other unix, seems to fix the bug on Solaris.

### Server

- Added support for loading archives via absolute pathnames. Modified "Source/DataTurbine/com/rbnb/api/RBO.java"

### SAPI

- Updated ChannelMap javadoc to specify that PutData calls do not copy the input arrays. Modified "Source/DataTurbine/com/rbnb/sapi/ChannelMap.java"

### Matlab

- Added new utilities to support RBNB-JPG processing in Matlab: "Source/Matlab/rbnb_putjpg.m" and "Source/Matlab/rbnb_getjpg.m"

### PlugIns

- Add support for 3D icon orientation in TrackDataPlugIn and TrackKMLPlugIn.
- Added timeout argument to PluginTemplate.argHelper. Modified "Source/DataTurbine/com/rbnb/plugins/PlugInTemplate.java"

### WebCache

- WebCache/CacheInterface: changed rbnbPutData to ByteArray vs INT8 type for compatability with subsequent fetches from cache by rbnbPlot and RDV etc. Modified "Source/Applications/WebCache/com/rbnb/webCache/CacheInterface.java"

## V3.1B1 to V3.1B2 Changes

V3.1B2 released 01/11/2008

### General

- Open source code is hosted on NEESforge website.
- Removed obfuscation (no longer needed now that RBNB is open source); remove ProGuard files from Third_Party directory.
- Add Doxygen documentation capability (add Source/Doxyfile; tweak the Ant "programmer-documentation" task; add Doxygen adapter class for Ant).
- Tweak regression test script to support COMSOL: take out spaces between function name and open parenthesis (change in Source/Matlab/testrbnb.m).
- Added ActiveX packager and installation scripts and LabView example.

### Server

- Added interpreter header to Source/DataTurbine/jsharp_code_prep_script
- User info is now replaced on successive registrations
- Fixed registration bug in com.rbnb.api.
- Shortcuts now appear as SERVER nodes in ChannelTree. Updated Sink.RegistrationRequest documentation.
- Change TCP.java to support computers with multiple interfaces.
- Fixed bug for trimByTime mode. _Metrics channels would not be reliably checked for trimming the ring buffer. This could result in long term memory growth with risk of running JVM out of memory (change in Source/DataTurbine/com/rbnb/api/StorageManager.java).
- SAPI: Minor improvements to ChannelMap.

### TimeDrive

- Tweak GUI to add additional “Interval” entries for finer grain control of track display.
- Add fractional time step and interval values to TimeDrive web interface for finer grained control; make supporting changes in the TimeDrive server.

### PlugIns

- RoutingPlugin: Fix exception-handling bug; add debug flag (-d).
- A plug-in to compute the time derivative of a channel was added to the PlugIn area.
- Improved performance of PlugInTemplate.stop().
- Added com.rbnb.plugins.PlugInRecorder, which Subscribes to a PlugIn and archives the output.
- Minor improvements to PlugInTemplate.

### UDPCaster

- Add new command line arguments: autostart ("-x") and stream from oldest ("-o").
- Supports multiple recipients ("-r" flag takes a comma-delimited list of recipients).

### rbnbPlot

- Added com.rbnb.fie (File Import/Export) package (added to Plot area because that is where we are initially using it, and also to keep the Server code Java 1.1.4 compliant). JMatStruct, an exporter for .MAT files, is the most significant class in this package.
- Add MATLAB (".MAT") export support using JMatStruct. The .MAT file is created in the current directory.
- Plot has support to change the font size through a JVM system parameter.
- Fixed export-to-DT trimByTime mode problem (ExportToDT.java).
- Added short sleep to help rbnbPlot channel list refresh on new connection (tweak in RBNBPlotMain.java).
- Change default video playback rate.
- Slowed down startup playback rate for zero-duration data (e.g. video).
- Fixed bug where zero-duration image plots would hang.
- Spaces in channel names replaced with underscores for .mat file export.

## V3.0 to V3.1B1 Changes

Third_Party directory has been pulled out of Source directory; build files have been adjusted as appropriate. This is consistant with the folder structure at NEESforge and makes sense since the content of Third_Party isn't part of the RBNB open source.

### rbnbServer

- Some debug features of Locks and Doors are conditional, using the system property com.rbnb.api.Door.debug. Set this to "true" to allow debug. This reduces memory consumption in some cases by 30-40%.

# RBNB V3.0 Release Notes

This release of the RBNB system contains the following changes:

## V3.0 Production

- Code is frozen as a stable production release.
- Both "push" and "pull" mirrors now have reconnect logic
- Added limited support for displaying 3D icons (".dae" models) to TrackKMLPlugIn. An "Icon Scale" combo box has been added to the GUI which allows the user to specify the scale for both 2D and 3D icons.

## V3.0B3 to V3.0B4 Changes

- RBNBPlot's font size can be specified with the java debug flag -Dplot.fontsize=N
- "Pull" mirrors will automatically reconnect if the network link goes down. This is a beta test change, with "push" mirrors to follow in a future release.
- Parameters targeted to specific plugins can now be specified via both the URL "munge" interface and the API. The URL syntax is "?pio=plug-in-name,key1=value1,...,keyn=valuen". The API interface is ChannelMap.AddPlugInOption()

## V3.0B2 to V3.0B3 Changes

- Fixed bug in ResamplePlugin so it now handles multiple channels per request

  ## V3.0B1 to V3.0B2 Changes

  ### rbnbServer

  - Plugins now properly handle "Monitor" mode by passing through source frames consistent with how a direct (non-plugin) connection works
  - Mirrors forward registration metadata (also known as "User Info").
  - Subscribe to oldest and Mirror from oldest bug fix in the case where the Subscription/Mirror is set up before data is in the Source and the Source has registered channels.
  - Tweeks to server thread-locking logic should make it less likely for certain rare but annoying thread-lockup problems to happen

  ### Developer API

  - When a user registers channels in a Source, it is now allowed to have a mix of channels with and without registration metadata (also known as "User Info").

  ## V2.6 to V3.0B1 Changes

  V3.0B1 is the first beta release of V3 RBNB. It is identical to V2.6 except that it is being released under the Apache 2.0 Open Source license. See the revised EULA for license details, and the new "Source" link to download source code. Future releases will provide build/source documentation as available.

  ## V2.6B6 to V2.6 Changes

  V2.6 is a stable production release.

  ### rbnbServer

  - Various archive-recovery tweeks. Fire-walled an obscure infinite recovery loop problem; continued archive-robustness logic TBD.

  ### Plugins

  - Resample plugin added that will downsample and/or limit the amount of numerical data fetched through it, similar to ThumbNail for images.

  ## V2.6B5 to V2.6B6 Changes

  ### rbnbServer

  - Changed the archive-append logic. Now, when a source opens an archive for append and changes the size (number of frames) of the archive, no data is trimmed. Rather, any change to the archive size applies to new filesets as they are written, such that the new size will be achieved after a complete set of data at the new size is written. This change is to prevent the inadvertent loss of previously recorded data.
  - Backed out the one-deep default registration request logic change of V2.6B5. This caused problems where plugins and routes could be flooded with repeated registration requests, e.g. from the WebDAV interface.
  - Various archive-recovery tweeks. Fire-walled an obscure infinite recovery loop problem; continued archive-robustness logic TBD.

  ### TrackKMLPlugIn

  - Add support for munge-settable display parameter options: KmlLabel, KmlSort, KmlIcon, KmlColor, KmlCurtain
  - In the configuration file, add support for custom Type and Classification color mapping

  ## V2.6B4 to V2.6B5 Changes

  ### rbnbServer

  - Fixed a bug where a source would detach, then reconnect and write more data, would fail to properly register the new data, thus making it unavailable upon subsequent reloading the archive.
  - Improved archive recovery logic to use much less memory, enabling the recovery of very large archives. To force the recovery of an archive at any level, remove the associated "seal.rbn" files from the archive directory tree. Also extended the range of potential types of archive corruption that can be handled by the recovery process.
  - Changed default behavior to (once again) use multiple framesets per cache. Using a small number of framesets per cache improved playback performance, but could hurt source performance for large numbers (e.g. 500) channels. Symptoms would be a surge of CPU use on each cache-flush. The old behavior can still be invoked by using the -Dnumframesets=N (N>0).

  ### PlugIns

  - Enhanced server-side plugin handler to automatically convert streaming (monitor, subscribe) modes into a sequence of requests. This enables streaming through most existing plugins without modification.
  - PlugInTemplate class added to streamline plugin development.
  - ThumbNail and PNGPlugIns converted to use PlugInTemplate.

  ### Developer API

  - The RequestRegistration() method with no arguments now defaults to a "*/..." request. That is, default registration requests will go one-deep into PlugIns and Routing connections to better enable selection of channels from applications with pull-down menus etc.

  ### TimeDrive

  - Add multi-user support, where each user has control of their own time munge parameters. Two multi-user modes: based on IP address (the default) and using HTTP Basic Authorization (user is prompted for a username/password).

  ### HttpForward servlet

  - A new servlet delivered with Tomcat. Allows a client which can connect to Tomcat (standard port 80 access) to make requests of servers running at ports to which they may not have access. Client connects to Tomcat and then HttpForward servlet passes this request on as part of a user-defined URL. For example, this servlet can be used to provide TimeDrive support to clients who only have port 80 access to Tomcat.

  ### TrackKMLPlugIn and TrackDataPlugIn

  - KMLTrackPlugIn has been broken up into these two modular components. Together, these PlugIns convert a series of RBNB alt, lat, lon data points into a KML document viewable with Google Earth. TrackDataPlugIn handles the low-level RBNB data requests; TrackKMLPlugIn formats this data into a KML.
  - Changes in TrackDataPlugIn
  - Add "append=<chan>" munge to request data on an extra channel (used as pseudo-alt channel in TrackKMLPlugIn)
  - Add "tactical=1" munge to obtain a full duration worth of data on the ancillary channels (including Speed and Heading)
  - Changes in TrackKMLPlugIn
  - If an extra channel (an "append" channel) comes back from TrackDataPlugIn, display it as a pseudo-alt track.

  ## V2.6B3 to V2.6B4 Changes

  ### rbnbServer

  - As part of cache/archive optimization, changed logic to write entire cache to archive (vs in parts). This means you want a cache that is no larger than needed for efficient disk-block write efficiency, e.g. 100 frames.
  - Workaround for archive writing inconsistancy on some multiprocessor machines added to FrameSet.writeToArchive()
  - Incoming single-channel frames are recast in a more efficient format, which reduces archive sizes and greatly improves read performance.
  - Plain userinfo registration data is updated to xml format.
  - Add "-H" command line flag to specify the archive home directory.

  ### rbnbAdmin

  - Add "-u" command line flag to specify username.

  ### rbnbPlayer

  - In single-point mode, when Player is sleeping (for rate/pacing control), the time on the Position slider is updated - this provides feedback to the user that Player isn't "stuck", rather it is just pacing its output. Note, however, that the location of the Position slider itself is not updated - just the time label is updated.

  ## V2.6B1 to V2.6B3 Changes

  ### WebTurbine

  Rebuilt code to run with JRE (versus full JDK required with previous release).

  ### rbnbServer

  A "frameset" is a collection of cache frames which are written to the archive. The rbnbServer code has been modified to set the default number of framesets to 2. For example, if a Source has 100 cache frames, then by default this cache is broken up into 2 framesets of 50 frames each. If this Source has an archive, then the archive will be appended each time 50 new frames arrives in the Source.
  A new RBNB Server command line option has been added for setting the number of framesets in each cache, "-Dnumframesets=<positive integer>". For example, if a Source is created which has 1000 cache frames, and if the RBNB Server was started with the command line option "-Dnumframesets=5", then this Source's cache is broken up into 5 framesets of 200 frames each. If this Source has an archive, then the archive will be appended each time 200 new frames arrives in the Source.
  If the user specifies "-Dnumframesets=0" on the RBNB Server command line, this is a special case which tells the Server to set the number of framesets for each Source equal to the square root of the number of cache frames in the Source. This is equivalent to the legacy method of setting the number of framesets (before the Server change to set the default number of framesets to 2, see above for details). For example, if the RBNB Server command line included "-Dnumframesets=0" and a Source is created which has 100 cache frames, then the number of framesets will be set to 10 (since the square root of 100 is 10), and each frameset will contain 10 cache frames.

  ## V2.5 to V2.6B1 Changes

  V2.6B1 is a beta release

  ### WebTurbine

  Upgraded to Jakarta Tomcat 5 Web Server. This change entails a re-implemented RBNB Web servlet which should be more efficient. As part of this change, the "rbnbUser" web interface has been deprecated and replaced by "RBNB". The "rbnbNet" interface is no longer available. All URL references to an RBNB are relative to the connected server via the "RBNB" servlet, as in:
  http://localhost/RBNB
  WebTurbine now recognizes If-Modified-Since headers and only returns data if it has changed. This greatly improves the efficiency of the WebTurbine for polling applications.

  ### rbnbServer

  Fixed a bug if Source archive length was less than cache size, no archive would be created.
  Fixed a bug if a Source did a Detach() too quickly after the last Flush, a corrupted ring buffer would prevent subsequent Sinks from Fetching data.
  Fixed a bug where the Server would orphan a thread each time a client made a Registration request. This would eventually cause the Server to grow in memory and thread resource use.

  ### Routing PlugIn

  The Robust Routing Plugin now has a "Routing Console" web interface to launch/stop and review routing plugin status.
  If a _loopback RoutingPlugIn is running at the source, UDP is used for monitoring instead of the usual SAPI connection.

  ### rbnbAVCP

  Bug fix for 16-bit audio; performance tweaks.

  ### ThumbNail PlugIn

  If max number of images has been set to 1, ThumbNail now correctly limits max number of images to 1.
  Added "-n" option for setting PlugIn name.

  ### KMLTrackPlugIn

  KMLTrackPlugIn is a new PlugIn being distributed with RBNB. This PlugIn converts a series of RBNB alt, lat, lon
  data points into a KML document viewable with Google Earth.

  ### TimeDrive

  TimeDrive is a new application being distributed with RBNB. TimeDrive is a Web proxy server which adds a time munge
  to WebTurbine requests. A Web interface is provided with VCR-like controls for setting TimeDrive's current time.

  ## V2.5B7 to V2.5 Changes

  V2.5 is a stable production release

  ### rbnbPlot

  A problem that under certain laggy conditions could lock up channel selection has been fixed.
  The plot label units-multiplier (e.g. "kilo") that was temporarily lost is now back.

  ### rbnbAdmin

  Admin now recognizes and displays PlugIn channels (one level deep).

  ### RoutingPlugIn

  The Robust Routing PlugIn has been updated to better support streaming data connections.
  There are some server mods specific to plugins that support this.

  ### WebTurbine

  The default archive-mode via the WeDAV (file) interface is once again "append" (vs "create").

  ## V2.5B6 to V2.5B7 Changes

  V2.5B7 is an updated beta release.

  ### rbnbPlot

  The plot display boxes are under user-controlled layout manager, allowing individual window components to be positioned and sized independently.

  ## V2.5B5 to V2.5B6 Changes

  V2.5B6 is an updated beta release.

  ### rbnbPlayer

  A TCP output option has been added to Player. The user specifies a port number on which Player will open a server socket to listen for TCP client connections. RBNB data is sent to each connected TCP client. Default display mode and duration have been modified.

  ### RBNB Server

  Due to numerical round-off in the RBNB Server, certain problems have been identified with time-based subscriptions where the Source has a multi-point frame defined by a single start time and non-zero duration (a time is not set for each point in the frame). This problem has been fixed (by adding a small roundoff correction) for some of the cases where the problem occurred.

  ### rbnbPlot

  Text channels (those with mime type text/plain, or ending in ".txt" or ".text") will be displayed in a scrolling text box, synchronously with other data.

  ### Web Interface

  An option to the WebDAV interface for converting fetched data to text ("&dt=string") has been added.

  ## V2.5B4 to V2.5B5 Changes

  V2.5B5 is an updated beta release.

  ### RBNB Server

  We found and fixed some subtle bugs in streaming modes (monitor and subscribe). The bugs occured when a sink streams multiple channels from a source with multiple ring buffers (e.g when a source puts different channels in different frames at different rates).
  The following bugs were fixed:
- Monitor mode could get duplicate frames
- Subscribe mode could block forever waiting to start
- Streaming from oldest or newest could skip the first frame

### ChannelTree

The ChannelTree API structure now has time info (start & duration) consistent with the ChannelMap object.

### rbnbPlot

- rbnbPlot is updated to the Java Swing interface, including a much nicer "tree view" channel selection window.

- rbnbPlot recognizes source metadata and perform associated linear scaling and plot annotation. To use it, a source provides metadata of the form:

-     cm.PutUserInfo(0,"units=volts,scale=2,offset=3")

- rbnbPlot can "zoom" via cursor control to selected portions of stripchart data.

- rbnbPlot allows type-in start and duration time fields.

### rbnbAVCP

rbnbAVCP now supports full command-line option control. It also uses the new registration userInfo methods for describing its content.

### WebTurbine

You can now fetch channel meta-data ("userInfo") via the WebDAV option 'fetch=info'.

## V2.5B3 to V2.5B4 Changes

V2.5B4 is an updated beta release.

### rbnbPlot

A new capability to export selected data to the locally connected DataTurbine is implemented.

### Registration metadata

New API methods putUserInfo and getUserInfo enable per-channel metadata to be stored and retrieved in the registration channel map of a data source.

### Server side automatic timestamps

Server timestamps were broken and are now fixed.

## V2.5B2 to V2.5B3 Changes

V2.5B3 is an updated beta release.

### Sink constructor deprecation

The Sink constructor taking arguments (cache,mode,archive) has been deprecated, and now calls Sink() instead. The server does not support setting cache and archive for Sinks.

### rbnbAVCP

The rbnbAVCP video capture and display application has been updated and improved.

### rbnbPlayer

The rbnbPlayer application has been updated and several bug fixed in the beta version. Specifically, single-point playback now works properly.

### rbnbAdmin

The rbnbAdmin application now has an option to load archives from disconnected sources.

### Authentication (Beta)

Authentication via Kerberos or Grid GSI security is supported.

## V2.5B to V2.5B2 Changes

V2.5B2 is an updated beta release.

### Applet Security

The RBNB API has been updated to allow clients (sources and sinks) to run as applets using default applet security rules (e.g. connecting back to the same server from which the applet was loaded). Previously, there were a number of Java System.getProperty() calls that would throw uncaught exceptions if run as an applet. These are now caught and defaults used for the case of applets.

### Audio/Video Capture and Display

Updated audio/video capture and display application (rbnbAVCP) is included in this release. This is effectively an RBNB "videophone" that has built-in record and playback capabilities.

### rbnbPlayer (Beta)

The V1 "rbnbPlayer" application has been updated and ported to RBNB V2. This application "plays" data from one source and outputs it to another, time-slewing it using VCR-like controls. Sink clients can subscribe to the player output channels and thereby by remote-controlled. (This release of player is Beta-only. There are known issues and some debug print-outs).

### Improved Archive Recovery Logic

The archive recovery logic was improved so that certain types of previously unrecoverable corrupt archives are now recoverable.

### ThumbNail Plugin

A new "thumbnail" plugin is available that will downsample and/or reduce JPEG image size. This enables remote access to large volumes of video data over limited network bandwidth links.

## V2.4.4 to V2.5B Changes

V2.5B is a beta release of the RBNB system. It includes a number of new and enhanced applications, and optionally supports a .NET compatable interface.

### PlugIns

New and enhanced plugins are available:

- SignaturePlugIn - signs and checks signatures to authenticate data sources
- FileDrop - picks up specified channels and drops them to local files
- RoutingPlugIn - robust RBNB-routing using plugins
- FolderPlugIn - updated to automatically update file-list upon data requests
- rbnbSource - fixed logic that would "detach" instead of close connections

See the on-line Help documentation for details about each of these plugins.

### rbnbPlot

The rbnbPlot stripchart application now supports video images. Channels that end in ".jpg" are displayed as a "filmstrip" of video images. Clicking on the video window brings up options to set the image number and size.

### Java V1.1 Compatability

The low-level server and API code modifications have continued in various places to retain (old) Java V1.1.4 compatability, in order to support the .NET J# compiler. Client code can be developed using the latest (e.g. Java 1.4) features. Among the changes made:

- When using the Server command-line "-O" option to load an options file, the URL of the specified file can no longer use HTTPS.
- When using the Server command-line "-A" option to load a security/address authorization file, the URL of the specified file can no longer use HTTPS.

## V2.4.3 to V2.4.4 Changes

### Registration Metadata Bug Fix

A bug was fixed that could cause the "user" registration data (metadata) to be unreliably updated and retrieved.

### Router Shutdown Robustness

Modified the synchronization of router shutdown, to increase tolerance for network lapses.

### Java V1.1 Compatability

The low-level server and API code was modified in several places to retain (old) Java V1.1.4 compatability, in order to support the .NET J# compiler. Client code can be developed using the latest (e.g. Java 1.4) features. This work is in progress.

### Another shot at rbnbjcap

The rbnbjcap/jview video applications in the previous release (still) did not have all the required class files. This build hopefully fixes that.

## V2.4.2 to V2.4.3 Changes

### Subscription by Wildcards

It is now possible to specify a "*" wildcard for subscriptions by time. Subscriptions by frame still do not support wildcards.

### Zero-Duration Request Logic Enhanced

Prior to this release, a request for zero-duration at an absolute time would fetch data at-or-before the specified time. This is handy so that sources can put data at zero-duration, and a request for zero-duration will find the "then-newest" data at any time.

With this release, the enhanced at-or-before logic is extended to include the time-relative requests ("newest" and "oldest"). Thus, relative and absolute requests behave consistently in this respect.

### Build Includes rbnbjview and rbnbjcap Applications

V2.4.x had inadvertently omitted including the video client applications in the build. They are now back.

### Minor API Documentation Updates

The javadoc has been tweeked for some methods.

### Change in Low Level Communication

A change was made in the low level client/server communication to allow better cross-Java-version compatability. (Transmission of serialized Java objects was eliminated). Specifically, the .NET J# compiler will soon be supported.

This change should be transparent to all users, and cross-RBNB-version compatability is maintained.

## V2.4.1 to V2.4.2 Changes

### Multiple Ring Buffer Request Problem

A bug in the server caused a string index out of range error when requesting a short channel name (<3 characters) from a source with multiple ring buffers (channels sent in separate groups).

## V2.4 to V2.4.1 Changes

### Delete Channels from Registration

An oversight in the delete channels capability would result in channels not being fully deleted if they were explicitly registered. This effected the WebDAV system, which uses explicit registration for empty files. Moving, renaming, and deleting files now works properly.

### Updated Documentation

Documentation has been updated to reflect the changes to the layout and all of the documentation is now included as part of the WebTurbine system.

## V2.3.2 to V2.4 Changes

### New Installation System

The RBNB DataTurbine and WebTurbine system is now delivered as an IzPack installation rather than an InstallAnywhere system. The former is a freely distributable package. It lacks the JRE installation capability used on Windows systems, but is otherwise similar to the latter.

### New Installation Layout

The installation layout has changed somewhat, mostly in the WebTurbine area where we now use .war files to package the RBNB extensions. Renamed Package The former `COM.Creare.Utility` package has been renamed to `com.rbnb.utility` for consistency. This package contains some useful, general-purpose utility code.

## V2.3.1 to V2.3.2 Changes

### COM.Creare.Utility Package renamed to com.rbnb.utility

The COM.Creare.Utility package has been renamed to com.rbnb.utility for consistency with Java standards.

### Restructured Installation

The build and installation process has been changed, resulting in a somewhat different structure to the resulting delivery. The major, noticable change is that the WebTurbine files have been packaged in .war files.

## V2.3 to V2.3.1 Changes

### Routing Reconnect Loop

If an error (not a network problem or server shutdown) caused a routing connection to be lost, it was possible for the two servers to get into an infinite loop of lose routing/re-establish routing. This has been fixed.

### Number of Threads

Some types of requests, especially going across routing, had the potential of stranding threads due to a notification problem. This has been fixed.

### JNDI_Sink Names

The names of the JNDI_Sinks (used by the WebDAV interface) have been changed to reflect the Web application that creates them.

### JNDI_Sink Pool

The number of JNDI_Sinks (used by the WebDAV interface) held in a pool for future reuse has been reduced from 16 to 4. This may cause some degradation in responsiveness, but improves overall resource use.

### Stranded Web Turbine JNDI_Sinks

The number of JNDI_Sinks (used by the WebDAV interface) could potentially grow indefinitely if problems occured on the server side. The JNDI_Sinks now have a one minute timeout on any request and automatically shutdown if they do not get a response before the timeout expires.

### Linux IBM Java Requirement

The Linux startup scripts used to state that an IBM JVM was required for proper operation. This is no longer true.

## V2.2.2 to V2.3 Changes

### Client Address Access Permissions

The authorization security file now allows specific permissions (read, write, etc.) to be permitted rather than just full access allowed/denied.

### Unconnected Shortcuts

If a client asked for a registration map from a server with a shortcut that was in the process of being connected, the server would wait for the shortcut before returning the registration map. The server now skips over such shortcuts.

### Connection Lockups

A timeout has been added to the code that makes TCP connections to remote servers (both in the client API and in the server code for setting up routing). This ensures that failures in the low-level TCP socket connection logic due not result in client or server level lockups.

### Duration Zero Request Problem

A duration zero request for data with zero duration sometimes returned the wrong data. This would happen when the request time fell between two framesets. Instead of returning the last frame in the frameset preceededing the request, the code was returning the first frame in that frameset.

## V2.2.1 to V2.2.2 Changes

### Deadlocks

Under load, especially at startup, there was the potential for deadlock situations in the server. As a result, sources and sinks would produce informational messages about being blocked. These have been fixed.

### Frame-based Streaming from a Source with an Archive

Streaming from a source with an archive using frame-based streaming has been problematic. While the use of reframing (see archive subscription problem), it is at the price of increased storage. As of V2.2.2, the server will terminate a frame-based stream that attempts to get data out of an archive (either by requesting oldest or due to the fact that the stream is unable to keep up and falls out of the cache). Performance when streaming from the cache when there is an archive has been improved as well.

### Mirror Shutdowns

If the RBO side of a mirror was shut down, the mirror might not properly clean up. This could result in memory growth, eventually causing out of memory problems.

## V2.2 to V2.2.1 Changes

### Storage/Retrieval of rbnbPlot Configurations

The rbnbPlot application now allows the user to store and retrieve configuration information.

### Monitor Mode Timing Bug

A timing bug in Monitor retrieval mode caused premature termination of the stream of data being sent from the server.

## V2.2B6a to V2.2 Changes

### Duplicate Times in Time-Based Subscriptions

If the input stream of a time-based subscription contains points with identical times, the subscription could go into a loop retrieving those two points until they disappear from the ring buffer.

### Per-Channel Times in Time-Based Subscriptions

Per-channel (as opposed to per-frame - i.e., shared by all channels within a frame) times would not be properly handled by time-based subscriptions for channels other than the first.

### RBNB Window Minimized

On Windows machines, the RBNB window is now started in a minimized state.

### Failed Data Connections When Lots of Clients Simultaneously Connect

Due to a lack of synchronization, the server could fail to properly link a data connection to its control connection when lots of clients simultaneously connect to the server. The result would be that the client would fail to connect and the server would eventually time out the client handler.

### Shutting Down a Source During Data Retrieval

Under certain circumstances, it was possible for the RBO handling a source client to go through its shutdown process while a NBO was in the middle of retrieving data. This would result in the NBO getting locked up waiting to get data that had been deleted. This has been fixed so that the NBO gets no data from the source.

### Improperly Aborted Remote Connections

If the local side of a request for remote data terminated while that request was being set up, a connection between the local and remote servers could be stranded. This has been fixed.

### Stranded Remote Monitor/Subscribe Connections

If the local side of a monitor or subscribe request terminated, it could leave an active stranded connection between the two servers. The connection used up resources trying to deliver responses to the request to a non-existent client. The connection is now terminated.

### Lockups Due to Routing Failures

A number of changes have been made to ensure that servers detect (within a timeout period of a couple of minutes) routes that have failed (or which never were fully established).

### Failure to Find Routes in Hierarchies of Servers

A bug in the code that determined where next to deliver a message that is going up a chain of parents and children caused routing problems.

### Delivery of Routed Messages to Terminated Clients

If the local client of a request made to a routed server was closed before the response to that request could be delivered, the response would be sent back to the remote server. The result was that the route between the two servers would lock up because all of the connections were occupied with trying to deliver the message. The local server now reports that it failed to find the local client, which forces the remote handler to shut down as well.

### Properly Handle Client Shutdowns During Initialization

If a client application shuts down while the connection between it and the server is being established, the server might not properly clean up its side of the failed connection. The result was that there was a client handler in the server that could not be terminated. This has been fixed.

### Properly Handle Exceptions During Routing Initialization

If an exception occured when a route is being established between a child and a parent server, the parent server might not properly clean up its side of the failed route. The result was that the parent server would report a route where there was none. Attempts to use it would lock up. Attempts to terminate it would fail. This has been fixed.

### Improved Error Message Reporting

Some exception and error messages were being quietly swallowed by the RBNB server. These messages now appear in the log and on the console.

### Delivering Error Messages via Failed Connections

The server was attempting to deliver an error message reporting a failed connection via that connection. The result was that the message would never be delivered and the client handler in the server would never properly exit. The server no longer tries to deliver such messages.

## V2.2B6 to V2.2B6a Changes

### Fixed Bug in Server-Side Data Retrieval

A timing problem could cause the server side for a sink to lock up if an RBO from which it was retrieving data terminated during that retrieval.

### Fixed Bug in Server-Side PlugIn Shutdown

A bug in the server-side shutdown code for plugins would cause a stranded plugin object in the server. The client-side would properly exit.

## V2.2B5 to V2.2B6 Changes

### Extended Start Requests

When requesting data, it is now possible to ask that the server retrieve an additional data point before the specified start time of the request if there is no data point exactly at that time.

### Clearing RBO Caches

The new `ClearCache` method can been called to clear out the contents of an RBO's cache. The data is flushed to the archive and then removed from the server's memory, reducing the RBO's footprint.

### Asynchronous Log Display

The display of log messages to the console is now asynchronous to the rest of the server. If the console output be blocked for some reason, the server still continues to operate normally, although some messages may not be displayed (they are still logged if logging is on).

### Fixed Metrics History

Metrics data for detached connections was being lost.

### Reduced Memory Usage for "Live" Archives

When data is removed from the cache, it is supposed to be removed from memory. With an archvie, some of this memory was not being released properly.

### Improved Handling of Data Retrieval Errors within the Server

The server now properly reports that no data is available from RBOs that close during the data retrieval process.

### Improved Error Handling during Connection Process

If a client disconnected during the connection process, it was possible for it to leave its server side handler in a blocked state. The server side handler now times out and shuts down.

### Improved rbnbAdmin Exit Handling

The rbnbAdmin application now properly exits even if its connection to the RBNB server has been locked up due to problems on the server side.

### Enhanced ProxyPlugIn

The proxy plugin has been enhanced to provide a number of new features.

### Echo Message PlugIn

A new plugin has been added that echoes messages it receives to the console. It is intended as an example of how to write a plugin.

## V2.2B4 to V2.2B5 Changes

### Absolute Requests for Duration of Zero (0)

Absolute (specific time) requests with a duration of zero (0) now retrieve the first data point at or before the time specified. Previous versions would only retrieve a data point if there was one exactly at the specified time. This mode can be turned off using the new <quote>-C V2.1</quote> flag.

### Subscribe by Time

A new capability has been added that allows a sink to specify the nominal duration to retrieve on each fetch call when subscribing (not monitoring). This allows the sink to get data in chunks that are not constrained by the source-specified frame duration (except in so far as the latter is all the data that is available).

This capability addresses the archive subscription problem described in the release notes for V2.2B4 as the reframing does not effect times, just frames.

### Fixed Registration Problem

A problem in the code that computes the registration time information for a source would fail to consistently update the limits for the second and subsequent channel groups. This would result in requests for "newest" failing to properly get the latest data.

### Fixed Backwards Going Time Problem in Appending to Archives

A bug in the code that determines the time of the newest data in an archive loaded for append resulted in the code improperly allowing time to back up.

### Fixed Further Deadlock Problems

A variety of deadlock or runaway CPU problems that effect multiple, simultaneous sinks retrieving data from a single source have been fixed, improving on the work done in V2.2B4.

### Fixed the Frame Indexing in Append Mode

The frame index for assigned to new frames being added to an existing archive (append mode) was not set to be after the last frame in the archive. The result is that such neither monitor nor subscribe (frame-based) would work properly on such archives. This has been fixed.

### Bug in Archiving Data with a Zero (0) Duration and Multiple Points per Time

Archives containing data where a single time and zero (0) duration spans multiple points did not work correctly in earlier versions. The time information for the second and subsequent points would be lost and a time of 0 would be assigned, resulting in unusable archives.

This is an uncommon format for data. It requires that the source specify a time interval with a duration of zero (0) and then provide a data array containing more than one point. For ecample, the following Java code would produce the problem:

`cmap.PutTime(1.,0.); // Set a time of 1 with a duration of 0.`
`float[] data = { 1.F, 2.F, 3.F, 4.F }; // Create a data array containing the values 1 to 4.`
`cmap.PutDataAsFloat32(0,data); // Add that data to the channel.`

## V2.2B3 to V2.2B4 Changes

### The Cache and Archive Sizes are Changed when Reconnecting to an Open Archive

When using the reconnect capability (close an archive with keep cache and then reopen for append), the cache and archive sizes are now changed to match those requested by the reconnecting client, rather than silently using the internal values.

### Known Issues with Streaming (Frame-based) from Archives

There are a number of problems when streaming (subscribing/monitoring) datastored in archives. The reframing of archives causes the loss of information needed to be able to properly stream. These problems can be alleviated by turning off reframing at the cost of some performance.

Note that reframing is on or off for the server as a whole and must be set when writing the archives (it isn't required for reading them back).

Reframing can be turned off by defining a Java system property called "noreframe" (the value is irrelevant so long as the property is defined). The property can be defined when the Java Virtual Machine (JVM) is launched by using the following command:

prompt> java -Dnoreframe=true

For those using the Windows RBNB icon to launch the system, you need to define CATALINA_OPTS as "-Dnoreframe=true".

For those using the Unix shell scripts, add "-Dnoreframe=true" to the definition of CATALINA_OPTS in the ${RBNBHOME}/bin/Start_Webserver.sh script.

### Streaming from Oldest Limitation

When streaming from oldest, it was possible for the code to miss frames when it reached the end of the available data and started waiting for new data to arrive. For now, the code has been modified so that it won't miss data, but it may fail to properly move forward when looking at data in a source containing multiple ring buffers.

### Fixed a Deadlock Problem with Archives

Under some circumstances, it was possible to cause a deadlock when using archives. If the maximum number of open filesets was reached due to sources (either because of the number of sources or the number of ring buffers within one or more of sources), then the code could get into an infinite blocking state for some of the ring buffers. If a sink subsequently attempted to read from the source, it would eventually start reporting timeouts. This bug has been fixed.

### Fixed additional Deadlock Problems

Additional problems with deadlock situations between a source and a sink, where the sink could end up blocked waiting for the source and vice-versa, have been fixed.

### Fixed Error in Versioning Feature Support Logic

A timing error in the code that is supposed to check to see if a feature is supported could unexpectedly cause the code to temporarily think a feature was not supported during startup. In combination with the load all archives (-F) flag on the server, this error would result in some archives failing to load without any indication of a problem.

### Fixed a Problem with Loading All Archives

An additional problem with loading archives was discovered when the number of archives to be loaded is large. Some archives might fail to load because of a limit on the number of simultaneous new connections to the server. The code now retries the attempt to load the archive until it either loads, fails for a reason other than a rejected connection, or the server exits.

### Improved Automatic Re-establish Routing Logic

Under some circumstances, there was an opportunity for a deadlock situation in the code that re-establishes a routing connection between a child and parent server. This has been fixed.

## V2.2B2 to V2.2B3 Changes

### Fixed Data Retrieval Bug Caused by Deleting a Channel

When attempting to retrieve data from an archive that had a channel deleted out of it, the V2.2B2 code might either fail to find valid data or might get an exception. This has been fixed.

### Fixed Source Connection Shutdown Code

The code that was supposed to close down a source with an archive had some problems. In particular, if the source application disconnected, but told the server to keep the cache and archive loaded, then the only way to close the server side properly was to re-connect to the source (using "append" mode) and then do a disconnect with keep cache set `false.`

Using rbnbAdmin to attempt to terminate the server side of the connection would not have any effect. Shutting down the server would leave the archive in a bad state.

These problems have been fixed in this release.

### Improved Archive Recovery

A number of improvements have been made to the archive recovery code to allow it to recover from a broader range of damaged archives. Further work in this area is planned for the next release.

### Improved Simultaneous Access to Archives

Improvements to the server's handling of limited resources when multiple sources and sinks simultaneously access archives have been made. These reduce problems with thrashing and long-term lockouts.

## V2.2B1 to V2.2B2 Changes

### Documentation Updated

The documentation has been updated to reflect changes made to the code.

### WebTurbine Port Changed to 80

The default port for the WebTurbine has been changed from 8080 to 80. UNIX users should note that this change requires that the WebTurbine be launched with root privileges. Alternatively, you can change the port as noted below. UNIX users or people who are already running a web server on port 80 can change the port to something else. To do this, dit the file 'server.xml' found in {installation directory}/jakarta-tomcat-4.1.21/conf directory.

### Messaging Host Times Fixed

Times in the V2.2B1 message host were stored in milliseconds since 1970 rather than the standard seconds since 1970. This has been fixed.

## V2.1 to V2.2B1 Changes

### Deleting Channels

Channels can now be deleted via the Simple API (SAPI) or via the WebDAV interface. Note: channels created via the WebDAV interface only have their contents deleted, not the channel itself. This will be fixed in a future release.

### Messaging

Messaging allows applications to send messages to unknown recipients via a central host. It represents a generalization of the Chat capability.
Messaging is supported through the new com.rbnb.message.Message class and the messaging host. The latter can be launched from the Web page.

### Proxy Source

The proxy source allows programs that support output to a TCP socket to connect to the RBNB server. When launched from the Web page, the proxy source requests a description of the data and sets up a server socket. Connect your application's output to the proxy source and your data appears in the RBNB.

## V2.0 to V2.1 Changes

Version 2.1 is a functional (as opposed to simply bug fix) revision of the RBNB system, with the following significant features.

### Folders in Registration ChannelMaps

In order to provide support for folders, ChannelMaps returned by registration requests now include folders, which are denoted by a trailing slash (/). PlugIns and Sources may register folders by including a trailing slash on the name added to a ChannelMap.

### Multiple Ring Buffers per Source

The new V2.1 source handler (RBO) now provides multiple ring buffers per source, rather than just a single one as used in previous releases. This capability:

- Places unrelated groups of channels into separate ring buffers,
- Protects data for channels that are updated rarely or never at all from being overwritten by new data for unrelated, higher-speed channels,
- Changes the monotonically increasing time requirement from a per source requirement to a per ring buffer requirement,
- V2.1 automcatically recovers V2.0 archives.

### Reconnecting to Archives

The new V2.1 source handler (RBO) now allows source applications to reconnect to an archive. This allows a source application to come and go without removing the data from the server.

When a source application that has an archive disconnects from the server, it may leave the archive loaded in the server by setting both the keepCache and keepArchive flags. The source application (or another using the same password) may subsequently reconnect to the archive by specifying that it wishes to append to the archive. The source handler in the server never shuts down, leaving the archived data available to all sinks even while the source application is disconnected.

The server now automatically selects keepCache and keepArchive if it detects a problem with the TCP socket connection between a source handler and the source application using an archive. This ensures that data is not removed from the server if the source application crashes or loses connectivity (such as when a wireless connection goes out of range).

### Improved Error Handling

The server now catches and handles errors (such as out of memory) by shutting down the application handler that caught the error. If the application is a source writing to an archive, the server attempts to save all data it has received.

### Playback from Archives

An obscure bug in the playback code could result in some data to appear to be missing, although the data is actually in the archive. This bug has been fixed.

### New Release of the Jakarta-Tomcat Web Server

Packaged with the V2.1 release is version 2.1.21 of the Jakarta Tomcat Web Server.

### WebDAV Support for Multiplexed Data

The WebDAV interface now supports multiplexed data, by automatically demultiplexing into a specified number of channels.

### Known Issues

ChannelMaps that contain channels with data as well as channels without cannot be used when making requests. The following fragment is not legal:

> `import com.rbnb.sapi.*;`
> `...`
> `Sink snk = new Sink();`
> `snk.OpenRBNBConnection('localhost:3333','mySink');`
> `ChannelMap cmap = new ChannelMap();`
> `cmap.Add('rbnbSource/c0');`
> `cmap.Add('plugin/c1');`
> `cmap.PutDataAsString(1,'Message to plugin.");`
> `snk.Request(cmap,0.,0.,'newest');`

## V1 to V2 Changes

Version 2 is a major revision of the RBNB system, with the following significant features.

### New Licensing Model - Free to Developers and End Users

The new V2 licensing model is designed to promote the widespread deployment of RBNB technology:

> - Free unrestricted developer and end-user license
> - Negotiated right-to-distribute OEM license

If you want to bundle RBNB with your product or custom solution, please contact us to discuss the terms of an OEM redistribution agreement.

Creare offers RBNB consulting services, such as:

> - Development support
> - Custom features
> - System integration
> - Training

### Web Integration

The new WebTurbineTM interface enables:

> - WebDAV compatible
> - Browser access to RBNB applications and documentation
> - Run and configure RBNB clients as Web servlets
> - Browser access (view/save) to RBNB channel data
> - Build your own custom browser interface to RBNB

### Improved Developer API

The new Application Programming Interface (API) employs simple channelMap and client objects. There are no more "ring buffer types". Timestamps are simple double-precision vectors. Efficiency is retained or enhanced while greatly reducing complexity.

Although not source-compatible with the V1 API, you will find it straight-forward (and refreshingly easy) to port old applications to the new system.

### Powerful Application "PlugIns"

Use your browser to configure and deploy a distributed data processing system. Example PlugIns include:

> - Chat with other users (rbnbChat)
> - Publish local disk files as RBNB channels (rbnbFolder)
> - Buffered routing to minimize network traffic (rbnbBufferedRoute)
> - "Virtual Sources" consolidate and sequence remote sources and PlugIns (rbnbVSource)
> - Browser proxy cache to store and retrieve Web content via RBNB (rbnbWebCache)
> - Make PNG strip charts of numerical vector data

Develop and deploy your own RBNB PlugIns with the new easy to use V2 API.

### Peer to Peer Solution

With hierarchical routing of "personal" RBNB servers, the V2 RBNB provides a true "Peer to Peer" (P2P) solution. Benefits include data and processing "at the client", while being able to locate and publish to "peers" via an RBNB address that is independent of the IP/DNS address tied to a physical location or ISP.

### New "Rmap" Core Engine

In the old RBNB V1, data channels were relatively "flat" structures. In RBNB V2, Rmaps are hierarchical objects comprised of name, data, timestamp and optional (recursive) child Rmaps. For example, channel groups can share inherited metadata, or use multi-tiered RBNB channels to directly reflect the structure of file systems or Web URLs.