/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.ambari.view.commons.hdfs; import com.sun.jersey.core.header.FormDataContentDisposition; import com.sun.jersey.multipart.FormDataParam; import org.apache.ambari.view.ViewContext; import org.apache.ambari.view.commons.exceptions.ServiceFormattedException; import org.apache.ambari.view.utils.hdfs.HdfsApi; import org.apache.hadoop.fs.FSDataOutputStream; import javax.ws.rs.Consumes; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * Upload service */ public class UploadService extends HdfsService { /** * Constructor * @param context View Context instance */ public UploadService(ViewContext context) { super(context); } /** * takes context and any extra custom properties that needs to be included into config * @param context * @param customProperties */ public UploadService(ViewContext context, Map<String, String> customProperties) { super(context, customProperties); } private void uploadFile(final String filePath, InputStream uploadedInputStream) throws IOException, InterruptedException { int read; byte[] chunk = new byte[1024]; FSDataOutputStream out = null; try { out = getApi().create(filePath, false); while ((read = uploadedInputStream.read(chunk)) != -1) { out.write(chunk, 0, read); } } finally { if (out != null) { out.close(); } } } /** * Upload file * @param uploadedInputStream file input stream * @param contentDisposition content disposition * @param path path * @return file status */ @PUT @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public Response uploadFile( @FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition contentDisposition, @FormDataParam("path") String path) { try { if (!path.endsWith("/")) path = path + "/"; String filePath = path + new String(contentDisposition.getFileName().getBytes("ISO8859-1"),"UTF-8"); uploadFile(filePath, uploadedInputStream); return Response.ok( getApi().fileStatusToJSON(getApi().getFileStatus(filePath))) .build(); } catch (WebApplicationException ex) { throw ex; } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex); } } /** * Upload zip and unpack * @param uploadedInputStream file input stream * @param contentDisposition content disposition * @param path path * @return files statuses * @throws IOException * @throws Exception */ @PUT @Path("/zip") @Consumes(MediaType.MULTIPART_FORM_DATA) @Produces(MediaType.APPLICATION_JSON) public Response uploadZip( @FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition contentDisposition, @FormDataParam("path") String path) { try { if (!path.endsWith("/")) path = path + "/"; ZipInputStream zip = new ZipInputStream(uploadedInputStream); ZipEntry ze = zip.getNextEntry(); HdfsApi api = getApi(); while (ze != null) { String filePath = path + ze.getName(); if (ze.isDirectory()) { api.mkdir(filePath); } else { uploadFile(filePath, zip); } ze = zip.getNextEntry(); } return Response.ok(getApi().fileStatusToJSON(api.listdir(path))).build(); } catch (WebApplicationException ex) { throw ex; } catch (Exception ex) { throw new ServiceFormattedException(ex.getMessage(), ex); } } }