Mini graph library "atomic wheel", intended as a minimalist yFiles™
replacement for visone extensions. It does reinvent the wheel, but it
at least attempts to be a very small wheel.

Together with TransportGraph and the KnimeConnection, this can be used
to get complete graphs into visone, either from an extension, or
through the actual TCP socket (port 7777) used used for the KNIME
connection. Getting the graph into KNIME requires slightly more work
as KNIME wants to play the active role in the protocol.

The library attempts to be as simple as possible. Therefore, there are
no node or edge indices or performance-enhancing storage data
structures. To create a Node or an Edge, simply instantiate one. Nodes
hold literally nothing -- they are simply unique handles. Attributes
are essentially HashMaps but they do make the point to explicitly store
their member type.

Node, Edges and Attributes can be added to and removed from a Graph.
This doesn't change them in any way (they're immutable) and is only
required for converting them to and from TransportGraphs. Adding an
Edge adds its endnodes, and removing a Node also removes its incident
edges. Attributes are stored in a Graph's AttributeManagers which are
effectively HashMaps with the addition of a convenient get-or-create
method.

While there are no explicit node or edge IDs, an IDAttribute can be
used to number them consecutively starting from 0. IDs are relative to
an IDAttribute and will never be reassigned automatically (nor is it
possible to do so manually).

TransportGraphConverter converts between atomic wheel Graphs and KNIME
connection TransportGraphs. While Attributes can normally hold anything
a HashMap can, TransportGraphConverter only handles String, Integer,
Double, Boolean and lists thereof, because that's what KnimeConnection
can read.

The protocol for the visone / KNIME connection over port 7777 is
extremely simple: 
* visone listens for connections on port 7777
* KNIME connects and sends a byte to denote the operation
  if 0, KNIME is requesting a graph from visone
    * visone responds with a byte to show status
      if 0, no graph is waiting to be sent (yet)
      if 1, a serialized TransportGraph follows
        * visone sends the next TransportGraph in the queue
  if 1, KNIME is sending a graph to visone
    * visone receives a TransportGraph, then layouts and displays it
* the connection is closed after a single graph. it cannot be reused

atomic wheel is (c) 2013 Matthias Fratz and in the public domain.
transportgraph_v1_1 is (c) 2012 Uwe Nagel and covered under the GPL.
