/* * Copyright 2013 Haulmont * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.haulmont.yarg.server; import com.haulmont.yarg.console.ReportEngineCreator; import com.haulmont.yarg.reporting.ReportOutputDocument; import com.haulmont.yarg.reporting.Reporting; import com.haulmont.yarg.reporting.RunParams; import com.haulmont.yarg.structure.Report; import com.haulmont.yarg.structure.ReportParameter; import com.haulmont.yarg.structure.xml.XmlReader; import com.haulmont.yarg.structure.xml.impl.DefaultXmlReader; import com.haulmont.yarg.util.converter.ObjectToStringConverter; import com.haulmont.yarg.util.converter.ObjectToStringConverterImpl; import com.haulmont.yarg.util.properties.PropertiesLoader; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import spark.QueryParamsMap; import spark.Request; import spark.Response; import spark.Spark; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static spark.Spark.get; import static spark.Spark.internalServerError; public class Server { protected String reportsPath; protected Integer port; protected PropertiesLoader propertiesLoader; protected static ObjectToStringConverter converter = new ObjectToStringConverterImpl(); protected Logger logger = LoggerFactory.getLogger(getClass()); public Server reportsPath(String reportsPath) { this.reportsPath = reportsPath; return this; } public Server port(int port) { this.port = port; return this; } public Server propertiesLoader(PropertiesLoader propertiesLoader) { this.propertiesLoader = propertiesLoader; return this; } public void init() throws IOException { if (port != null) { Spark.port(port); } initPing(); initGenerate(); } public void stop() { Spark.stop(); } protected void initPing() { get("/ping", (req, res) -> "pong"); } protected void initGenerate() throws IOException { Reporting reporting = new ReportEngineCreator().createReportingEngine(propertiesLoader); get("/generate", (req, res) -> { try { Report report = loadReport(req); if (report == null) { res.type("application/json"); res.status(400); return "{\"errorMessage\": " + "\"Report name is not provided or could not find the report.\"}"; } Map params = parseParameters(req, report); String templateCode = req.queryParams("templateCode"); RunParams reportParams = new RunParams(report).params(params); if (StringUtils.isNotBlank(templateCode)) { reportParams.templateCode(templateCode); } ReportOutputDocument reportOutputDocument = reporting.runReport(reportParams); writeResult(res, reportOutputDocument); return "Ok"; } catch (Exception e) { logger.error(String.format("An error occurred while generating report [%s]", req.queryParams("report")), e); throw new RuntimeException(e); } }); internalServerError((req, res) -> { res.type("application/json"); res.status(500); return "{\"errorMessage\": " + "\"An exception occurred while generating the report. Please see the server logs for the detailed information.\"}"; }); } protected Report loadReport(Request req) throws IOException { String reportName = req.queryParams("report"); if (StringUtils.isBlank(reportName)) { return null; } else { XmlReader xmlReader = new DefaultXmlReader(); return xmlReader.parseXml(FileUtils.readFileToString(new File(String.format("%s/%s.xml", reportsPath, reportName)))); } } protected Map parseParameters(Request req, Report report) { QueryParamsMap queryParams = req.queryMap("params"); Map params = new HashMap<>(); for (ReportParameter reportParameter : report.getReportParameters()) { java.lang.String paramValueStr = queryParams.value(reportParameter.getAlias()); if (paramValueStr != null) { params.put(reportParameter.getAlias(), converter.convertFromString(reportParameter.getParameterClass(), paramValueStr)); } } return params; } protected void writeResult(Response res, ReportOutputDocument reportOutputDocument) throws IOException { HttpServletResponse raw = res.raw(); raw.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", reportOutputDocument.getDocumentName())); raw.setContentLength(reportOutputDocument.getContent().length); raw.getOutputStream().write(reportOutputDocument.getContent()); res.status(200); } }