You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@isis.apache.org by "Dan Haywood (JIRA)" <ji...@apache.org> on 2012/11/09 18:42:12 UTC
[jira] [Commented] (ISIS-172) Domain Service (in domain-libs) to
allow domain object entities to build .docx (OpenXML) documents against a
template .docx, merging in an XML (or perhaps JSON) input format.
[ https://issues.apache.org/jira/browse/ISIS-172?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13494152#comment-13494152 ]
Dan Haywood commented on ISIS-172:
----------------------------------
I found an API - docx4j - and have implemented up on github [https://github.com/danhaywood/docx-service]. I'll be donating this code back into Isis once we have our git repo up and running (INFRA-5502).
The input format is XHTML. See the readme on the github page for more info,
> Domain Service (in domain-libs) to allow domain object entities to build .docx (OpenXML) documents against a template .docx, merging in an XML (or perhaps JSON) input format.
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: ISIS-172
> URL: https://issues.apache.org/jira/browse/ISIS-172
> Project: Isis
> Issue Type: New Feature
> Components: Domain: Services
> Reporter: Dan Haywood
> Assignee: Mike Burton
> Priority: Minor
> Labels: newbie
> Original Estimate: 24h
> Remaining Estimate: 24h
>
> Provide a standalone implementation of a document builder service that can be registered as a hidden service, and injected into domain objects so that they are able to send build OpenXml documents. The input could be an XML-based notation (or perhaps JSON) along with a template .docx document.
> The signature of the interface would be something like:
> [Hidden]
> public interface OpenXmlDocumentBuilder {
> byte[] build(byte[] documentTemplate, org.w3c.Document xmlDoc);
> }
> eg where the XML format is something like:
> <input>
> <LetterDate type="date">2012-01-30</LetterDate>
> <CustomerTitle type="rich">Dear Mrs. Jenkins</CustomerTitle>
> <Blurb>As requested, here are the recent payments made from your account</Blurb>
> <Payments type="rich-table">
> <row>
> <Date>2012-01-20</Date>
> <Merchant>Walmart</Merchant>
> <Amount>123.45</Date>
> </row>
> <row>
> <Date>2012-01-21</Date>
> <Merchant>Esso</Merchant>
> <Amount>45.23</Date>
> </row>
> <row>
> <Date>2012-01-22</Date>
> <Merchant>Starbucks</Merchant>
> <Amount>12.01</Date>
> </row>
> <row>
> <Date>2012-01-22</Date>
> <Merchant>Amazon</Merchant>
> <Amount>89.99</Date>
> </row>
> </Payments>
> </input>
> so that the information is used to merge into fields within the OpenXml. (NB: if using MS Word, this would correspond to "Content Controls", as per the Developer tab).
> ~~~~~~~~~~~~~
> In terms of how a domain object would use this service, one design is to have a CommunicationTemplate domain object, which holds the .docx (or .odf) (eg as a base 64 encoded string). The CommunicationTemplate acts as a factory for Communication objects, requiring that the appropriate XML be provided to it. The template then calls the DocumentBuilderService and gets back a mail-merged version; this is stored in the resultant Communication (eg again base 64 encoded).
> The sequence diagram below shows how this service could be used by a CommunicationTemplate and Communication domain object:
> http://www.websequencediagrams.com/cgi-bin/cdraw?lz=dGl0bGUgY3JlYXRlIENvbW11bmljYXRpb24KCkN1c3RvbWVyLT4rAA0NVGVtcGxhdGVSZXBvc2l0b3J5OiBsb29rdXAodAAUB0NvZGUpCgAXHy0tPi0AXAg6IABkDAAMCmJ1aWxkIHhtbABtIjoAgUAHKHhtbCkKAGcWLT4rRG9jdW1lbnRCdWlsZGVyU2VydmljZTogbWFpbE1lcmdlKHRoaXMub2RmAIFgCCwgAE0FACMWAIFABQB5Fm1lcmdlZE9kZgB0GQCCZA06IGluc3RhbnRpYXRlKAA0CQCBMhkAgi8PCg&s=qsd
> ~~~~~~~~~~~~
> generated at http://www.websequencediagrams.com/ using the following script:
> title create Communication
> Customer->+CommunicationTemplateRepository: lookup(templateCode)
> CommunicationTemplateRepository-->-Customer:
> Customer->Customer: build xml
> Customer->+CommunicationTemplate: create(xml)
> CommunicationTemplate->+DocumentBuilderService: mailMerge(this.odfTemplate, xml)
> DocumentBuilderService-->-CommunicationTemplate: mergedOdf
> CommunicationTemplate->Communication: instantiate(mergedOdf)
> CommunicationTemplate-->-Customer:
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira