Comments welcome...

To Do list#

  • This plugin should use the temp-dir defined in, not the system temp-dir.
  • If there is a syntax error in the graph data provided by the user, the plugin feedback is a bit ugly, IOException, graphviz process returned non-zero exit code. doesn't tell the user that the problem is just some bad syntax in his graph data.
  • The obvious extension to hybridize this with the QueryPlugin to get a graph of the links between any set of pages via a query should be considered.
  • In addition to the URL and label attributes created when imap=true maybe 'tooltip's should be made for each node? Not sure what the contents should/could be...

General Comment#

Never having used graphviz in the past, this was interesting to play with, but frustrating. The basic syntax is very approachable, but fine-tuning the graph to get the output effects that you want is not something that novices are going to pickup well. In short its much easier for a person to get a good layout by hand using a drawing tool, than it is for them to get graphviz to create one. I'm considering this diversion at a close for now; at least until I have a clear need and specific use for autogenerated graphs. --JohnV

Okay so I take it back. I did a little job at work where I wanted a dataflow diagram for an embedded micro project, but I didn't feel like creating a drawing of it using a drawing package. So... I wrote up a wiki page description of the project, and used this plugin to create the diagram, and you know what? it was reasonable. Not perfect mind you, but okay enough for the 2 minutes it took to type in the node1->node2 style data. I'm trying to think if there are ways to make the output prettier without adding user labor, make have the plugin generate a standard preamble to the graph, I found that there are afew settings that neato will almost always work better with. --JohnV

Generalized Image Producer framework#

Hi John. First of all, thanks for making this great plugin available! The integration with GraphViz is great, but I also like the idea of using the attachment mechanism as a local cache for the image.

I wonder if it could be refactored into a generic framework for tools that can take a text input and generate an image representation of it. Examples that come to mind:

  • SVG with Batik (already covered in a similar way by SvgChartPlugin)
  • Mathematical equations (already covered by MathPlugin)
  • UML class diagrams like the ones supported by SnipSnap
  • UML sequence diagrams like the ones supported by SEQUENCE
  • Statistical and Busindess charts and graphs (see Cewolf and JFreeChart).
  • Other data visualizers like prefuse

All those tools could have their own plugins, but that would imply in a lot of duplicated code...

So the "Image Producer Plugin" could work like this:

  • take as an argument a class name of an adapter class, that would implement a contract interface;
  • capture the remaining plugin arguments in a name-value pair list;
  • check the attachements and .dat file to verify if a new image is needed; if yes, then:
  • pass the arguments plus the plugin text body to the adapter instance;
  • invoke the contract method in the adapter that would call the XYZ tool to generate the corresponding image file;
  • generate the attachment files;
  • generate the img statement.

Another option would be to add this framework to the JSPWiki core, creating a specialized form of the plugin mechanism that would incorporate the mechanism described above, and take a slightly different form of the default contract interface, say com.ecyrd.jspwiki.plugin.WikiImagePlugin.

Sorry for the long rambling. I will try my hand at integrating some of the tools I described above, but I hate to think that I will be duplicating a lot of your code... ;-)

-- NascifAbousalhNeto

On another thought, it might be easier to just encapsulate the picture and image-map files attachment management in an abstract class, and use a concrete subclass to implement just the GraphViz wrapper. Then other image generators could implement just their own subclass implementations.

-- NascifAbousalhNeto

I found a problem with the current image generation decision process; it does not work properly if the wiki is using the FileSystemProvider. In this case context.getPage().getVersion()) will always return -1, and that seems to break the program logic.

One solution is to add the following check to the very beginning of the execute method. I tried to check on the provider name but it is "hidden" under the CachedProvider. It doesn't solve the problem for this provider, but at least provides a clear explanation to the user of what is wrong.

        if (context.getPage().getVersion() == WikiPageProvider.LATEST_VERSION) {
          reportProblem("This plugin requires a versioned page provider");
          return problemReport();

-- NascifAbousalhNeto

One of my dot files looks totally different rendered on the command line or using the plugin, despite imap=false (it also takes much longer). How can I have a look at what is actually passed to the graphviz binary? -- Tobias Weber
Open the attached .dat file with a text editor, it contains the raw data passed to the binary. --JohnV

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-13) was last changed on 31-Jul-2005 14:17 by JanneJalkanen