net.sf.taverna.t2.renderers.SVGRenderer.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.taverna.t2.renderers.SVGRenderer.java

Source

/*******************************************************************************
 * Copyright (C) 2007 The University of Manchester
 *
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 *
 *  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.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.renderers;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.regex.Pattern;

import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;

import uk.org.taverna.databundle.DataBundles;

/**
 * This class renders SVG Documents.
 * Last edited by $Author: sowen70 $
 *
 * @author Mark
 * @author Ian Dunlop
 * @author Alex Nenadic
 */
public class SVGRenderer implements Renderer {

    private int MEGABYTE = 1024 * 1024;

    private static Logger logger = Logger.getLogger(SVGRenderer.class);

    private Pattern pattern;

    public SVGRenderer() {
        pattern = Pattern.compile(".*image/svg[+]xml.*");
    }

    @Override
    public boolean canHandle(String mimeType) {
        return pattern.matcher(mimeType).matches();
    }

    @Override
    public String getType() {
        return "SVG";
    }

    @SuppressWarnings("serial")
    public JComponent getComponent(Path path) throws RendererException {
        if (DataBundles.isValue(path) || DataBundles.isReference(path)) {
            long approximateSizeInBytes = 0;
            try {
                approximateSizeInBytes = RendererUtils.getSizeInBytes(path);
            } catch (Exception ex) {
                logger.error("Failed to get the size of the data", ex);
                return new JTextArea("Failed to get the size of the data (see error log for more details): \n"
                        + ex.getMessage());
            }

            if (approximateSizeInBytes > MEGABYTE) {
                int response = JOptionPane.showConfirmDialog(null, "Result is approximately "
                        + bytesToMeg(approximateSizeInBytes)
                        + " MB in size, there could be issues with rendering this inside Taverna\nDo you want to continue?",
                        "Render as SVG?", JOptionPane.YES_NO_OPTION);

                if (response != JOptionPane.YES_OPTION) {
                    return new JTextArea(
                            "Rendering cancelled due to size of data. Try saving and viewing in an external application.");
                }
            }

            String resolve = null;
            try {
                // Resolve it as a string
                resolve = RendererUtils.getString(path);
            } catch (Exception e) {
                logger.error("Reference Service failed to render data as string", e);
                return new JTextArea(
                        "Reference Service failed to render data as string (see error log for more details): \n"
                                + e.getMessage());
            }

            final JSVGCanvas svgCanvas = new JSVGCanvas();
            File tmpFile = null;
            try {
                tmpFile = File.createTempFile("taverna", "svg");
                tmpFile.deleteOnExit();
                FileUtils.writeStringToFile(tmpFile, resolve, "utf8");
            } catch (IOException e) {
                logger.error("SVG Renderer: Failed to write the data to temporary file", e);
                return new JTextArea(
                        "Failed to write the data to temporary file (see error log for more details): \n"
                                + e.getMessage());
            }
            try {
                svgCanvas.setURI(tmpFile.toURI().toASCIIString());
            } catch (Exception e) {
                logger.error("Failed to create SVG renderer", e);
                return new JTextArea(
                        "Failed to create SVG renderer (see error log for more details): \n" + e.getMessage());
            }
            JPanel jp = new JPanel() {
                @Override
                protected void finalize() throws Throwable {
                    svgCanvas.stopProcessing();
                    super.finalize();
                }
            };
            jp.add(svgCanvas);
            return jp;
        } else {
            logger.error("Failed to obtain the data to render: data is not a value or reference");
            return new JTextArea("Failed to obtain the data to render: data is not a value or reference");
        }
    }

    /**
     * Work out size of file in megabytes to 1 decimal place
     *
     * @param bytes
     * @return
     */
    private int bytesToMeg(long bytes) {
        float f = bytes / MEGABYTE;
        return Math.round(f);
    }
}