From 8312f1e85a120629eb5f284f5a3c85e75a0e4472 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Fri, 30 Mar 2012 16:47:34 +0000 Subject: [PATCH] cleanup upload rest service git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1307530 13f79535-47bb-0310-9956-ffa450edef68 --- .../api/DefaultFileUploadService.java | 103 +++++++++--------- .../ui/services/api/FileUploadService.java | 23 ++-- .../ui/services/model/FileMetadata.java | 72 +++++++++++- .../webapp/js/archiva/artifacts-management.js | 26 ++++- .../archiva/artifacts-management.html | 4 +- 5 files changed, 160 insertions(+), 68 deletions(-) diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java index 9e114f0f3..5e06c7a67 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java @@ -30,12 +30,14 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * @author Olivier Lamy @@ -49,28 +51,11 @@ public class DefaultFileUploadService @Context private HttpServletRequest httpServletRequest; - @Context - private HttpServletResponse httpServletResponse; - - public FileMetadata post( String groupId, String artifactId, String version, String packaging, String classifier, - String repositoryId, String generatePom ) - throws ArchivaRestServiceException + private String getStringValue( MultipartBody multipartBody, String attachmentId ) + throws IOException { - log.info( "uploading file:" + groupId + ":" + artifactId + ":" + version ); - try - { - File file = File.createTempFile( "upload-artifact", "tmp" ); - file.deleteOnExit(); - IOUtils.copy( httpServletRequest.getInputStream(), new FileOutputStream( file ) ); - FileMetadata fileMetadata = new FileMetadata( "thefile", file.length(), "theurl" ); - fileMetadata.setDeleteUrl( file.getName() ); - return fileMetadata; - } - catch ( IOException e ) - { - throw new ArchivaRestServiceException( e.getMessage(), - Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() ); - } + Attachment attachment = multipartBody.getAttachment( attachmentId ); + return attachment == null ? "" : IOUtils.toString( attachment.getDataHandler().getInputStream() ); } public FileMetadata post( MultipartBody multipartBody ) @@ -79,40 +64,31 @@ public class DefaultFileUploadService try { - String groupId = - IOUtils.toString( multipartBody.getAttachment( "groupId" ).getDataHandler().getInputStream() ); - String artifactId = - IOUtils.toString( multipartBody.getAttachment( "artifactId" ).getDataHandler().getInputStream() ); - String version = - IOUtils.toString( multipartBody.getAttachment( "version" ).getDataHandler().getInputStream() ); - String packaging = - IOUtils.toString( multipartBody.getAttachment( "packaging" ).getDataHandler().getInputStream() ); - - String repositoryId = - IOUtils.toString( multipartBody.getAttachment( "repositoryId" ).getDataHandler().getInputStream() ); - - Attachment generatePomAttachment = multipartBody.getAttachment( "generatePom" ); - boolean generatePom = BooleanUtils.toBoolean( generatePomAttachment == null - ? Boolean.FALSE.toString() - : IOUtils.toString( - generatePomAttachment.getDataHandler().getInputStream() ) ); - - String classifier = - IOUtils.toString( multipartBody.getAttachment( "classifier" ).getDataHandler().getInputStream() ); - - Attachment pomFileAttachment = multipartBody.getAttachment( "pomFile" ); - - boolean pomFile = BooleanUtils.toBoolean( pomFileAttachment == null - ? Boolean.FALSE.toString() - : IOUtils.toString( - pomFileAttachment.getDataHandler().getInputStream() ) ); - - log.info( "uploading file:" + groupId + ":" + artifactId + ":" + version ); + String groupId = getStringValue( multipartBody, "groupId" ); + + String artifactId = getStringValue( multipartBody, "artifactId" ); + + String version = getStringValue( multipartBody, "version" ); + + String packaging = getStringValue( multipartBody, "packaging" ); + + String repositoryId = getStringValue( multipartBody, "repositoryId" ); + + boolean generatePom = BooleanUtils.toBoolean( getStringValue( multipartBody, "generatePom" ) ); + + String classifier = getStringValue( multipartBody, "classifier" ); + boolean pomFile = BooleanUtils.toBoolean( getStringValue( multipartBody, "pomFile" ) ); + Attachment file = multipartBody.getAttachment( "files[]" ); + + //Content-Disposition: form-data; name="files[]"; filename="org.apache.karaf.features.command-2.2.2.jar" + String fileName = file.getContentDisposition().getParameter( "filename" ); + File tmpFile = File.createTempFile( "upload-artifact", "tmp" ); tmpFile.deleteOnExit(); IOUtils.copy( file.getDataHandler().getInputStream(), new FileOutputStream( tmpFile ) ); - FileMetadata fileMetadata = new FileMetadata( "thefile", tmpFile.length(), "theurl" ); + FileMetadata fileMetadata = new FileMetadata( fileName, tmpFile.length(), "theurl" ); + fileMetadata.setServerFileName( tmpFile.getName() ); fileMetadata.setGroupId( groupId ); fileMetadata.setArtifactId( artifactId ); fileMetadata.setVersion( version ); @@ -123,6 +99,18 @@ public class DefaultFileUploadService fileMetadata.setDeleteUrl( tmpFile.getName() ); fileMetadata.setRepositoryId( repositoryId ); fileMetadata.setPomFile( pomFile ); + + log.info( "uploading file:{}", fileMetadata ); + + List fileMetadatas = + (List) httpServletRequest.getSession().getAttribute( FILES_SESSION_KEY ); + + if ( fileMetadatas == null ) + { + fileMetadatas = new ArrayList( 1 ); + } + fileMetadatas.add( fileMetadata ); + httpServletRequest.getSession().setAttribute( FILES_SESSION_KEY, fileMetadatas ); return fileMetadata; } catch ( IOException e ) @@ -138,10 +126,21 @@ public class DefaultFileUploadService { File file = new File( SystemUtils.getJavaIoTmpDir(), fileName ); log.debug( "delete file:{},exists:{}", file.getPath(), file.exists() ); + boolean removed = getSessionFileMetadatas().remove( new FileMetadata( fileName ) ); if ( file.exists() ) { return file.delete(); } return Boolean.FALSE; } + + public List getSessionFileMetadatas() + throws ArchivaRestServiceException + { + List fileMetadatas = + (List) httpServletRequest.getSession().getAttribute( FILES_SESSION_KEY ); + + return fileMetadatas == null ? Collections.emptyList() : fileMetadatas; + } + } diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java index b3823998f..269a2eb72 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java @@ -19,17 +19,20 @@ package org.apache.archiva.webapp.ui.services.api; */ import org.apache.archiva.rest.api.services.ArchivaRestServiceException; +import org.apache.archiva.security.common.ArchivaRoleConstants; import org.apache.archiva.webapp.ui.services.model.FileMetadata; import org.apache.cxf.jaxrs.ext.multipart.MultipartBody; import org.codehaus.plexus.redback.authorization.RedbackAuthorization; 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.Produces; import javax.ws.rs.core.MediaType; +import java.util.List; /** * @author Olivier Lamy @@ -39,21 +42,27 @@ import javax.ws.rs.core.MediaType; public interface FileUploadService { + String FILES_SESSION_KEY = FileUploadService.class.getName() + "files_session_key"; + @POST @Consumes( MediaType.MULTIPART_FORM_DATA ) @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) - @RedbackAuthorization( noRestriction = true ) - //FileMetadata post( @FormParam( "groupId" ) String groupId, @FormParam( "artifactId" ) String artifactId, - // @FormParam( "version" ) String version, @FormParam( "packaging" ) String packaging, - // @FormParam( "classifier" ) String classifier, @FormParam( "repositoryId" ) String repositoryId, - // @FormParam( "generatePom" ) String generatePom ) - FileMetadata post( MultipartBody multipartBody )// @Multipart( value = "files[]", type = "*/*" ) Attachment file ) + @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) + FileMetadata post( MultipartBody multipartBody ) throws ArchivaRestServiceException; @Path( "{fileName}" ) @DELETE @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) - @RedbackAuthorization( noRestriction = true ) + @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) Boolean deleteFile( @PathParam( "fileName" ) String fileName ) throws ArchivaRestServiceException; + + + @Path( "sessionFileMetadatas" ) + @GET + @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } ) + @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD ) + List getSessionFileMetadatas() + throws ArchivaRestServiceException; } diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java index 864d9b7e4..ad5502b23 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java @@ -31,6 +31,8 @@ public class FileMetadata { private String name; + private String serverFileName; + private long size; private String url; @@ -62,9 +64,14 @@ public class FileMetadata // no op } - public FileMetadata( String filename, long size, String url ) + public FileMetadata( String serverFileName ) { - this.name = filename; + this.serverFileName = serverFileName; + } + + public FileMetadata( String name, long size, String url ) + { + this.name = name; this.size = size; this.url = url; this.deleteUrl = url; @@ -211,4 +218,65 @@ public class FileMetadata { this.pomFile = pomFile; } + + public String getServerFileName() + { + return serverFileName; + } + + public void setServerFileName( String serverFileName ) + { + this.serverFileName = serverFileName; + } + + @Override + public boolean equals( Object o ) + { + if ( this == o ) + { + return true; + } + if ( !( o instanceof FileMetadata ) ) + { + return false; + } + + FileMetadata that = (FileMetadata) o; + + if ( !serverFileName.equals( that.serverFileName ) ) + { + return false; + } + + return true; + } + + @Override + public int hashCode() + { + return serverFileName.hashCode(); + } + + @Override + public String toString() + { + final StringBuilder sb = new StringBuilder(); + sb.append( "FileMetadata" ); + sb.append( "{name='" ).append( name ).append( '\'' ); + sb.append( ", size=" ).append( size ); + sb.append( ", url='" ).append( url ).append( '\'' ); + sb.append( ", deleteUrl='" ).append( deleteUrl ).append( '\'' ); + sb.append( ", deleteType='" ).append( deleteType ).append( '\'' ); + sb.append( ", errorKey='" ).append( errorKey ).append( '\'' ); + sb.append( ", groupId='" ).append( groupId ).append( '\'' ); + sb.append( ", artifactId='" ).append( artifactId ).append( '\'' ); + sb.append( ", version='" ).append( version ).append( '\'' ); + sb.append( ", packaging='" ).append( packaging ).append( '\'' ); + sb.append( ", generatePom=" ).append( generatePom ); + sb.append( ", classifier='" ).append( classifier ).append( '\'' ); + sb.append( ", repositoryId='" ).append( repositoryId ).append( '\'' ); + sb.append( ", pomFile=" ).append( pomFile ); + sb.append( '}' ); + return sb.toString(); + } } diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js index 3fbffdad6..ff0dcbd48 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js @@ -34,30 +34,46 @@ define("archiva.artifacts-management",["jquery","i18n","order!utils","order!jque this.packaging=ko.observable(); this.generatePom=ko.observable(); + saveArtifacts=function(){ + $.log("saveArtifacts"); + } + } displayUploadArtifact=function(){ var mainContent=$("#main-content"); mainContent.html(mediumSpinnerImg()); + mainContent.html($("#file-upload-screen" ).html()); $.ajax("restServices/archivaServices/browseService/userRepositories", { type: "GET", dataType: 'json', success: function(data) { - mainContent.html($("#file-upload-tmpl" ).tmpl({managedRepositories: data})); var artifactUploadViewModel=new ArtifactUploadViewModel(data); ko.applyBindings(artifactUploadViewModel,mainContent.find("#file-upload-main" ).get(0)); - mainContent.find("#fileupload-save-files" ).on("click",function(){ - $.log("fileupload-save-files click"); - }); $('#fileupload').fileupload({ add: function (e, data) { - data.timeStamp = $.now(); + data.formData = { + groupId: artifactUploadViewModel.groupId(), + artifactId: artifactUploadViewModel.artifactId(), + version: artifactUploadViewModel.version(), + packaging: artifactUploadViewModel.packaging(), + generatePom: artifactUploadViewModel.generatePom(), + repositoryId: artifactUploadViewModel.repositoryId() + }; $.log("fileupload add file"); $.blueimpUI.fileupload.prototype.options.add.call(this, e, data); } } ); + $('#fileupload').bind('fileuploadsubmit', function (e, data) { + var pomFile = data.context.find('#pomFile' ).val(); + var classifier = data.context.find('#classifier' ).val(); + + $.log("pomFile:"+pomFile+",classifier:"+classifier); + data.formData.pomFile = pomFile; + data.formData.classifier = classifier; + }); } }); diff --git a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/artifacts-management.html b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/artifacts-management.html index 7bff1cec1..a759f0ff6 100644 --- a/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/artifacts-management.html +++ b/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/templates/archiva/artifacts-management.html @@ -1,5 +1,5 @@