Show Table of Contents
2.37. Java Object Graph Transformation
- Smooks can transform one Java object graph into another. To do this, it uses the SAX processing model, which means no intermediate object model is constructed. Instead, the source Java object graph is turned directly into a stream of SAX events, which are used to populate the target Java object graph.If you use the HTML Smooks Report Generator tool, you will see that the event stream produced by the source object model is as follows:
<example.srcmodel.Order> <header> <customerNumber> </customerNumber> <customerName> </customerName> </header> <orderItems> <example.srcmodel.OrderItem> <productId> </productId> <quantity> </quantity> <price> </price> </example.srcmodel.OrderItem> </orderItems> </example.srcmodel.Order> - Aim the Smooks Java bean resources at this event stream. The Smooks configuration for performing this transformation (smooks-config.xml) is as follows:
<?xml version="1.0"?> <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd" xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.4.xsd"> <jb:bean BeanId="lineOrder" class="example.trgmodel.LineOrder" createOnElement="example.srcmodel.Order"> <jb:wiring property="lineItems" BeanIdRef="lineItems" /> <jb:value property="customerId" data="header/customerNumber" /> <jb:value property="customerName" data="header/customerName" /> </jb:bean> <jb:bean BeanId="lineItems" class="example.trgmodel.LineItem[]" createOnElement="orderItems"> <jb:wiring BeanIdRef="lineItem" /> </jb:bean> <jb:bean BeanId="lineItem" class="example.trgmodel.LineItem" createOnElement="example.srcmodel.OrderItem"> <jb:value property="productCode" data="example.srcmodel.OrderItem/productId" /> <jb:value property="unitQuantity" data="example.srcmodel.OrderItem/quantity" /> <jb:value property="unitPrice" data="example.srcmodel.OrderItem/price" /> </jb:bean> </smooks-resource-list> - The source object model is provided to Smooks via a
org.milyn.delivery.JavaSourceobject. Create this object by passing the constructor the source model's root object. The resulting Java Source object is used in theSmooks#filtermethod. Here is the resulting code:protected LineOrder runSmooksTransform(Order srcOrder) throws IOException, SAXException { Smooks smooks = new Smooks("smooks-config.xml"); ExecutionContext executionContext = smooks.createExecutionContext(); // Transform the source Order to the target LineOrder via a // JavaSource and JavaResult instance... JavaSource source = new JavaSource(srcOrder); JavaResult result = new JavaResult(); // Configure the execution context to generate a report... executionContext.setEventListener(new HtmlReportGenerator("target/report/report.html")); smooks.filterSource(executionContext, source, result); return (LineOrder) result.getBean("lineOrder"); }

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.