/* * Copyright 2012 Michael Chang, Tai-Lin Chu, Artin Menachekanian, * Charles Rudolph, Eduard Sedakov, Suzanna Whiteside * * This file is part of ServerLibraryManager. * * ServerLibraryManager is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ServerLibraryManager is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with ServerLibraryManager. If not, see <http://www.gnu.org/licenses/>. */ package edu.ucla.loni.server; import edu.ucla.loni.shared.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.jdom2.Document; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URL; import java.net.URLConnection; import java.sql.Timestamp; @SuppressWarnings("serial") public class Upload extends HttpServlet { /** * Writes a file */ private void writeFile(Directory root, String packageName, InputStream in) throws Exception{ Document doc = ServerUtils.readXML(in); Pipefile pipe = ServerUtils.parseXML(doc); // Update the packageName if (packageName != null && packageName.length() > 0){ pipe.packageName = packageName; doc = ServerUtils.updateXML(doc, pipe); } // Write the document String destPath = ServerUtils.newAbsolutePath(root.absolutePath, pipe.packageName, pipe.type, pipe.name); File dest = new File(destPath); // Create parent folders if needed File destDir = dest.getParentFile(); if (destDir.exists() == false){ boolean success = destDir.mkdirs(); if (!success){ throw new Exception("Destination folders could not be created"); } } ServerUtils.writeXML(dest, doc); pipe.absolutePath = destPath; pipe.lastModified = new Timestamp(dest.lastModified()); Database.insertPipefile(root.dirId, pipe); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { if ( ServletFileUpload.isMultipartContent( req ) ){ // Create a factory for disk-based file items FileItemFactory factory = new DiskFileItemFactory(); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload( factory ); try { @SuppressWarnings("unchecked") List<FileItem> items = upload.parseRequest( req ); // Go through the items and get the root and package String rootPath = ""; String packageName = ""; for ( FileItem item : items ){ if ( item.isFormField() ){ if (item.getFieldName().equals("root")){ rootPath = item.getString(); } else if (item.getFieldName().equals("packageName")){ packageName = item.getString(); } } } if (rootPath.equals("")){ res.getWriter().println("error :: Root directory has not been found."); return; } Directory root = Database.selectDirectory(rootPath); // Go through items and process urls and files for ( FileItem item : items ){ // Uploaded File if (item.isFormField() == false){ String filename = item.getName();; if( filename.equals("") == true ) continue; try { InputStream in = item.getInputStream(); //determine if it is pipefile or zipfile //if it is pipefile => feed directly to writeFile function //otherwise, uncompresse it first and then one-by-one feed to writeFile if( filename.endsWith(".zip") ) { ZipInputStream zip = new ZipInputStream(in); ZipEntry entry = zip.getNextEntry(); while(entry != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); if( baos != null ) { byte[] arr = new byte[4096]; int index = 0; while((index = zip.read(arr, 0, 4096)) != -1) { baos.write(arr, 0, index); } } InputStream is = new ByteArrayInputStream(baos.toByteArray()); writeFile(root, packageName, is); entry = zip.getNextEntry(); } zip.close(); } else { writeFile(root, packageName, in); } in.close(); } catch (Exception e) { res.getWriter().println("Failed to upload " + filename + ". " + e.getMessage() ); } } // URLs if (item.isFormField() && item.getFieldName().equals("urls") && item.getString().equals("") == false){ String urlListAsStr = item.getString(); String[] urlList = urlListAsStr.split("\n"); for (String urlStr : urlList){ try{ URL url = new URL(urlStr); URLConnection urlc = url.openConnection(); InputStream in = urlc.getInputStream(); writeFile(root, packageName, in); in.close(); } catch(Exception e){ res.getWriter().println("Failed to upload " + urlStr); return; } } } } } catch ( Exception e ){ res.getWriter().println("Error occurred while creating file. Error Message : " + e.getMessage()); } } } }