- Remove old ExportController

- Add support for simple REST transformation
This commit is contained in:
Paulo Gustavo Veiga
2012-02-19 21:07:24 -03:00
parent e033e8552c
commit 81538f049b
11 changed files with 115 additions and 422 deletions

View File

@@ -1,214 +0,0 @@
/*
* Copyright [2011] [wisemapping]
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* 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.wisemapping.controller;
import com.wisemapping.exporter.ExportException;
import com.wisemapping.exporter.ExportFormat;
import com.wisemapping.exporter.ExporterFactory;
import com.wisemapping.model.MindMap;
import com.wisemapping.service.MindmapService;
import com.wisemapping.view.MindMapBean;
import com.wisemapping.exporter.ExportProperties;
import com.wisemapping.filter.UserAgent;
import org.apache.batik.transcoder.TranscoderException;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;
import org.xml.sax.SAXException;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class ExportController extends BaseMultiActionController {
private static final String IMG_EXPORT_FORMAT = "IMG_EXPORT_FORMAT";
private static final String MAP_ID_PARAMETER = "mapId";
private static final String MAP_SVG_PARAMETER = "mapSvg";
private static final String EXPORT_FORMAT_PARAMETER = "exportFormat";
private static final String IMG_SIZE_PARAMETER = "imgSize";
private static final String MAP_XML_PARAM = "mapXml";
public ModelAndView handleNoSuchRequestHandlingMethod(NoSuchRequestHandlingMethodException noSuchRequestHandlingMethodException, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
logger.info("Mindmap Controller: EXPORT action");
final MindMap mindmap = getMindmapFromRequest(httpServletRequest);
return new ModelAndView("mindmapExport", "mindmap", new MindMapBean(mindmap));
}
public ModelAndView export(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
logger.info("Export Controller: exporting WiseMap action");
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
if (mapIdStr != null) {
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
try {
int mindmapId = Integer.parseInt(mapIdStr);
logger.debug("SVG Map to export:" + mapSvg);
if (mapSvg == null || mapSvg.isEmpty()) {
throw new IllegalArgumentException("SVG map could not be null");
}
String formatStr = request.getParameter(EXPORT_FORMAT_PARAMETER);
if (IMG_EXPORT_FORMAT.endsWith(formatStr)) {
formatStr = request.getParameter("imgFormat");
}
final MindmapService service = getMindmapService();
final MindMap mindMap = service.getMindmapById(mindmapId);
// Build format properties ...
final ExportFormat format = ExportFormat.valueOf(formatStr);
final ExportProperties properties = ExportProperties.create(format);
if (properties instanceof ExportProperties.ImageProperties) {
final String sizeStr = request.getParameter(IMG_SIZE_PARAMETER);
final ExportProperties.ImageProperties imageProperties = (ExportProperties.ImageProperties) properties;
if (sizeStr != null) {
final ExportProperties.ImageProperties.Size size = ExportProperties.ImageProperties.Size.valueOf(sizeStr);
imageProperties.setSize(size);
} else {
imageProperties.setSize(ExportProperties.ImageProperties.Size.LARGE);
}
}
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
// Change image link URL.
setBaseBaseImgUrl(format, properties);
ExporterFactory.export(properties, mindMap.getUnzippedXml(), bos, mapSvg);
// If the export goes ok, write the map to the stream ...
// Set format content type...
final String contentType = format.getContentType();
response.setContentType(contentType);
// Set file name...
final String fileName = mindMap.getTitle() + "." + format.getFileExtension();
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// Write content ...
final ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(bos.toByteArray());
} catch (Throwable e) {
logger.error("Unexpexted error during export process", e);
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
logger.error("map: " + mapSvg);
}
} else {
logger.warn("mapIdStr is null.Image could not be imported. UserAgent:" + request.getHeaders(UserAgent.USER_AGENT_HEADER));
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
return null;
}
private void setBaseBaseImgUrl(@NotNull ExportFormat format, @NotNull ExportProperties properties) {
final String baseUrl;
if (format == ExportFormat.SVG) {
baseUrl = "http://www.wisemapping.com/images";
} else {
final ServletContext servletContext = this.getServletContext();
baseUrl = "file://" + servletContext.getRealPath("/icons/") + "/";
}
properties.setBaseImagePath(baseUrl);
}
public ModelAndView print(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
logger.info("Export Controller: printing WiseMap action");
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
int mindmapId = Integer.parseInt(mapIdStr);
final MindmapService service = getMindmapService();
final MindMap mindmap = service.getMindmapById(mindmapId);
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
exportImage(response, mapSvg, bos, false);
} catch (Throwable e) {
logger.error("Unexpexted error generating the image", e);
logger.error("map: " + mapSvg);
}
BASE64Encoder encoder = new BASE64Encoder();
String content = encoder.encode(bos.toByteArray());
final String exportContent = "data:image/png;base64," + content;
bos.close();
ModelAndView view = new ModelAndView("mindmapPrint", "mindmap", new MindMapBean(mindmap));
final String xmlMap = mindmap.getNativeXmlAsJsLiteral();
view.addObject(MAP_XML_PARAM, xmlMap);
view.addObject(MAP_SVG_PARAMETER, exportContent);
return view;
}
public ModelAndView image(HttpServletRequest request, HttpServletResponse response) throws TranscoderException, IOException, JAXBException {
logger.info("Export Controller: generating image WiseMap action");
final String mapIdStr = request.getParameter(MAP_ID_PARAMETER);
final String mapSvg = request.getParameter(MAP_SVG_PARAMETER);
try {
final ServletOutputStream outputStream = response.getOutputStream();
exportImage(response, mapSvg, outputStream, true);
} catch (Throwable e) {
logger.error("Unexpexted error generating the image", e);
logger.error("map: " + mapSvg);
}
return null;
}
private void exportImage(HttpServletResponse response, String mapSvg, OutputStream outputStream, boolean setOutput) throws TranscoderException, IOException, ParserConfigurationException, SAXException, XMLStreamException, TransformerException, JAXBException, ExportException {
//Image Format
ExportFormat imageFormat = ExportFormat.PNG;
// Build format properties ...
final ExportProperties.ImageProperties imageProperties = new ExportProperties.ImageProperties(imageFormat);
imageProperties.setSize(ExportProperties.ImageProperties.Size.XMEDIUM);
// Change image link URL.
setBaseBaseImgUrl(imageFormat, imageProperties);
// Set format content type...
if (setOutput)
response.setContentType(imageFormat.getContentType());
// Write content ...
ExporterFactory.export(imageProperties, null, outputStream, mapSvg);
}
}

View File

@@ -4,9 +4,8 @@ package com.wisemapping.rest;
import com.wisemapping.model.MindMap;
import com.wisemapping.model.MindmapUser;
import com.wisemapping.model.User;
import com.wisemapping.rest.model.RestMindMap;
import com.wisemapping.rest.model.RestMindmap;
import com.wisemapping.service.MindmapService;
import com.wisemapping.validator.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
@@ -16,21 +15,18 @@ import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class MindmapController {
@Autowired
private MindmapService mindmapService;
@RequestMapping(method = RequestMethod.GET, value = "/map/{id}")
@RequestMapping(method = RequestMethod.GET, value = "/map/{id}", produces = {"text/xml", "application/json", "text/html"})
@ResponseBody
public ModelAndView getMindmap(@PathVariable int id) throws IOException {
final MindMap mindMap = mindmapService.getMindmapById(id);
final RestMindMap map = new RestMindMap(mindMap);
final RestMindmap map = new RestMindmap(mindMap);
return new ModelAndView("mapView", "map", map);
}
@@ -39,7 +35,7 @@ public class MindmapController {
final User user = com.wisemapping.security.Utils.getUser();
final List<MindmapUser> list = mindmapService.getMindmapUserByUser(user);
// final RestMindMap map = new RestMindMap(mindMap);
// final RestMindMap map = new RestMindmap(mindMap);
// return new ModelAndView("mapView", "map", map);
return null;
}

View File

@@ -1,12 +1,16 @@
package com.wisemapping.rest;
import com.wisemapping.exporter.ExportFormat;
import com.wisemapping.exporter.ExportProperties;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -14,6 +18,10 @@ import java.util.Map;
@Controller
public class TransformerController {
private static final String PARAM_SVG_XML = "svgXml";
private static final String PARAM_WISE_MAP_XML = "mapXml";
private static final String PARAM_FILENAME = "filename";
@RequestMapping(method = RequestMethod.POST, value = "/transform", produces = {"application/pdf"}, consumes = {"image/svg+xml"})
@ResponseBody
public ModelAndView transformPdf(@RequestBody @Nullable final String content) throws IOException {
@@ -26,6 +34,18 @@ public class TransformerController {
return new ModelAndView("transformViewPdf", values);
}
@RequestMapping(method = RequestMethod.POST, value = "/transform", produces = {"image/svg+xml"}, consumes = {"image/svg+xml"})
@ResponseBody
public ModelAndView transformSvg(@RequestBody @Nullable final String content) throws IOException {
final Map<String, Object> values = new HashMap<String, Object>();
if (content == null || content.length() == 0) {
throw new IllegalArgumentException("Body can not be null.");
}
values.put("content", content);
return new ModelAndView("transformViewSvg", values);
}
@RequestMapping(method = RequestMethod.POST, value = "/transform", produces = {"image/png"}, consumes = {"image/svg+xml"})
@ResponseBody
public ModelAndView transformPng(@RequestBody @Nullable final String content) throws IOException {
@@ -47,7 +67,7 @@ public class TransformerController {
}
values.put("content", content);
values.put("imageSize", ExportProperties.ImageProperties.Size.LARGE);
return new ModelAndView("transformViewJpg", values);
return new ModelAndView("transformViewJpeg", values);
}
@RequestMapping(method = RequestMethod.POST, value = "/transform", produces = {"application/freemind"}, consumes = {"text/xml"})
@@ -60,4 +80,42 @@ public class TransformerController {
values.put("content", content);
return new ModelAndView("transformViewFreemind", values);
}
@RequestMapping(method = RequestMethod.POST, value = "/transform", consumes = {"application/x-www-form-urlencoded"})
public ModelAndView transform(@NotNull HttpServletRequest request,
@NotNull HttpServletResponse response) throws IOException {
final String svg = request.getParameter(PARAM_SVG_XML);
final String mapXml = request.getParameter(PARAM_WISE_MAP_XML);
final String filename = request.getParameter(PARAM_FILENAME);
// Obtains transformation type based on the last part of the URL ...
final String requestURI = request.getRequestURI();
final String format = requestURI.substring(requestURI.lastIndexOf(".") + 1, requestURI.length());
final ExportFormat exportFormat = ExportFormat.valueOf(format.toUpperCase());
ModelAndView result;
switch (exportFormat) {
case PNG:
result = this.transformPng(svg);
break;
case JPEG:
result = this.transformJpeg(svg);
break;
case PDF:
result = this.transformPdf(svg);
break;
case SVG:
result = this.transformSvg(svg);
break;
case FREEMIND:
result = this.transformFreemind(mapXml);
break;
default:
throw new IllegalArgumentException("Unsupported export format");
}
result.getModelMap().put("filename", filename);
return result;
}
}

View File

@@ -17,17 +17,17 @@ import java.util.Date;
@XmlRootElement(name = "map")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class RestMindMap {
public class RestMindmap {
@JsonIgnore
private MindMap mindmap;
public RestMindMap() {
public RestMindmap() {
this(null);
}
public RestMindMap(@NotNull MindMap mindmap) {
public RestMindmap(@NotNull MindMap mindmap) {
this.mindmap = mindmap;
}

View File

@@ -28,6 +28,7 @@ public class TransformView extends AbstractView {
protected void renderMergedOutputModel(@NotNull Map<String, Object> viewMap, @NotNull HttpServletRequest request, @NotNull final HttpServletResponse response) throws Exception {
final String content = (String) viewMap.get("content");
final String filename = (String) viewMap.get("filename");
// Build format properties ...
final ExportProperties properties = ExportProperties.create(exportFormat);
@@ -57,7 +58,7 @@ public class TransformView extends AbstractView {
response.setContentType(contentType);
// Set file name...
final String fileName = "map" + "." + exportFormat.getFileExtension();
final String fileName = (filename != null ? filename : "map" + ".") + exportFormat.getFileExtension();
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// Write content ...