/** * @license Highcharts JS v2.3.3 (2012-11-02) * * (c) 20012-2014 * * Author: Gert Vaartjes * * License: www.highcharts.com/license */ package com.highcharts.export.converter; import java.io.File; import java.io.IOException; import java.net.SocketTimeoutException; import java.util.HashMap; import java.util.Map; import java.util.NoSuchElementException; import java.util.concurrent.TimeoutException; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.google.gson.Gson; import com.highcharts.export.pool.PoolException; import com.highcharts.export.pool.BlockingQueuePool; import com.highcharts.export.server.Server; import com.highcharts.export.util.MimeType; @Service("svgConverter") public class SVGConverter { @Autowired private BlockingQueuePool serverPool; protected static Logger logger = Logger.getLogger("converter"); private static final String SVG_DOCTYPE = ""; public String convert(String input, MimeType mime, String constructor, String callback, String globalOptions, Float width, Float scale, String filename) throws SVGConverterException, PoolException, NoSuchElementException, TimeoutException { return this.convert(input, globalOptions, null, null, mime, constructor, callback, width, scale, filename); } public String convert(String input, String globalOptions, String dataOptions, String customCode, MimeType mime, String constructor, String callback, Float width, Float scale, String filename) throws SVGConverterException, PoolException, NoSuchElementException, TimeoutException { Map params = new HashMap(); Gson gson = new Gson(); if (filename != null) { params.put("outfile", filename); } else { params.put("type", mime.name().toLowerCase()); } params.put("infile", input); if (constructor != null && !constructor.isEmpty()) { params.put("constr", constructor); } if (callback != null && !callback.isEmpty()) { params.put("callback", callback); } if (globalOptions != null && !globalOptions.isEmpty()) { params.put("globaloptions", globalOptions); } if (dataOptions != null && !dataOptions.isEmpty()) { params.put("dataoptions", dataOptions); } if (customCode != null && !customCode.isEmpty()) { params.put("customcode", customCode); } if (width != null) { params.put("width", String.valueOf(width)); } if (scale != null) { params.put("scale", String.valueOf(scale)); } // parameters to JSON String json = gson.toJson(params); // send to phantomJs String output = ""; output = requestServer(json); // check first for errors if (output.length() > 5 && output.substring(0,5).equalsIgnoreCase("error")) { throw new SVGConverterException("recveived error from phantomjs:" + output); } return output; } /* * Redirect the SVG string directly */ public String redirectSVG(String svg, String filename) throws SVGConverterException { // add XML Doctype for svg String output = SVG_DOCTYPE + svg; if (filename != null) { // Create file and return filename instead. //String filename = createUniqueFileName(".svg"); File file = new File(filename); try { FileUtils.writeStringToFile(file, output); } catch (IOException ioex) { logger.error(ioex.getMessage()); throw new SVGConverterException("Error while converting, " + ioex.getMessage()); } return filename; } return output; } public String requestServer(String params) throws SVGConverterException, TimeoutException, NoSuchElementException, PoolException { Server server = null; try { server = (Server) serverPool.borrowObject(); String response = server.request(params); return response; } catch (SocketTimeoutException ste) { logger.error(ste); throw new TimeoutException(ste.getMessage()); } catch (TimeoutException te) { logger.error(te); throw new TimeoutException(te.getMessage()); } catch (PoolException nse) { logger.error("POOL EXHAUSTED!!"); throw new PoolException(nse.getMessage()); } catch (Exception e) { logger.error(e); throw new SVGConverterException("Error converting SVG: " + e.getMessage()); } finally { try { serverPool.returnObject(server, true); } catch (Exception e) { logger.error("Exception while returning server to pool: " + e.getMessage()); } } } }