Java tutorial
/* * Copyright 2010 LinkedIn, 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 azkaban.web; import azkaban.app.AzkabanApplication; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Map; import java.util.zip.ZipFile; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; import azkaban.app.JobManager; import azkaban.common.utils.Utils; import org.apache.log4j.Logger; /** * Deploy and undeploy jobs * * @author jkreps * */ public class JobManagerServlet extends AbstractAzkabanServlet { private static final long serialVersionUID = 1; private static final int DEFAULT_UPLOAD_DISK_SPOOL_SIZE = 20 * 1024 * 1024; private static final Logger log = Logger.getLogger(JobManagerServlet.class); private MultipartParser _multipartParser; private String _tempDir; @Override public void init(ServletConfig config) throws ServletException { super.init(config); this._multipartParser = new MultipartParser(DEFAULT_UPLOAD_DISK_SPOOL_SIZE); _tempDir = this.getApplication().getTempDirectory(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().write("Hello!"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPut(request, response); } @Override protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if (!ServletFileUpload.isMultipartContent(request)) throw new ServletException("No job file found!"); Map<String, Object> params = this._multipartParser.parseMultipart(request); try { final AzkabanApplication app = getApplication(); final JobManager jobManager = app.getJobManager(); FileItem item = (FileItem) params.get("file"); String deployPath = (String) params.get("path"); File jobDir = extractFile(item); jobManager.deployJobDir(jobDir.getAbsolutePath(), deployPath); } catch (Exception e) { log.info("Installation Failed.", e); String redirectError = (String) params.get("redirect_error"); setMessagedUrl(response, redirectError, "Installation Failed: " + e.getLocalizedMessage()); return; } String redirectSuccess = (String) params.get("redirect_success"); setMessagedUrl(response, redirectSuccess, "Installation Succeeded"); } private File extractFile(FileItem item) throws IOException, ServletException { final String contentType = item.getContentType(); if (contentType.startsWith("application/zip")) { return unzipFile(item); } if (contentType.startsWith("application/x-tar")) { return untarFile(item); } throw new ServletException(String.format("Unsupported file type[%s].", contentType)); } private void setMessagedUrl(HttpServletResponse response, String redirectUrl, String message) throws IOException { String url = redirectUrl + "/" + message; response.sendRedirect(response.encodeRedirectURL(url)); } private File unzipFile(FileItem item) throws ServletException, IOException { File temp = File.createTempFile("job-temp", ".zip"); temp.deleteOnExit(); OutputStream out = new BufferedOutputStream(new FileOutputStream(temp)); IOUtils.copy(item.getInputStream(), out); out.close(); ZipFile zipfile = new ZipFile(temp); File unzipped = Utils.createTempDir(new File(_tempDir)); Utils.unzip(zipfile, unzipped); temp.delete(); return unzipped; } private File untarFile(FileItem item) throws IOException, ServletException { File extractionPath = Utils.createTempDir(new File(_tempDir)); if (true) throw new ServletException("Unsupported file type [tar]."); return extractionPath; } }