Java tutorial
/******************************************************************************* * 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); } }