com.highcharts.export.converter.SVGConverter.java Source code

Java tutorial

Introduction

Here is the source code for com.highcharts.export.converter.SVGConverter.java

Source

/**
 * @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 = "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">";

    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<String, String> params = new HashMap<String, String>();
        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());
            }
        }
    }
}