org.isisaddons.module.docx.fixture.dom.templates.CustomerConfirmation.java Source code

Java tutorial

Introduction

Here is the source code for org.isisaddons.module.docx.fixture.dom.templates.CustomerConfirmation.java

Source

/*
 *  Copyright 2013~2014 Dan Haywood
 *
 *  Licensed under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package org.isisaddons.module.docx.fixture.dom.templates;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collections;
import javax.annotation.PostConstruct;
import com.google.common.base.Function;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.io.Resources;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.isisaddons.module.docx.dom.DocxService;
import org.isisaddons.module.docx.dom.LoadTemplateException;
import org.isisaddons.module.docx.dom.MergeException;
import org.isisaddons.module.docx.fixture.dom.Order;
import org.isisaddons.module.docx.fixture.dom.OrderLine;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.output.DOMOutputter;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import org.apache.isis.applib.DomainObjectContainer;
import org.apache.isis.applib.annotation.Action;
import org.apache.isis.applib.annotation.ActionLayout;
import org.apache.isis.applib.annotation.Contributed;
import org.apache.isis.applib.annotation.DomainService;
import org.apache.isis.applib.annotation.MemberOrder;
import org.apache.isis.applib.annotation.NatureOfService;
import org.apache.isis.applib.annotation.RestrictTo;
import org.apache.isis.applib.annotation.SemanticsOf;
import org.apache.isis.applib.value.Blob;
import org.apache.isis.applib.value.Clob;

@DomainService(nature = NatureOfService.VIEW_CONTRIBUTIONS_ONLY)
public class CustomerConfirmation {

    //region > init

    private WordprocessingMLPackage wordprocessingMLPackage;

    @PostConstruct
    public void init() throws IOException, LoadTemplateException {
        final byte[] bytes = Resources
                .toByteArray(Resources.getResource(this.getClass(), "CustomerConfirmation.docx"));
        wordprocessingMLPackage = docxService.loadPackage(new ByteArrayInputStream(bytes));
    }
    //endregion

    //region > downloadCustomerConfirmation (action)

    @Action(semantics = SemanticsOf.SAFE)
    @ActionLayout(contributed = Contributed.AS_ACTION)
    @MemberOrder(sequence = "10")
    public Blob downloadCustomerConfirmation(final Order order) throws IOException, JDOMException, MergeException {

        final org.w3c.dom.Document w3cDocument = asInputW3cDocument(order);

        final ByteArrayOutputStream docxTarget = new ByteArrayOutputStream();
        docxService.merge(w3cDocument, wordprocessingMLPackage, docxTarget, DocxService.MatchingPolicy.LAX);

        final String blobName = "customerConfirmation-" + order.getNumber() + ".docx";
        final String blobMimeType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        final byte[] blobBytes = docxTarget.toByteArray();

        return new Blob(blobName, blobMimeType, blobBytes);
    }

    @Action(semantics = SemanticsOf.SAFE, restrictTo = RestrictTo.PROTOTYPING)
    @ActionLayout(contributed = Contributed.AS_ACTION)
    @MemberOrder(sequence = "11")
    public Clob downloadCustomerConfirmationInputHtml(final Order order)
            throws IOException, JDOMException, MergeException {

        final Document orderAsHtmlJdomDoc = asInputDocument(order);

        final XMLOutputter xmlOutput = new XMLOutputter();
        xmlOutput.setFormat(Format.getPrettyFormat());

        final String html = xmlOutput.outputString(orderAsHtmlJdomDoc);

        final String clobName = "customerConfirmation-" + order.getNumber() + ".html";
        final String clobMimeType = "text/html";
        final String clobBytes = html;

        return new Clob(clobName, clobMimeType, clobBytes);
    }

    //region > downloadCustomerConfirmationAsPdf (action)

    @Action(semantics = SemanticsOf.SAFE)
    @ActionLayout(contributed = Contributed.AS_ACTION)
    @MemberOrder(sequence = "10")
    public Blob downloadCustomerConfirmationAsPdf(final Order order)
            throws IOException, JDOMException, MergeException {

        final org.w3c.dom.Document w3cDocument = asInputW3cDocument(order);

        final ByteArrayOutputStream docxTarget = new ByteArrayOutputStream();
        docxService.merge(w3cDocument, wordprocessingMLPackage, docxTarget, DocxService.MatchingPolicy.LAX,
                DocxService.OutputType.PDF);

        final String blobName = "customerConfirmation-" + order.getNumber() + ".pdf";
        final String blobMimeType = "application/pdf";
        final byte[] blobBytes = docxTarget.toByteArray();

        return new Blob(blobName, blobMimeType, blobBytes);
    }

    private static org.w3c.dom.Document asInputW3cDocument(final Order order) throws JDOMException {
        final Document orderAsHtmlJdomDoc = asInputDocument(order);

        final DOMOutputter domOutputter = new DOMOutputter();
        return domOutputter.output(orderAsHtmlJdomDoc);
    }

    private static Document asInputDocument(final Order order) {
        final Element html = new Element("html");
        final Document document = new Document(html);

        final Element body = new Element("body");
        html.addContent(body);

        addPara(body, "OrderNum", "plain", order.getNumber());
        addPara(body, "OrderDate", "date", order.getDate().toString("dd-MMM-yyyy"));
        addPara(body, "CustomerName", "plain", order.getCustomerName());
        addPara(body, "Message", "plain", "Thank you for shopping with us!");

        final Element table = addTable(body, "Products");
        for (final OrderLine orderLine : order.getOrderLines()) {
            addTableRow(table, new String[] { orderLine.getDescription(), orderLine.getCost().toString(),
                    "" + orderLine.getQuantity() });
        }

        final Element ul = addList(body, "OrderPreferences");
        for (final String preference : preferencesFor(order)) {
            addListItem(ul, preference);
        }
        return document;
    }

    //endregion (

    //region > helpers

    private static final Function<String, String> TRIM = new Function<String, String>() {
        @Override
        public String apply(final String input) {
            return input.trim();
        }
    };

    private static Iterable<String> preferencesFor(final Order order) {
        final String preferences = order.getPreferences();
        if (preferences == null) {
            return Collections.emptyList();
        }
        return Iterables.transform(Splitter.on(",").split(preferences), TRIM);
    }

    private static void addPara(final Element body, final String id, final String clazz, final String text) {
        final Element p = new Element("p");
        body.addContent(p);
        p.setAttribute("id", id);
        p.setAttribute("class", clazz);
        p.setText(text);
    }

    private static Element addList(final Element body, final String id) {
        final Element ul = new Element("ul");
        body.addContent(ul);
        ul.setAttribute("id", id);
        return ul;
    }

    private static Element addListItem(final Element ul, final String... paras) {
        final Element li = new Element("li");
        ul.addContent(li);
        for (final String para : paras) {
            addPara(li, para);
        }
        return ul;
    }

    private static void addPara(final Element li, final String text) {
        if (text == null) {
            return;
        }
        final Element p = new Element("p");
        li.addContent(p);
        p.setText(text);
    }

    private static Element addTable(final Element body, final String id) {
        final Element table = new Element("table");
        body.addContent(table);
        table.setAttribute("id", id);
        return table;
    }

    private static void addTableRow(final Element table, final String[] cells) {
        final Element tr = new Element("tr");
        table.addContent(tr);
        for (final String columnName : cells) {
            final Element td = new Element("td");
            tr.addContent(td);
            td.setText(columnName);
        }
    }
    //endregion

    //region > injected services

    @javax.inject.Inject
    DomainObjectContainer container;

    @javax.inject.Inject
    private DocxService docxService;

    //endregion

}