<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8905250173577447889</id><updated>2011-11-27T15:21:48.130-08:00</updated><category term='Spring'/><category term='prefuse'/><category term='groovy'/><title type='text'>Craig MacKay's Blog</title><subtitle type='html'>Thoughts on agile software development and related technologies</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://craigmackay.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8905250173577447889/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://craigmackay.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Craig MacKay</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>2</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8905250173577447889.post-8294756776398136126</id><published>2007-11-12T20:31:00.000-08:00</published><updated>2011-07-21T18:27:59.619-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Simple web services using a Groovy MultiActionController in Spring</title><content type='html'>There have been many times I have wanted to create a simple XML API on top of my Spring applications. One technique I find myself using a lot is to create a scripted MultiActionController that uses the Groovy MarkupBuilder to render XML. (requires Spring 2.0 and above)&lt;br /&gt;&lt;br /&gt;So as an example, Lets assume we have a Spring application created that is for an online store. (Download link for source code is below) We want to provide an xml representation of the products we offer from the following url:&lt;br /&gt;&lt;br /&gt;http://localhost:8080/store/api/products&lt;br /&gt;&lt;br /&gt;This will provide an xml document that looks like the following:&lt;br /&gt;&lt;pre name="code"&gt;&amp;lt;products&amp;gt;&lt;br /&gt;   &amp;lt;product id="1" name="Product 1" price="2.5"/&amp;gt;&lt;br /&gt;   &amp;lt;product id="2" name="Product 2" price="3.5"/&amp;gt;&lt;br /&gt;   &amp;lt;product id="3" name="Product 3" price="4.5"/&amp;gt;&lt;br /&gt;&amp;lt;/products&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So the first step to creating our xml api is to setup a dispatcher servlet. We will add the following servlet definition and mapping to the web.xml.&lt;br /&gt;&lt;pre name="code"&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;api&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;   &amp;lt;load-on-startup&amp;gt;2&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;api&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/api/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The next step is to create the dispatchers bean definition xml. This will be a file named api-servlet.xml that will be located in the WEB-INF folder of your application. The following are the contents of the api-servlet.xml.&lt;br /&gt;&lt;pre name="code"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;   xmlns:lang="http://www.springframework.org/schema/lang"&lt;br /&gt;   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&lt;br /&gt;   http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd"&amp;gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&amp;gt;&lt;br /&gt;       &amp;lt;property name="mappings"&amp;gt;&lt;br /&gt;           &amp;lt;props&amp;gt;&lt;br /&gt;               &amp;lt;prop key="/*"&amp;gt;apiController&amp;lt;/prop&amp;gt;&lt;br /&gt;           &amp;lt;/props&amp;gt;&lt;br /&gt;       &amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;/bean&amp;gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;lang:groovy id="apiController" script-source="/WEB-INF/groovy/APIController.groovy"&amp;gt;&lt;br /&gt;       &amp;lt;lang:property name="productService" ref="productService" /&amp;gt;&lt;br /&gt;   &amp;lt;/lang:groovy&amp;gt;&lt;br /&gt;  &lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next step is to create the scripted controller. This will be called APIController.groovy and located in the WEB-INF/groovy folder.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import javax.servlet.http.HttpServletRequest&lt;br /&gt;import javax.servlet.http.HttpServletResponse&lt;br /&gt;import org.springframework.web.servlet.mvc.multiaction.MultiActionController&lt;br /&gt;import groovy.xml.MarkupBuilder&lt;br /&gt;&lt;br /&gt;class APIController extends MultiActionController {&lt;br /&gt;  &lt;br /&gt;   def productService&lt;br /&gt;  &lt;br /&gt;   void products(HttpServletRequest req, HttpServletResponse res) {&lt;br /&gt;       def products = productService.findAllProducts()&lt;br /&gt;       res.contentType = "text/xml"&lt;br /&gt;       def markupBuilder = new MarkupBuilder(res.writer)&lt;br /&gt;       markupBuilder.products {&lt;br /&gt;           for (p in products) {&lt;br /&gt;               product(id:p.id, name:p.name, price:p.price)&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Thats it.. We can now deploy and access our web service. Additional methods could now be added to the APIController specified above to expose other data elements from the online store. One proposed method might be a product method that loads a particular product by id.&lt;br /&gt;&lt;br /&gt;I have included a link to all the source code in a completed deployable web app in a maven project. It also takes advantage of the maven cargo plugin to support running of the application from within a container.  All you have to do is have maven2 installed and run "mvn clean package cargo:start". Be patient it might take a while to fetch Tomcat the first time it runs.&lt;br /&gt;&lt;br /&gt;Sample Project Structure:&lt;br /&gt;&lt;pre&gt;.&lt;br /&gt;|-- pom.xml&lt;br /&gt;`-- src&lt;br /&gt;   `-- main&lt;br /&gt;       |-- java&lt;br /&gt;       |   `-- com&lt;br /&gt;       |       `-- acme&lt;br /&gt;       |           `-- store&lt;br /&gt;       |               |-- domain&lt;br /&gt;       |               |   `-- Product.java&lt;br /&gt;       |               `-- service&lt;br /&gt;       |                   |-- DefaultProductService.java&lt;br /&gt;       |                   `-- ProductService.java&lt;br /&gt;       `-- webapp&lt;br /&gt;           |-- WEB-INF&lt;br /&gt;           |   |-- api-servlet.xml&lt;br /&gt;           |   |-- applicationContext.xml&lt;br /&gt;           |   |-- groovy&lt;br /&gt;           |   |   `-- APIController.groovy&lt;br /&gt;           |   `-- web.xml&lt;br /&gt;           `-- index.jsp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://codehaus.org/~craigmackay/downloads/store-project.zip"&gt;Dowload Sample Project Source Code&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8905250173577447889-8294756776398136126?l=craigmackay.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craigmackay.blogspot.com/feeds/8294756776398136126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8905250173577447889&amp;postID=8294756776398136126' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8905250173577447889/posts/default/8294756776398136126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8905250173577447889/posts/default/8294756776398136126'/><link rel='alternate' type='text/html' href='http://craigmackay.blogspot.com/2007/11/simple-web-services-using-groovy.html' title='Simple web services using a Groovy MultiActionController in Spring'/><author><name>Craig MacKay</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8905250173577447889.post-6731934431576217662</id><published>2007-10-11T22:12:00.000-07:00</published><updated>2011-07-21T18:28:09.998-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='prefuse'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Creating a Groovy Builder for Graphs using Prefuse</title><content type='html'>Groovy's &lt;a href="http://groovy.codehaus.org/Builders"&gt;BuilderSupport&lt;/a&gt; provides the capability to create a convenient syntax for building different types of structures. Some of the most commonly used examples may be for building XML documents or Swing user interfaces. In this post I am going to create a simple builder that creates a hierarchy of nodes that will be displayed visually using the &lt;a href="http://prefuse.org/"&gt;Prefuse visualization library&lt;/a&gt; in a swing application.&lt;br /&gt;&lt;br /&gt;A good approach to defining a convenient syntax is to start with a test driven approach and start coding a script that will use the builder. This example is only going to define the simplest of graphs with prefuse. Prefuse is a very powerful visualization library and there is so much more that could be added.&lt;br /&gt;&lt;br /&gt;Below is the groovy code for working with the PrefuseBuilder:&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;  // create the prefuse graph&lt;br /&gt;  def prefuse = new PrefuseBuilder()&lt;br /&gt;  def graph = prefuse.graph {&lt;br /&gt;      node("Grand Parent") {&lt;br /&gt;          node("Parent") {&lt;br /&gt;              node("Child 1")&lt;br /&gt;              node("Child 2")&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  // create a swing app using the Groovy SwingBuilder to display the graph&lt;br /&gt;  def swing = new groovy.swing.SwingBuilder()&lt;br /&gt;  def frame = swing.frame(&lt;br /&gt;           title:'PrefuseBuilder Test', defaultCloseOperation:javax.swing.WindowConstants.EXIT_ON_CLOSE) {&lt;br /&gt;      widget(graph)&lt;br /&gt;  }&lt;br /&gt;  frame.show()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The result of this graph will be the a swing application that looks like the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_cItirB674Rk/RxbKyWKDlgI/AAAAAAAAAAs/T_A41LVaBmc/s1600-h/prefuse_screenshot.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_cItirB674Rk/RxbKyWKDlgI/AAAAAAAAAAs/T_A41LVaBmc/s320/prefuse_screenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5122504592470545922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To simplify this example I am going to code the builder in Groovy, but this could also be implemented in a regular java class if preferred.&lt;br /&gt;&lt;br /&gt;Below is the completed PrefuseBuilder class:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java:nocontrols"&gt;import groovy.util.BuilderSupport&lt;br /&gt;import prefuse.Constants&lt;br /&gt;import prefuse.Display&lt;br /&gt;import prefuse.Visualization&lt;br /&gt;import prefuse.action.ActionList&lt;br /&gt;import prefuse.action.RepaintAction&lt;br /&gt;import prefuse.action.assignment.ColorAction&lt;br /&gt;import prefuse.action.assignment.DataColorAction&lt;br /&gt;import prefuse.action.layout.graph.ForceDirectedLayout&lt;br /&gt;import prefuse.activity.Activity&lt;br /&gt;import prefuse.controls.DragControl&lt;br /&gt;import prefuse.controls.PanControl&lt;br /&gt;import prefuse.controls.ZoomControl&lt;br /&gt;import prefuse.data.Graph&lt;br /&gt;import prefuse.data.Node&lt;br /&gt;import prefuse.render.DefaultRendererFactory&lt;br /&gt;import prefuse.render.LabelRenderer&lt;br /&gt;import prefuse.util.ColorLib&lt;br /&gt;import prefuse.visual.VisualItem&lt;br /&gt;&lt;br /&gt;class PrefuseBuilder extends BuilderSupport {&lt;br /&gt;  &lt;br /&gt;   def graph&lt;br /&gt;   def visualization&lt;br /&gt;  &lt;br /&gt;   void setParent(Object parent, Object child) {&lt;br /&gt;       if (parent instanceof Node &amp;amp;&amp;amp; child instanceof Node) {&lt;br /&gt;           graph.addEdge(parent, child)&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;      &lt;br /&gt;   Object createNode(Object name) {&lt;br /&gt;       return createNode(name, null, null)&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   Object createNode(Object name, Object value) {&lt;br /&gt;       return createNode(name, null, value)&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   Object createNode(Object name, Map attributes) {&lt;br /&gt;       return createNode(name, attributes, null)&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   Object createNode(Object name, Map attributes, Object value) {&lt;br /&gt;       def node = null&lt;br /&gt;       if (name == 'node') {&lt;br /&gt;           node = graph.addNode()&lt;br /&gt;           node.setString("name", value)&lt;br /&gt;           visualization.run("color")&lt;br /&gt;       }&lt;br /&gt;       if (name == 'graph') {&lt;br /&gt;           graph = new Graph()&lt;br /&gt;           graph.addColumn("name", String.class)&lt;br /&gt;           visualization = new Visualization()&lt;br /&gt;           visualization.add("graph", graph)&lt;br /&gt;           def labelRenderer = new LabelRenderer("name")&lt;br /&gt;           labelRenderer.setRoundedCorner(8, 8)&lt;br /&gt;           visualization.setRendererFactory(new DefaultRendererFactory(labelRenderer))&lt;br /&gt;           def fill = new ColorAction("graph.nodes", VisualItem.FILLCOLOR, ColorLib.rgb(190,190,255))&lt;br /&gt;           def text = new ColorAction("graph.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0))&lt;br /&gt;           def edges = new ColorAction("graph.edges", VisualItem.STROKECOLOR, ColorLib.gray(200))&lt;br /&gt;           def color = new ActionList()&lt;br /&gt;           color.add(fill)&lt;br /&gt;           color.add(text)&lt;br /&gt;           color.add(edges)&lt;br /&gt;           def layout = new ActionList(Activity.INFINITY)&lt;br /&gt;           layout.add(new ForceDirectedLayout("graph", true))&lt;br /&gt;           layout.add(new RepaintAction())&lt;br /&gt;           visualization.putAction("color", color)&lt;br /&gt;           visualization.putAction("layout", layout)&lt;br /&gt;           def display = new Display(visualization)&lt;br /&gt;           display.setSize(720, 500)&lt;br /&gt;           display.addControlListener(new DragControl())&lt;br /&gt;           display.addControlListener(new PanControl())&lt;br /&gt;           display.addControlListener(new ZoomControl())&lt;br /&gt;           display.setHighQuality(true)&lt;br /&gt;           visualization.run("color")&lt;br /&gt;           visualization.run("layout")&lt;br /&gt;           node = display&lt;br /&gt;       }&lt;br /&gt;       return node&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's all the code required to create this simple PrefuseBuilder. I am pretty new to Prefuse so I am not 100% sure that I am using the library correctly and I pretty much came up with the code for this from reverse engineering the Prefuse demos. The goal of this post was to present how easily builders can be created and to provide an example of the powerful capabilities they provide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8905250173577447889-6731934431576217662?l=craigmackay.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://craigmackay.blogspot.com/feeds/6731934431576217662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8905250173577447889&amp;postID=6731934431576217662' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8905250173577447889/posts/default/6731934431576217662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8905250173577447889/posts/default/6731934431576217662'/><link rel='alternate' type='text/html' href='http://craigmackay.blogspot.com/2007/10/creating-groovy-builder-for-graphs.html' title='Creating a Groovy Builder for Graphs using Prefuse'/><author><name>Craig MacKay</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_cItirB674Rk/RxbKyWKDlgI/AAAAAAAAAAs/T_A41LVaBmc/s72-c/prefuse_screenshot.png' height='72' width='72'/><thr:total>7</thr:total></entry></feed>
