The examples lower down on this page were drawn using the old DrawFBP program, written in C++. However, a new Java version (DrawFBP-2.8.8) - http://www.jpaulmorrison.com/graphicsstuff/DrawFBPInstaller-2.8.zip - is now available - see FBPNews. For more complete information, see http://www.jpaulmorrison.com/fbp/index.shtml#DrawFBP .
DrawFBP is now running successfully under Java Web Start (JWS)! For those interested in trying it out, click on https://www.jpaulmorrison.com/graphicsstuff/DrawFBP.jnlp . Please let me know if you have any problems.
Here is a sample network under construction:
To give credit where credit is due, a number of usability ideas for the new tool are due to Oliver Brupbacher, of NumCom? in Zurich, Switzerland. Also Bob Corrick worked with me to improve the usability of the tool - especially for those who prefer to work with the keyboard only.
There was a strange problem (Summer, 2013), where the Yes/No?/Cancel? options were coming out reversed for a Unix user in Russia, as DrawFBP selected the Nimbus L&F for Unix users. The L&F has now been changed to System, and the sequence forced to left-to-right, irrespective of Locale. Any users who need right-to-left, please contact me (paul dot morrison at rogers dot com).
Who produces DrawFBP? Where can it be obtained? Which platforms does it run on? Is it commercial? Opensource?
Yes, it's free - in fact, I would like people to enhance it. It is on the Flow-Based Programing project on SourceForge.
DrawFBP also supports StepwiseRefinement? - double-clicking on an object marked as a Composite? results in the display of a lower-level SubNet. When you exit from the SubNet, you pop back to the previous level. You can use this during the design process to progressively refine functions, or use it as a way to make diagrams graspable by abstracting functions to a higher level. E.g. the box marked INFQUEUE in the third diagram actually represents a SubNet consisting of two components (and a shared file). It is shown in expanded form just below.
New capability: The new DrawFBP tool can generate a runnable JavaFBP network, prompting the user to enter any information needed to make it complete. The network can then be compiled on your favorite IDE, linked with component libraries, and then executed.
Diagrams are saved in XML format.
Here are three examples of DrawFBP diagrams. Remember that each line is a BoundedBuffer across which travels a stream of InformationPackets.
Boxes with double lines represent Composite? components.
Of particular interest are the boxes marked "MAXCSRT" and "INFQUEUE". These are, respectively, a stream-to-stream sort component, and a temporary storage component that can be used to store data not being sorted. MAXCSRT was an AMPS component that drove the standard IBM disk Sort, so it had no real file size limits - although of course the number of records to be sorted affected the performance. Sort times could thus be reduced by routing packets that were already sequenced around the Sort - as shown in the diagram. By the way, all components with names starting with MAXC are "off the shelf" (precoded, pretested, application-independent).
Since a sort of the entire input stream cannot generate any output until the entire stream has been read in, it is necessary to store InformationPackets that do not need to be sorted until the time that the IPs being sorted become available for further processing.
Notice also the loop involving the box named MCBSIM. MCBSIM accesses a database called the Customer Information File (CIF). The topology shown simulates a subroutine, but with the advantage that the topology can be "opened out" and MCBSIM could be used equally well as a pure "streaming" process (this depends on whether the output of MCBSIM is to be used by a different component from the one that feeds it). In the streaming mode, it is very simple to change the diagram to have as many instances of MCBSIM running in parallel as desired, just by changing the connection list, and adding a load-balancing component of some kind. This is especially useful in the case of IO-bound processes, but it will also be useful for CPU-intensive functions if running on a multiprocessor machine.