/* * Copyright 2011 JBoss Inc * * 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 org.jbpm.formbuilder.server; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import org.jboss.resteasy.annotations.providers.jaxb.DoNotUseJAXBProvider; import org.jbpm.formbuilder.server.file.FileException; import org.jbpm.formbuilder.server.file.FileService; import org.jbpm.formbuilder.server.xml.FileListDTO; @Path("/files") public class RESTFileService extends RESTBaseService { private FileService fileService = null; protected void setContext(ServletContext context) { if (fileService == null) { this.fileService = ServiceFactory.getInstance().getFileService(); } } @POST @Path("/package/{pkgName}") @Consumes(MediaType.MULTIPART_FORM_DATA) @DoNotUseJAXBProvider public Response saveFile(@PathParam("pkgName") String packageName, @Context HttpServletRequest request) { setContext(request.getSession().getServletContext()); if (isMultipart(request)) { //read multipart request and populate request accordingly for display ServletFileUpload upload = createFileUpload(); try { List<?> files = parseFiles(request, upload); if (files == null || files.isEmpty()) { return error("there should be one file at least", null); } FileItem item = (FileItem) files.iterator().next(); byte[] content = readItem(item); String fileName = item.getName(); String expositionUrl = fileService.storeFile(packageName, fileName, content); return Response.ok(expositionUrl, MediaType.TEXT_PLAIN).build(); } catch (FileException e) { return error("Problem storing file to guvnor", e); } catch (IOException e) { return error("Problem reading input of file", e); } catch (FileUploadException e) { return error("Problem reading upload of file", e); } } else { return error("Must be a multipart form data post", null); } } protected boolean isMultipart(HttpServletRequest request) { return ServletFileUpload.isMultipartContent(request); } protected byte[] readItem(FileItem item) throws IOException { return IOUtils.toByteArray(item.getInputStream()); } protected List<?> parseFiles(HttpServletRequest request, ServletFileUpload upload) throws FileUploadException { return upload.parseRequest(request); } protected ServletFileUpload createFileUpload() { int maxMemorySize = 2400000; File tmpDirectory = new File(System.getProperty("java.io.tmpdir")); DiskFileItemFactory factory = new DiskFileItemFactory(maxMemorySize, tmpDirectory); ServletFileUpload upload = new ServletFileUpload(factory); return upload; } @DELETE @Path("/package/{pkgName}/{fileName}") public Response deleteFile(@Context HttpServletRequest request, @PathParam("pkgName") String packageName, @PathParam("fileName") String fileName) { setContext(request.getSession().getServletContext()); try { fileService.deleteFile(packageName, fileName); return Response.noContent().build(); } catch (FileException e) { return error("Problem deleting file in guvnor", e); } } @GET @Path("/package/{pkgName}/") public Response getFiles(@Context HttpServletRequest request, @PathParam("pkgName") String packageName, @QueryParam("type") String[] fileTypes) { setContext(request.getSession().getServletContext()); try { List<String> allFiles = new ArrayList<String>(); for (String fileType : fileTypes) { allFiles.addAll(fileService.loadFilesByType(packageName, fileType)); } Collections.sort(allFiles); FileListDTO dto = new FileListDTO(allFiles); return Response.ok(dto, MediaType.APPLICATION_XML).build(); } catch (FileException e) { return error("Problem loading file names", e); } } @GET @Path("/package/{pkgName}/{fileName}") public Response getFile(@Context HttpServletRequest request, @PathParam("pkgName") String packageName, @PathParam("fileName") String fileName) { setContext(request.getSession().getServletContext()); try { byte[] content = fileService.loadFile(packageName, fileName); return Response.ok(content, MediaType.APPLICATION_OCTET_STREAM).build(); } catch (FileException e) { return error("Problem loading file " + fileName, e); } } /** * @param fileService the fileService to set (for test case purposes) */ public void setFileService(FileService fileService) { this.fileService = fileService; } public FileService getFileService() { return fileService; } }