From 09f8d89c57e49a7ab6a11d03ab379d2d2eeaa16c Mon Sep 17 00:00:00 2001 From: Brett Porter Date: Mon, 1 Mar 2010 13:35:38 +0000 Subject: [PATCH] improve logging of failed uploads git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@917519 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva/webdav/ArchivaDavResource.java | 169 ++++++++++-------- 1 file changed, 91 insertions(+), 78 deletions(-) diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java index 23727d0b4..c2bfb75ed 100644 --- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java +++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/maven/archiva/webdav/ArchivaDavResource.java @@ -19,14 +19,6 @@ package org.apache.maven.archiva.webdav; * under the License. */ -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import javax.servlet.http.HttpServletResponse; - import org.apache.archiva.scheduler.ArchivaTaskScheduler; import org.apache.archiva.scheduler.repository.RepositoryArchivaTaskScheduler; import org.apache.archiva.scheduler.repository.RepositoryTask; @@ -67,6 +59,14 @@ import org.joda.time.format.ISODateTimeFormat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + /** */ public class ArchivaDavResource @@ -85,9 +85,9 @@ public class ArchivaDavResource private DavPropertySet properties = null; private LockManager lockManager; - + private final DavSession session; - + private String remoteAddr; private final ManagedRepositoryConfiguration repository; @@ -97,11 +97,11 @@ public class ArchivaDavResource private List auditListeners; private String principal; - + public static final String COMPLIANCE_CLASS = "1, 2"; - + private ArchivaTaskScheduler scheduler; - + private Logger log = LoggerFactory.getLogger( ArchivaDavResource.class ); public ArchivaDavResource( String localResource, String logicalResource, ManagedRepositoryConfiguration repository, @@ -109,25 +109,25 @@ public class ArchivaDavResource MimeTypes mimeTypes, List auditListeners, RepositoryArchivaTaskScheduler scheduler ) { - this.localResource = new File( localResource ); + this.localResource = new File( localResource ); this.logicalResource = logicalResource; this.locator = locator; this.factory = factory; this.session = session; - + // TODO: push into locator as well as moving any references out of the resource factory this.repository = repository; - + // TODO: these should be pushed into the repository layer, along with the physical file operations in this class - this.mimeTypes = mimeTypes; + this.mimeTypes = mimeTypes; this.auditListeners = auditListeners; this.scheduler = scheduler; } public ArchivaDavResource( String localResource, String logicalResource, ManagedRepositoryConfiguration repository, - String remoteAddr, String principal, DavSession session, ArchivaDavResourceLocator locator, - DavResourceFactory factory, MimeTypes mimeTypes, List auditListeners, - RepositoryArchivaTaskScheduler scheduler ) + String remoteAddr, String principal, DavSession session, + ArchivaDavResourceLocator locator, DavResourceFactory factory, MimeTypes mimeTypes, + List auditListeners, RepositoryArchivaTaskScheduler scheduler ) { this( localResource, logicalResource, repository, session, locator, factory, mimeTypes, auditListeners, scheduler ); @@ -190,12 +190,12 @@ public class ArchivaDavResource public void spool( OutputContext outputContext ) throws IOException { - if ( !isCollection()) + if ( !isCollection() ) { outputContext.setContentLength( localResource.length() ); outputContext.setContentType( mimeTypes.getMimeType( localResource.getName() ) ); } - + if ( !isCollection() && outputContext.hasStream() ) { FileInputStream is = null; @@ -210,7 +210,7 @@ public class ArchivaDavResource IOUtils.closeQuietly( is ); } } - else if (outputContext.hasStream()) + else if ( outputContext.hasStream() ) { IndexWriter writer = new IndexWriter( this, localResource, logicalResource ); writer.write( outputContext ); @@ -248,7 +248,7 @@ public class ArchivaDavResource return null; } - @SuppressWarnings("unchecked") + @SuppressWarnings( "unchecked" ) public MultiStatusResponse alterProperties( List changeList ) throws DavException { @@ -265,7 +265,8 @@ public class ArchivaDavResource { parentPath = "/"; } - DavResourceLocator parentloc = locator.getFactory().createResourceLocator( locator.getPrefix(), parentPath ); + DavResourceLocator parentloc = locator.getFactory().createResourceLocator( locator.getPrefix(), + parentPath ); try { parent = factory.createResource( parentloc, session ); @@ -300,34 +301,40 @@ public class ArchivaDavResource { IOUtils.closeQuietly( stream ); } - + // TODO: a bad deployment shouldn't delete an existing file - do we need to write to a temporary location first? if ( inputContext.getContentLength() != localFile.length() ) { FileUtils.deleteQuietly( localFile ); - - throw new DavException( HttpServletResponse.SC_BAD_REQUEST, "Content Header length was " + - inputContext.getContentLength() + " but was " + localFile.length() ); + + String msg = + "Content Header length was " + inputContext.getContentLength() + " but was " + localFile.length(); + log.debug( "Upload failed: " + msg ); + throw new DavException( HttpServletResponse.SC_BAD_REQUEST, msg ); } - - queueRepositoryTask( localFile ); - - log.debug( "File '" + resource.getDisplayName() + ( exists ? "' modified " : "' created ") + "(current user '" + this.principal + "')" ); - + + queueRepositoryTask( localFile ); + + log.debug( + "File '" + resource.getDisplayName() + ( exists ? "' modified " : "' created " ) + "(current user '" + + this.principal + "')" ); + triggerAuditEvent( resource, exists ? AuditEvent.MODIFY_FILE : AuditEvent.CREATE_FILE ); } else if ( !inputContext.hasStream() && isCollection() ) // New directory { localFile.mkdir(); - + log.debug( "Directory '" + resource.getDisplayName() + "' (current user '" + this.principal + "')" ); - + triggerAuditEvent( resource, AuditEvent.CREATE_DIR ); } else - { - throw new DavException( HttpServletResponse.SC_BAD_REQUEST, "Could not write member " + - resource.getResourcePath() + " at " + getResourcePath() ); + { + String msg = "Could not write member " + resource.getResourcePath() + " at " + getResourcePath() + + " as this is not a DAV collection"; + log.debug( msg ); + throw new DavException( HttpServletResponse.SC_BAD_REQUEST, msg ); } } @@ -343,10 +350,10 @@ public class ArchivaDavResource if ( !item.startsWith( HIDDEN_PATH_PREFIX ) ) { String path = locator.getResourcePath() + '/' + item; - DavResourceLocator resourceLocator = - locator.getFactory().createResourceLocator( locator.getPrefix(), path ); + DavResourceLocator resourceLocator = locator.getFactory().createResourceLocator( + locator.getPrefix(), path ); DavResource resource = factory.createResource( resourceLocator, session ); - + if ( resource != null ) { list.add( resource ); @@ -367,7 +374,7 @@ public class ArchivaDavResource throws DavException { File resource = checkDavResourceIsArchivaDavResource( member ).getLocalResource(); - + if ( resource.exists() ) { try @@ -387,7 +394,8 @@ public class ArchivaDavResource triggerAuditEvent( member, AuditEvent.REMOVE_FILE ); } - log.debug( ( resource.isDirectory() ? "Directory '" : "File '" ) + member.getDisplayName() + "' removed (current user '" + this.principal + "')" ); + log.debug( ( resource.isDirectory() ? "Directory '" : "File '" ) + member.getDisplayName() + + "' removed (current user '" + this.principal + "')" ); } catch ( IOException e ) { @@ -400,7 +408,8 @@ public class ArchivaDavResource } } - private void triggerAuditEvent( DavResource member, String event ) throws DavException + private void triggerAuditEvent( DavResource member, String event ) + throws DavException { String path = logicalResource + "/" + member.getDisplayName(); @@ -437,9 +446,9 @@ public class ArchivaDavResource triggerAuditEvent( remoteAddr, locator.getRepositoryId(), logicalResource, AuditEvent.MOVE_FILE ); } - + log.debug( ( isCollection() ? "Directory '" : "File '" ) + getLocalResource().getName() + "' moved to '" + - destination + "' (current user '" + this.principal + "')" ); + destination + "' (current user '" + this.principal + "')" ); } catch ( IOException e ) { @@ -476,7 +485,7 @@ public class ArchivaDavResource triggerAuditEvent( remoteAddr, locator.getRepositoryId(), logicalResource, AuditEvent.COPY_FILE ); } log.debug( ( isCollection() ? "Directory '" : "File '" ) + getLocalResource().getName() + "' copied to '" + - destination + "' (current user '" + this.principal + "')" ); + destination + "' (current user '" + this.principal + "')" ); } catch ( IOException e ) { @@ -486,41 +495,41 @@ public class ArchivaDavResource public boolean isLockable( Type type, Scope scope ) { - return Type.WRITE.equals(type) && Scope.EXCLUSIVE.equals(scope); + return Type.WRITE.equals( type ) && Scope.EXCLUSIVE.equals( scope ); } public boolean hasLock( Type type, Scope scope ) { - return getLock(type, scope) != null; + return getLock( type, scope ) != null; } public ActiveLock getLock( Type type, Scope scope ) { ActiveLock lock = null; - if (exists() && Type.WRITE.equals(type) && Scope.EXCLUSIVE.equals(scope)) + if ( exists() && Type.WRITE.equals( type ) && Scope.EXCLUSIVE.equals( scope ) ) { - lock = lockManager.getLock(type, scope, this); + lock = lockManager.getLock( type, scope, this ); } return lock; } public ActiveLock[] getLocks() { - ActiveLock writeLock = getLock(Type.WRITE, Scope.EXCLUSIVE); - return (writeLock != null) ? new ActiveLock[]{writeLock} : new ActiveLock[0]; + ActiveLock writeLock = getLock( Type.WRITE, Scope.EXCLUSIVE ); + return ( writeLock != null ) ? new ActiveLock[]{writeLock} : new ActiveLock[0]; } public ActiveLock lock( LockInfo lockInfo ) throws DavException { ActiveLock lock = null; - if (isLockable(lockInfo.getType(), lockInfo.getScope())) + if ( isLockable( lockInfo.getType(), lockInfo.getScope() ) ) { - lock = lockManager.createLock(lockInfo, this); + lock = lockManager.createLock( lockInfo, this ); } - else + else { - throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "Unsupported lock type or scope."); + throw new DavException( DavServletResponse.SC_PRECONDITION_FAILED, "Unsupported lock type or scope." ); } return lock; } @@ -528,15 +537,18 @@ public class ArchivaDavResource public ActiveLock refreshLock( LockInfo lockInfo, String lockToken ) throws DavException { - if (!exists()) { - throw new DavException(DavServletResponse.SC_NOT_FOUND); + if ( !exists() ) + { + throw new DavException( DavServletResponse.SC_NOT_FOUND ); } - ActiveLock lock = getLock(lockInfo.getType(), lockInfo.getScope()); - if (lock == null) { - throw new DavException(DavServletResponse.SC_PRECONDITION_FAILED, "No lock with the given type/scope present on resource " + getResourcePath()); + ActiveLock lock = getLock( lockInfo.getType(), lockInfo.getScope() ); + if ( lock == null ) + { + throw new DavException( DavServletResponse.SC_PRECONDITION_FAILED, + "No lock with the given type/scope present on resource " + getResourcePath() ); } - lock = lockManager.refreshLock(lockInfo, lockToken, this); + lock = lockManager.refreshLock( lockInfo, lockToken, this ); return lock; } @@ -544,18 +556,18 @@ public class ArchivaDavResource public void unlock( String lockToken ) throws DavException { - ActiveLock lock = getLock(Type.WRITE, Scope.EXCLUSIVE); - if (lock == null) + ActiveLock lock = getLock( Type.WRITE, Scope.EXCLUSIVE ); + if ( lock == null ) { - throw new DavException(HttpServletResponse.SC_PRECONDITION_FAILED); + throw new DavException( HttpServletResponse.SC_PRECONDITION_FAILED ); } - else if (lock.isLockedByToken(lockToken)) + else if ( lock.isLockedByToken( lockToken ) ) { - lockManager.releaseLock(lockToken, this); + lockManager.releaseLock( lockToken, this ); } else { - throw new DavException(DavServletResponse.SC_LOCKED); + throw new DavException( DavServletResponse.SC_LOCKED ); } } @@ -583,14 +595,14 @@ public class ArchivaDavResource { properties = new DavPropertySet(); } - + if ( properties != null ) { return properties; } DavPropertySet properties = new DavPropertySet(); - + // set (or reset) fundamental properties if ( getDisplayName() != null ) { @@ -620,9 +632,9 @@ public class ArchivaDavResource properties.add( new DefaultDavProperty( DavPropertyName.CREATIONDATE, modifiedDate ) ); properties.add( new DefaultDavProperty( DavPropertyName.GETCONTENTLENGTH, localResource.length() ) ); - + this.properties = properties; - + return properties; } @@ -647,9 +659,9 @@ public class ArchivaDavResource listener.auditEvent( event ); } } - + private void queueRepositoryTask( File localFile ) - { + { RepositoryTask task = new RepositoryTask(); task.setRepositoryId( repository.getId() ); task.setResourceFile( localFile ); @@ -662,8 +674,9 @@ public class ArchivaDavResource } catch ( TaskQueueException e ) { - log.error( "Unable to queue repository task to execute consumers on resource file ['" + - localFile.getName() + "']." ); + log.error( + "Unable to queue repository task to execute consumers on resource file ['" + localFile.getName() + + "']." ); } } } -- 2.39.5