package scrum.server.files; import gwtupload.server.UploadAction; import gwtupload.server.exceptions.UploadActionException; import ilarkesto.base.PermissionDeniedException; import ilarkesto.core.logging.Log; import ilarkesto.io.IO; import ilarkesto.webapp.Servlet; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import scrum.server.GwtConversation; import scrum.server.ScrumWebApplication; import scrum.server.WebSession; import scrum.server.project.Project; public class FileUploadServlet extends UploadAction { private static final Log log = Log.get(FileUploadServlet.class); @Override public String executeAction(HttpServletRequest req, List<FileItem> sessionFiles) throws UploadActionException { log.debug("File received", "\n" + Servlet.toString(req, " ")); sessionFiles = new ArrayList<FileItem>(sessionFiles); String projectId = null; for (FileItem item : new ArrayList<FileItem>(sessionFiles)) { String fieldName = item.getFieldName(); if (item.isFormField()) { sessionFiles.remove(item); if (fieldName.equals("projectId")) projectId = item.getString(); } } if (projectId == null) throw new RuntimeException("projectId == null"); if (sessionFiles.size() != 1) throw new IllegalStateException("sessionFiles.size() == " + sessionFiles.size()); ScrumWebApplication webApp = ScrumWebApplication.get(); WebSession session = (WebSession) webApp.getWebSession(req); Project project = (Project) ScrumWebApplication.get().getDaoService().getById(projectId); if (!project.isVisibleFor(session.getUser())) throw new PermissionDeniedException(); FileItem item = sessionFiles.get(0); try { String filename = getFilename(item.getName()); java.io.File f = new java.io.File(project.getFileRepositoryPath() + "/" + filename); int count = 0; while (f.exists()) { count++; f = new java.io.File(project.getFileRepositoryPath() + "/" + insertSuffix(filename, count)); } IO.copyDataToFile(item.getInputStream(), f); File file = webApp.getFileDao().postFile(f, project); webApp.getTransactionService().commit(); for (GwtConversation conversation : webApp.getConversationsByProject(project, null)) { conversation.sendToClient(file); } return file.getReference(); } catch (Exception e) { log.error(e); throw new UploadActionException(e.getMessage()); } finally { removeSessionFileItems(req); } } private String insertSuffix(String name, int count) { int idx = name.lastIndexOf('.'); if (idx > 0) return name.substring(0, idx) + "#" + count + name.substring(idx); return name + "#" + count; } private String getFilename(String name) { if (name == null) return "unnamed.bin"; name = name.replace('\\', '/'); int idx = name.lastIndexOf('/'); if (idx >= 0) return name.substring(idx + 1); return name; } }