/*
* Copyright 2014 Ranjan Kumar
*
* 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.restfiddle.controller.rest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.restfiddle.dao.NodeRepository;
import com.restfiddle.dto.NodeDTO;
import com.restfiddle.dto.NodeStatusResponseDTO;
import com.restfiddle.dto.ReportDTO;
import com.restfiddle.dto.TagDTO;
@RestController
@EnableAutoConfiguration
@ComponentScan
@Transactional
public class ReportController {
Logger logger = LoggerFactory.getLogger(ReportController.class);
@Autowired
private NodeRepository nodeRepository;
@Autowired
private ApiController apiController;
/**
* This API can be used to generate report for "RUN PROJECT" functionality.
*/
@RequestMapping(value = "/api/report/projects/{id}", method = RequestMethod.GET)
public void generateRunProjectReport(@PathVariable("id") Long id) {
}
@RequestMapping(value = "/api/processor/projects/{id}/report", method = RequestMethod.GET)
public void generateRunProjectReport(@PathVariable("id") String id, @RequestParam(value = "envId", required = false) String envId, HttpServletResponse response) {
List<NodeStatusResponseDTO> nodeStatusResponse = apiController.runProjectById(id, envId);
generateRunNodeReport(nodeStatusResponse, response);
}
@RequestMapping(value = "/api/processor/folders/{id}/report", method = RequestMethod.GET)
public void generateRunFolderReport(@PathVariable("id") String id, @RequestParam(value = "envId", required = false) String envId, HttpServletResponse response) {
List<NodeStatusResponseDTO> nodeStatusResponse = apiController.runFolderById(id, envId);
generateRunNodeReport(nodeStatusResponse, response);
}
public void generateRunNodeReport(List<NodeStatusResponseDTO> nodeStatusResponse, HttpServletResponse response) {
String reportTemplateFilePath = "report-template" + File.separator + "rf_doc_template.jasper";
Resource resource = new ClassPathResource(reportTemplateFilePath);
List<ReportDTO> apiNodes = new ArrayList<ReportDTO>();
ReportDTO node = new ReportDTO();
apiNodes.add(node);
Map<String, Object> params = new HashMap<String, Object>();
node.setNodeStatusResponse(nodeStatusResponse);
JRBeanCollectionDataSource ds1 = new JRBeanCollectionDataSource(apiNodes);
JRBeanCollectionDataSource ds2 = new JRBeanCollectionDataSource(nodeStatusResponse);
params.put("nodeStatusResponse", ds2);
try (InputStream inputStream = resource.getInputStream();) {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"report.pdf\"");
response.setHeader("Cache-Control", "no-cache");
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, params, ds1);
JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
} catch (JRException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
/**
* This API can be used to generate REST API documentation for a project.
*/
@RequestMapping(value = "/api/documentation/projects/{id}", method = RequestMethod.GET)
public void generateProjectApiDocumentation(@PathVariable("id") Long id, HttpServletResponse response) {
String reportTemplateFilePath = "report-template" + File.separator + "rf_doc_template.jasper";
Resource resource = new ClassPathResource(reportTemplateFilePath);
// TODO : NodeDTO and TagDTO are used for testing purpose. Need to define a custom DTO for reports.
// TODO : Use NodeStatusResponseDTO instead of TagDTO.
List<NodeDTO> apiNodes = new ArrayList<NodeDTO>();
NodeDTO node = new NodeDTO();
apiNodes.add(node);
List<TagDTO> tags = new ArrayList<TagDTO>();
TagDTO tag = new TagDTO();
//tag.setId(24);
tag.setName("GET Workspaces");
tag.setDescription("A workspace is a collection of projects. This API returns list of available workspaces.");
tags.add(tag);
TagDTO tag2 = new TagDTO();
//tag2.setId(30L);
tag2.setName("Post Workspace");
tag2.setDescription("This API is used to create a new workspace.");
tags.add(tag2);
node.setTags(tags);
JRBeanCollectionDataSource ds1 = new JRBeanCollectionDataSource(apiNodes);
Map<String, Object> params = new HashMap<String, Object>();
JRBeanCollectionDataSource ds2 = new JRBeanCollectionDataSource(tags);
params.put("tags", ds2);
try (InputStream inputStream = resource.getInputStream();) {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=\"report.pdf\"");
response.setHeader("Cache-Control", "no-cache");
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, params, ds1);
JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
} catch (JRException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}