Dynamic Services Composition is a prototyping/research project aiming at proving a light-weight visual web-based tool to support Project Fuji and specifically the Integration Flow Language.
(NB: use Firefox only)
DSC should allow users to visually author message flows between various components available in the underlying target Fuji runtime. Ideally, for the simplest use-cases, this should not require any manual configuration of the components or writing code. At the same time, while keeping simple things simple, the tool should not forbid to dwell deeper and manually correct even the smallest configuration details of each component.
The very process of authoring should consist of dragging and dropping components on the canvas, connecting them with links and, optionally, configuring (or writing code for business logic) both the components and the connecting links.
There should be no "deploy" step in the flow creation process. At the same time as the component is dropped on the canvas, it should be deployed and go live, as the configuration data is updated in the tool, the live version of the component should be updated as well.
If a component cannot be deployed due to misconfiguration, the user should be properly notified and the component should be marked with a warning badge, indicating that it is not live. Once the configuration is corrected, the component should be auto-deployed.
DSC should be able to obtain information about the existing service engines and binding components from the runtime and present them to the user as options to create a new component. Properties of this "template", when dropped to the canvas, will be populated with default values.
By default the newly created components (and those "copied" from existing ones) are available to the user who created them. The tool, however, should provide an option to easily "share" the component, so that it becomes available (read-only) to other users of the tool.
At the same time the user should be able to "share" the whole message flow, or any connected fragment ("snippet") of it, provided that it is capable of receiving or sending messages or both. A "self-contained" message flow snippet, which reads from an out-only component and ends up in an in-only one cannot be shared as it does not provide any value to other users (cannot be re-used).
DSC should be able to obtain information about the already-deployed components from the runtime and present them to the user in an accessible manner. The user should be able to search through the components and drag and drop them to the canvas in order to reuse in his current message flow. In this case the properties of the re-used components should be read-only. The user also should be able to easily create an editable copy from the re-used component in order to be able to easily modify its properties so that they suit the needs of a particular message flow.
In addition to being able to reuse individual components, the user should be able to re-use the "flow snippets" which are shared by the other users.
The search function should be provided in two flavors -- a quick inline (probably keyword/tag-based) search and a more robust variant, which will be separately accessible from a modal window.
The tool should provide some simple functions to trace and debug the message flow being edited. Namely there should be a way to see all the messages which are in queue to be processed by a component, which are in-transport, i.e. are being transferred from a component to a component.
If a given component type supports debugging the user should be able to see the message that is currently processed by the component and to monitor how it changes.
The user should be able to pause the execution of the message flow at any time and examine the flow configuration (message states, component states). He then should be able to select a component and:
The user should be able to monitor the time it takes for a message to be processed by a certain component, the time a message is in-transit and if the component supports profiling, the time/memory measurements appropriate for a given component type.
The tool should provide the user with basic analytical information, such as:
This information should be available in the form of customizable dashboard and/or as a table.
The user should be able to create test messages which would be supplied to the components in order to test their functionality. The approach here should be similar to that of the composite application testing approach. The user should be able to select a message flow snippet (or the whole message flow) and define the input message that will be sent to the incoming component (or components, if there is more than one entry-point to the snippet). It also should be possible to define the golden values for the message value at any "control point" in the flow: "before" a component and right "after" the component.
The user should be able to execute an individual test or any subset of the whole test suite, monitor their execution and see the results: number of passes, number of failures, failures details.
As the user edits the work flow, each significant (yet TBD) change should be stored in a version control system, namely Subversion. The actual stored artifacts should represent a fully generated maven-based project, which can afterwards be checked out from a third-party tool or an IDE and be edited.
The possible conflicts should be resolved via user interaction. If the tool tries to save (commit) a change and there is a conflict, an appropriate dialog should be shown to the user, asking him to resolve the conflicts.
If the stored version was updated, but there are no conflicts the user should be notified of the change and the flow should be updated from the source control repository, or, if the user wishes to do that, the version be reverted to that of the user's working copy.
The behavior in case, when a user edits the maven project from another application, then deploys without committing, while another user is still editing the flow in the web-interface is undefined. Whoever manages to deploy last will get the prize.
Additionally at some point in time the user, might want to "fix" the current version of the message flow, this will result in a branch being created in the version control system.
Since the "sources" of the message flow are stored in a version control system (which, at the same time is publicly available (that should be optional)) and, more importantly in a standard maven project-based format, it is absolutely possible to let other tools to check out the sources, and work with them.
This is pretty straight-forward. The user running NetBeans should be able to check-out the sources for a message flow (based on its identifier or codename) make the necessary changes and the commit back to the repository. Note that there is no automatic deployment of the components in this case. The user needs to manually deploy, or open the project in the web-based tool in order to deploy the project.
Since the tool is planned as a multi-user environment, some basic access control and authentication mechanism should be provided. This will be used for filtering out the "available" components lists, and, optionally for sending out alerts and notifications, using the user-supplied contact information.
Since the available components form a kind of "functionality cloud" it might make a lot of sense to allow some social network stuff, such as commenting on others' message flow snippets and rating them.
Since, in general, the tool will allow any user create any type of service (e.g. a JRuby script) the engine (and the tool) should provide capabilities to track the resources usage quotas, e.g. processor time, memory footprint, disk usage footprint. Appropriate actions should be taken in case the user exceeds the quotas, such as disabling the user-owned components, sending out notifications, interrupting the too-long execution of a component.
As the user interface is intended to be run within a browser container, the technology that is to be used is mostly obvious: (X)HTML + Javascript. There will be some deviations, however, as the <canvas> tag will be used to draw the nodes of the message flow diagram.
With regard to Javascript frameworks used, the UI will be based on Prototype and Scriptaculous frameworks.
AJAX calls will be used to keep the client-side and server-side models in sync.
The UI elements hierarchy of the message flow editor:
The number of dependencies on the Fuji runtime is quite heavy. Below is the list of functionality, that the runtime should provide (at least to some extent).