/** * Copyright (C) 2010 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.processor.barcode; import org.apache.avalon.framework.configuration.Configuration; import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder; import org.apache.tools.ant.filters.StringInputStream; import org.orbeon.dom.Document; import org.krysalis.barcode4j.BarcodeGenerator; import org.krysalis.barcode4j.BarcodeUtil; import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider; import org.orbeon.oxf.common.OXFException; import org.orbeon.oxf.pipeline.api.PipelineContext; import org.orbeon.oxf.processor.ProcessorInput; import org.orbeon.oxf.processor.ProcessorInputOutputInfo; import org.orbeon.oxf.processor.serializer.legacy.HttpBinarySerializer; import org.orbeon.oxf.util.XPath; import org.orbeon.oxf.util.XPathCache; import org.orbeon.oxf.xml.dom4j.Dom4jUtils; import org.orbeon.dom.saxon.DocumentWrapper; import org.orbeon.saxon.om.DocumentInfo; import java.awt.image.BufferedImage; import java.io.OutputStream; /** * This processor wraps around barcode4j. */ public class BarcodeProcessor extends HttpBinarySerializer {// TODO: HttpBinarySerializer is supposedly deprecated public static String DEFAULT_CONTENT_TYPE = "image/png"; protected String getDefaultContentType() { return DEFAULT_CONTENT_TYPE; } public BarcodeProcessor() { addInputInfo(new ProcessorInputOutputInfo("barcode")); addInputInfo(new ProcessorInputOutputInfo("data")); } protected void readInput(PipelineContext context, ProcessorInput input, Config config, OutputStream outputStream) { // Read inputs final Document configDocument = readCacheInputAsDOM4J(context, "barcode"); final Document instanceDocument = readInputAsOrbeonDom(context, "data"); // Wraps documents for XPath API final DocumentInfo configDocumentInfo = new DocumentWrapper(configDocument, null, XPath.GlobalConfiguration()); final DocumentInfo instanceDocumentInfo = new DocumentWrapper(instanceDocument, null, XPath.GlobalConfiguration()); try { final DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder(); final Configuration cfg = builder.build(new StringInputStream(Dom4jUtils.domToString(configDocument))); final BarcodeGenerator gen = BarcodeUtil.getInstance().createBarcodeGenerator(cfg); // TODO: These parameters (DPI, etc.) should be configurable final BitmapCanvasProvider provider = new BitmapCanvasProvider( outputStream, "image/x-png", 300, BufferedImage.TYPE_BYTE_GRAY, false); // Read text final String messageRef = XPathCache.evaluateAsString( configDocumentInfo, "/barcode/@message", null, null, null, null, null, null, null); final String message = XPathCache.evaluateAsString( instanceDocumentInfo, messageRef, null, null, null, null, null, null, null); // Produce barcode gen.generateBarcode(provider, message); provider.finish(); } catch (Exception e) { throw new OXFException(e); } } }