You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ol...@apache.org on 2012/03/31 17:35:00 UTC
svn commit: r1307829 - in /archiva/trunk/archiva-modules/archiva-web:
archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/
archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/
archiva-webapp-js...
Author: olamy
Date: Sat Mar 31 15:35:00 2012
New Revision: 1307829
URL: http://svn.apache.org/viewvc?rev=1307829&view=rev
Log:
file upload server implementation first code need some cleanup
Modified:
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java
archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-api/src/main/java/org/apache/archiva/rest/api/services/RepositoriesService.java Sat Mar 31 15:35:00 2012
@@ -115,7 +115,7 @@ public interface RepositoriesService
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN } )
@RedbackAuthorization( noPermission = true )
/**
- * permissions are checked in impl
+ * <b>permissions are checked in impl</b>
* @since 1.4-M2
*/
Boolean deleteArtifact( @QueryParam( "" ) Artifact artifact, @QueryParam( "repositoryId" ) String repositoryId )
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/AbstractRestService.java Sat Mar 31 15:35:00 2012
@@ -19,6 +19,7 @@ package org.apache.archiva.rest.services
*/
import org.apache.archiva.admin.model.AuditInformation;
+import org.apache.archiva.audit.AuditEvent;
import org.apache.archiva.audit.AuditListener;
import org.apache.archiva.metadata.repository.RepositorySessionFactory;
import org.apache.archiva.security.AccessDeniedException;
@@ -143,4 +144,19 @@ public abstract class AbstractRestServic
}
return beans;
}
+
+ protected void triggerAuditEvent( String repositoryId, String filePath, String action )
+ {
+ AuditEvent auditEvent = new AuditEvent();
+ auditEvent.setAction( action );
+ auditEvent.setRepositoryId( repositoryId );
+ auditEvent.setResource( filePath );
+ AuditInformation auditInformation = getAuditInformation();
+ auditEvent.setUserId( auditInformation.getUser() == null ? "" : auditInformation.getUser().getUsername() );
+ auditEvent.setRemoteIP( auditInformation.getRemoteAddr() );
+ for ( AuditListener auditListener : getAuditListeners() )
+ {
+ auditListener.auditEvent( auditEvent );
+ }
+ }
}
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rest/archiva-rest-services/src/main/java/org/apache/archiva/rest/services/DefaultRepositoriesService.java Sat Mar 31 15:35:00 2012
@@ -871,21 +871,6 @@ public class DefaultRepositoriesService
checksum.fixChecksums( algorithms );
}
- protected void triggerAuditEvent( String repositoryId, String filePath, String action )
- {
- AuditEvent auditEvent = new AuditEvent();
- auditEvent.setAction( action );
- auditEvent.setRepositoryId( repositoryId );
- auditEvent.setResource( filePath );
- AuditInformation auditInformation = getAuditInformation();
- auditEvent.setUserId( auditInformation.getUser() == null ? "" : auditInformation.getUser().getUsername() );
- auditEvent.setRemoteIP( auditInformation.getRemoteAddr() );
- for ( AuditListener auditListener : getAuditListeners() )
- {
- auditListener.auditEvent( auditEvent );
- }
- }
-
public ManagedRepositoryAdmin getManagedRepositoryAdmin()
{
return managedRepositoryAdmin;
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/DefaultFileUploadService.java Sat Mar 31 15:35:00 2012
@@ -18,32 +18,76 @@ package org.apache.archiva.webapp.ui.ser
* under the License.
*/
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.apache.archiva.admin.model.RepositoryAdminException;
+import org.apache.archiva.admin.model.admin.ArchivaAdministration;
+import org.apache.archiva.admin.model.beans.ManagedRepository;
+import org.apache.archiva.admin.model.managed.ManagedRepositoryAdmin;
+import org.apache.archiva.audit.AuditEvent;
+import org.apache.archiva.checksum.ChecksumAlgorithm;
+import org.apache.archiva.checksum.ChecksummedFile;
+import org.apache.archiva.common.utils.VersionComparator;
+import org.apache.archiva.common.utils.VersionUtil;
+import org.apache.archiva.maven2.metadata.MavenMetadataReader;
+import org.apache.archiva.model.ArchivaRepositoryMetadata;
+import org.apache.archiva.model.ArtifactReference;
+import org.apache.archiva.model.SnapshotVersion;
+import org.apache.archiva.repository.ManagedRepositoryContent;
+import org.apache.archiva.repository.RepositoryContentFactory;
+import org.apache.archiva.repository.RepositoryException;
+import org.apache.archiva.repository.RepositoryNotFoundException;
+import org.apache.archiva.repository.metadata.MetadataTools;
+import org.apache.archiva.repository.metadata.RepositoryMetadataException;
+import org.apache.archiva.repository.metadata.RepositoryMetadataWriter;
import org.apache.archiva.rest.api.services.ArchivaRestServiceException;
+import org.apache.archiva.rest.services.AbstractRestService;
+import org.apache.archiva.scheduler.ArchivaTaskScheduler;
+import org.apache.archiva.scheduler.repository.RepositoryTask;
import org.apache.archiva.webapp.ui.services.model.FileMetadata;
+import org.apache.archiva.xml.XMLException;
+import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.BooleanUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
+import org.codehaus.plexus.taskqueue.TaskQueueException;
+import org.codehaus.plexus.util.IOUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+import javax.inject.Named;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
import java.util.List;
+import java.util.TimeZone;
/**
* @author Olivier Lamy
*/
@Service( "fileUploadService#rest" )
public class DefaultFileUploadService
+ extends AbstractRestService
implements FileUploadService
{
private Logger log = LoggerFactory.getLogger( getClass() );
@@ -51,6 +95,21 @@ public class DefaultFileUploadService
@Context
private HttpServletRequest httpServletRequest;
+ @Inject
+ private ManagedRepositoryAdmin managedRepositoryAdmin;
+
+ @Inject
+ private RepositoryContentFactory repositoryFactory;
+
+ @Inject
+ private ArchivaAdministration archivaAdministration;
+
+ private ChecksumAlgorithm[] algorithms = new ChecksumAlgorithm[]{ ChecksumAlgorithm.SHA1, ChecksumAlgorithm.MD5 };
+
+ @Inject
+ @Named( value = "archivaTaskScheduler#repository" )
+ private ArchivaTaskScheduler scheduler;
+
private String getStringValue( MultipartBody multipartBody, String attachmentId )
throws IOException
{
@@ -72,10 +131,6 @@ public class DefaultFileUploadService
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" ) );
@@ -88,16 +143,14 @@ public class DefaultFileUploadService
tmpFile.deleteOnExit();
IOUtils.copy( file.getDataHandler().getInputStream(), new FileOutputStream( tmpFile ) );
FileMetadata fileMetadata = new FileMetadata( fileName, tmpFile.length(), "theurl" );
- fileMetadata.setServerFileName( tmpFile.getName() );
+ fileMetadata.setServerFileName( tmpFile.getPath() );
fileMetadata.setGroupId( groupId );
fileMetadata.setArtifactId( artifactId );
fileMetadata.setVersion( version );
fileMetadata.setVersion( version );
fileMetadata.setPackaging( packaging );
- fileMetadata.setGeneratePom( generatePom );
fileMetadata.setClassifier( classifier );
fileMetadata.setDeleteUrl( tmpFile.getName() );
- fileMetadata.setRepositoryId( repositoryId );
fileMetadata.setPomFile( pomFile );
log.info( "uploading file:{}", fileMetadata );
@@ -143,4 +196,443 @@ public class DefaultFileUploadService
return fileMetadatas == null ? Collections.<FileMetadata>emptyList() : fileMetadatas;
}
+ public Boolean save( String repositoryId, final String groupId, final String artifactId, final boolean generatePom )
+ throws ArchivaRestServiceException
+ {
+ List<FileMetadata> fileMetadatas =
+ (List<FileMetadata>) httpServletRequest.getSession().getAttribute( FILES_SESSION_KEY );
+ if ( fileMetadatas == null || fileMetadatas.isEmpty() )
+ {
+ return Boolean.FALSE;
+ }
+ // get from the session file with groupId/artifactId
+
+ Iterable<FileMetadata> filesToAdd = Iterables.filter( fileMetadatas, new Predicate<FileMetadata>()
+ {
+ public boolean apply( FileMetadata fileMetadata )
+ {
+ if ( fileMetadata == null )
+ {
+ return false;
+ }
+ return StringUtils.equals( groupId, fileMetadata.getGroupId() ) && StringUtils.equals( artifactId,
+ fileMetadata.getArtifactId() )
+ && !fileMetadata.isPomFile();
+ }
+ } );
+ Iterator<FileMetadata> iterator = filesToAdd.iterator();
+ boolean pomGenerated = false;
+ while ( iterator.hasNext() )
+ {
+ FileMetadata fileMetadata = iterator.next();
+ log.debug( "fileToAdd: {}", fileMetadata );
+ saveFile( repositoryId, fileMetadata, generatePom && !pomGenerated );
+ pomGenerated = true;
+ }
+
+ filesToAdd = Iterables.filter( fileMetadatas, new Predicate<FileMetadata>()
+ {
+ public boolean apply( @Nullable FileMetadata fileMetadata )
+ {
+ return fileMetadata.isPomFile();
+ }
+ } );
+
+ iterator = filesToAdd.iterator();
+ while ( iterator.hasNext() )
+ {
+ FileMetadata fileMetadata = iterator.next();
+ log.debug( "fileToAdd: {}", fileMetadata );
+ savePomFile( repositoryId, fileMetadata );
+ }
+
+ return Boolean.TRUE;
+ }
+
+ protected void savePomFile( String repositoryId, FileMetadata fileMetadata )
+ throws ArchivaRestServiceException
+ {
+
+ try
+ {
+ boolean fixChecksums =
+ !( archivaAdministration.getKnownContentConsumers().contains( "create-missing-checksums" ) );
+
+ ManagedRepository repoConfig = managedRepositoryAdmin.getManagedRepository( repositoryId );
+
+ ArtifactReference artifactReference = new ArtifactReference();
+ artifactReference.setArtifactId( fileMetadata.getArtifactId() );
+ artifactReference.setGroupId( fileMetadata.getGroupId() );
+ artifactReference.setVersion( fileMetadata.getVersion() );
+ artifactReference.setClassifier( fileMetadata.getClassifier() );
+ artifactReference.setType( fileMetadata.getPackaging() );
+
+ ManagedRepositoryContent repository = repositoryFactory.getManagedRepositoryContent( repositoryId );
+
+ String artifactPath = repository.toPath( artifactReference );
+
+ int lastIndex = artifactPath.lastIndexOf( '/' );
+
+ String path = artifactPath.substring( 0, lastIndex );
+ File targetPath = new File( repoConfig.getLocation(), path );
+
+ String pomFilename = artifactPath.substring( lastIndex + 1 );
+ if ( StringUtils.isNotEmpty( fileMetadata.getClassifier() ) )
+ {
+ pomFilename = StringUtils.remove( pomFilename, "-" + fileMetadata.getClassifier() );
+ }
+ pomFilename = FilenameUtils.removeExtension( pomFilename ) + ".pom";
+
+ copyFile( new File( fileMetadata.getServerFileName() ), targetPath, pomFilename, fixChecksums );
+ triggerAuditEvent( repoConfig.getId(), path + "/" + pomFilename, AuditEvent.UPLOAD_FILE );
+ queueRepositoryTask( repoConfig.getId(), new File( targetPath, pomFilename ) );
+ }
+ catch ( IOException ie )
+ {
+ throw new ArchivaRestServiceException( "Error encountered while uploading pom file: " + ie.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ catch ( RepositoryException rep )
+ {
+ throw new ArchivaRestServiceException( "Repository exception: " + rep.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ catch ( RepositoryAdminException e )
+ {
+ throw new ArchivaRestServiceException( "RepositoryAdmin exception: " + e.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ }
+
+ protected void saveFile( String repositoryId, FileMetadata fileMetadata, boolean generatePom )
+ throws ArchivaRestServiceException
+ {
+ try
+ {
+
+ ManagedRepository repoConfig = managedRepositoryAdmin.getManagedRepository( repositoryId );
+
+ ArtifactReference artifactReference = new ArtifactReference();
+ artifactReference.setArtifactId( fileMetadata.getArtifactId() );
+ artifactReference.setGroupId( fileMetadata.getGroupId() );
+ artifactReference.setVersion( fileMetadata.getVersion() );
+ artifactReference.setClassifier( fileMetadata.getClassifier() );
+ artifactReference.setType( fileMetadata.getPackaging() );
+
+ ManagedRepositoryContent repository = repositoryFactory.getManagedRepositoryContent( repositoryId );
+
+ String artifactPath = repository.toPath( artifactReference );
+
+ int lastIndex = artifactPath.lastIndexOf( '/' );
+
+ String path = artifactPath.substring( 0, lastIndex );
+ File targetPath = new File( repoConfig.getLocation(), path );
+
+ log.debug( "artifactPath: {} found targetPath: {}", artifactPath, targetPath );
+
+ Date lastUpdatedTimestamp = Calendar.getInstance().getTime();
+ int newBuildNumber = -1;
+ String timestamp = null;
+
+ File versionMetadataFile = new File( targetPath, MetadataTools.MAVEN_METADATA );
+ ArchivaRepositoryMetadata versionMetadata = getMetadata( versionMetadataFile );
+
+ if ( VersionUtil.isSnapshot( fileMetadata.getVersion() ) )
+ {
+ TimeZone timezone = TimeZone.getTimeZone( "UTC" );
+ DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
+ fmt.setTimeZone( timezone );
+ timestamp = fmt.format( lastUpdatedTimestamp );
+ if ( versionMetadata.getSnapshotVersion() != null )
+ {
+ newBuildNumber = versionMetadata.getSnapshotVersion().getBuildNumber() + 1;
+ }
+ else
+ {
+ newBuildNumber = 1;
+ }
+ }
+
+ if ( !targetPath.exists() )
+ {
+ targetPath.mkdirs();
+ }
+
+ String filename = artifactPath.substring( lastIndex + 1 );
+ if ( VersionUtil.isSnapshot( fileMetadata.getVersion() ) )
+ {
+ filename = filename.replaceAll( "SNAPSHOT", timestamp + "-" + newBuildNumber );
+ }
+
+ boolean fixChecksums =
+ !( archivaAdministration.getKnownContentConsumers().contains( "create-missing-checksums" ) );
+
+ try
+ {
+ File targetFile = new File( targetPath, filename );
+ if ( targetFile.exists() && !VersionUtil.isSnapshot( fileMetadata.getVersion() )
+ && repoConfig.isBlockRedeployments() )
+ {
+ throw new ArchivaRestServiceException(
+ "Overwriting released artifacts in repository '" + repoConfig.getId() + "' is not allowed.",
+ Response.Status.BAD_REQUEST.getStatusCode() );
+ }
+ else
+ {
+ copyFile( new File( fileMetadata.getServerFileName() ), targetPath, filename, fixChecksums );
+ triggerAuditEvent( repository.getId(), path + "/" + filename, AuditEvent.UPLOAD_FILE );
+ queueRepositoryTask( repository.getId(), targetFile );
+ }
+ }
+ catch ( IOException ie )
+ {
+ throw new ArchivaRestServiceException(
+ "Overwriting released artifacts in repository '" + repoConfig.getId() + "' is not allowed.",
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+
+ if ( generatePom )
+ {
+ String pomFilename = filename;
+ if ( StringUtils.isNotEmpty( fileMetadata.getClassifier() ) )
+ {
+ pomFilename = StringUtils.remove( pomFilename, "-" + fileMetadata.getClassifier() );
+ }
+ pomFilename = FilenameUtils.removeExtension( pomFilename ) + ".pom";
+
+ try
+ {
+ File generatedPomFile = createPom( targetPath, pomFilename, fileMetadata );
+ triggerAuditEvent( repoConfig.getId(), path + "/" + pomFilename, AuditEvent.UPLOAD_FILE );
+ if ( fixChecksums )
+ {
+ fixChecksums( generatedPomFile );
+ }
+ queueRepositoryTask( repoConfig.getId(), generatedPomFile );
+ }
+ catch ( IOException ie )
+ {
+ throw new ArchivaRestServiceException(
+ "Error encountered while writing pom file: " + ie.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ }
+
+ // explicitly update only if metadata-updater consumer is not enabled!
+ if ( !archivaAdministration.getKnownContentConsumers().contains( "metadata-updater" ) )
+ {
+ updateProjectMetadata( targetPath.getAbsolutePath(), lastUpdatedTimestamp, timestamp, newBuildNumber,
+ fixChecksums, fileMetadata );
+
+ if ( VersionUtil.isSnapshot( fileMetadata.getVersion() ) )
+ {
+ updateVersionMetadata( versionMetadata, versionMetadataFile, lastUpdatedTimestamp, timestamp,
+ newBuildNumber, fixChecksums, fileMetadata );
+ }
+ }
+ }
+ catch ( RepositoryNotFoundException re )
+ {
+ throw new ArchivaRestServiceException( "Target repository cannot be found: " + re.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ catch ( RepositoryException rep )
+ {
+ throw new ArchivaRestServiceException( "Repository exception: " + rep.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ catch ( RepositoryAdminException e )
+ {
+ throw new ArchivaRestServiceException( "RepositoryAdmin exception: " + e.getMessage(),
+ Response.Status.INTERNAL_SERVER_ERROR.getStatusCode() );
+ }
+ }
+
+ private ArchivaRepositoryMetadata getMetadata( File metadataFile )
+ throws RepositoryMetadataException
+ {
+ ArchivaRepositoryMetadata metadata = new ArchivaRepositoryMetadata();
+ if ( metadataFile.exists() )
+ {
+ try
+ {
+ metadata = MavenMetadataReader.read( metadataFile );
+ }
+ catch ( XMLException e )
+ {
+ throw new RepositoryMetadataException( e.getMessage(), e );
+ }
+ }
+ return metadata;
+ }
+
+ private File createPom( File targetPath, String filename, FileMetadata fileMetadata )
+ throws IOException
+ {
+ Model projectModel = new Model();
+ projectModel.setModelVersion( "4.0.0" );
+ projectModel.setGroupId( fileMetadata.getGroupId() );
+ projectModel.setArtifactId( fileMetadata.getArtifactId() );
+ projectModel.setVersion( fileMetadata.getVersion() );
+ projectModel.setPackaging( fileMetadata.getPackaging() );
+
+ File pomFile = new File( targetPath, filename );
+ MavenXpp3Writer writer = new MavenXpp3Writer();
+ FileWriter w = new FileWriter( pomFile );
+ try
+ {
+ writer.write( w, projectModel );
+ }
+ finally
+ {
+ IOUtil.close( w );
+ }
+
+ return pomFile;
+ }
+
+ private void fixChecksums( File file )
+ {
+ ChecksummedFile checksum = new ChecksummedFile( file );
+ checksum.fixChecksums( algorithms );
+ }
+
+ private void queueRepositoryTask( String repositoryId, File localFile )
+ {
+ RepositoryTask task = new RepositoryTask();
+ task.setRepositoryId( repositoryId );
+ task.setResourceFile( localFile );
+ task.setUpdateRelatedArtifacts( true );
+ task.setScanAll( false );
+
+ try
+ {
+ scheduler.queueTask( task );
+ }
+ catch ( TaskQueueException e )
+ {
+ log.error( "Unable to queue repository task to execute consumers on resource file ['" + localFile.getName()
+ + "']." );
+ }
+ }
+
+ private void copyFile( File sourceFile, File targetPath, String targetFilename, boolean fixChecksums )
+ throws IOException
+ {
+ FileOutputStream out = new FileOutputStream( new File( targetPath, targetFilename ) );
+ FileInputStream input = new FileInputStream( sourceFile );
+
+ try
+ {
+ IOUtils.copy( input, out );
+ }
+ finally
+ {
+ out.close();
+ input.close();
+ }
+
+ if ( fixChecksums )
+ {
+ fixChecksums( new File( targetPath, targetFilename ) );
+ }
+ }
+
+ /**
+ * Update artifact level metadata. If it does not exist, create the metadata and fix checksums if necessary.
+ */
+ private void updateProjectMetadata( String targetPath, Date lastUpdatedTimestamp, String timestamp, int buildNumber,
+ boolean fixChecksums, FileMetadata fileMetadata )
+ throws RepositoryMetadataException
+ {
+ List<String> availableVersions = new ArrayList<String>();
+ String latestVersion = fileMetadata.getVersion();
+
+ File projectDir = new File( targetPath ).getParentFile();
+ File projectMetadataFile = new File( projectDir, MetadataTools.MAVEN_METADATA );
+
+ ArchivaRepositoryMetadata projectMetadata = getMetadata( projectMetadataFile );
+
+ if ( projectMetadataFile.exists() )
+ {
+ availableVersions = projectMetadata.getAvailableVersions();
+
+ Collections.sort( availableVersions, VersionComparator.getInstance() );
+
+ if ( !availableVersions.contains( fileMetadata.getVersion() ) )
+ {
+ availableVersions.add( fileMetadata.getVersion() );
+ }
+
+ latestVersion = availableVersions.get( availableVersions.size() - 1 );
+ }
+ else
+ {
+ availableVersions.add( fileMetadata.getVersion() );
+
+ projectMetadata.setGroupId( fileMetadata.getGroupId() );
+ projectMetadata.setArtifactId( fileMetadata.getArtifactId() );
+ }
+
+ if ( projectMetadata.getGroupId() == null )
+ {
+ projectMetadata.setGroupId( fileMetadata.getGroupId() );
+ }
+
+ if ( projectMetadata.getArtifactId() == null )
+ {
+ projectMetadata.setArtifactId( fileMetadata.getArtifactId() );
+ }
+
+ projectMetadata.setLatestVersion( latestVersion );
+ projectMetadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
+ projectMetadata.setAvailableVersions( availableVersions );
+
+ if ( !VersionUtil.isSnapshot( fileMetadata.getVersion() ) )
+ {
+ projectMetadata.setReleasedVersion( latestVersion );
+ }
+
+ RepositoryMetadataWriter.write( projectMetadata, projectMetadataFile );
+
+ if ( fixChecksums )
+ {
+ fixChecksums( projectMetadataFile );
+ }
+ }
+
+ /**
+ * Update version level metadata for snapshot artifacts. If it does not exist, create the metadata and fix checksums
+ * if necessary.
+ */
+ private void updateVersionMetadata( ArchivaRepositoryMetadata metadata, File metadataFile,
+ Date lastUpdatedTimestamp, String timestamp, int buildNumber,
+ boolean fixChecksums, FileMetadata fileMetadata )
+ throws RepositoryMetadataException
+ {
+ if ( !metadataFile.exists() )
+ {
+ metadata.setGroupId( fileMetadata.getGroupId() );
+ metadata.setArtifactId( fileMetadata.getArtifactId() );
+ metadata.setVersion( fileMetadata.getVersion() );
+ }
+
+ if ( metadata.getSnapshotVersion() == null )
+ {
+ metadata.setSnapshotVersion( new SnapshotVersion() );
+ }
+
+ metadata.getSnapshotVersion().setBuildNumber( buildNumber );
+ metadata.getSnapshotVersion().setTimestamp( timestamp );
+ metadata.setLastUpdatedTimestamp( lastUpdatedTimestamp );
+
+ RepositoryMetadataWriter.write( metadata, metadataFile );
+
+ if ( fixChecksums )
+ {
+ fixChecksums( metadataFile );
+ }
+ }
+
+
}
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/api/FileUploadService.java Sat Mar 31 15:35:00 2012
@@ -31,6 +31,7 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.List;
@@ -65,4 +66,13 @@ public interface FileUploadService
@RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD )
List<FileMetadata> getSessionFileMetadatas()
throws ArchivaRestServiceException;
+
+ @Path( "save/{repositoryId}/{groupId}/{artifactId}" )
+ @GET
+ @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML } )
+ @RedbackAuthorization( permissions = ArchivaRoleConstants.OPERATION_REPOSITORY_UPLOAD )
+ Boolean save( @PathParam( "repositoryId" ) String repositoryId, @PathParam( "groupId" ) String groupId,
+ @PathParam( "artifactId" ) String artifactId, @QueryParam( "generatePom" ) boolean generatePom )
+ throws ArchivaRestServiceException;
+
}
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/java/org/apache/archiva/webapp/ui/services/model/FileMetadata.java Sat Mar 31 15:35:00 2012
@@ -51,12 +51,8 @@ public class FileMetadata
private String packaging;
- private boolean generatePom;
-
private String classifier;
- private String repositoryId;
-
private boolean pomFile;
public FileMetadata()
@@ -178,16 +174,6 @@ public class FileMetadata
this.packaging = packaging;
}
- public boolean isGeneratePom()
- {
- return generatePom;
- }
-
- public void setGeneratePom( boolean generatePom )
- {
- this.generatePom = generatePom;
- }
-
public String getClassifier()
{
return classifier;
@@ -198,15 +184,6 @@ public class FileMetadata
this.classifier = classifier;
}
- public String getRepositoryId()
- {
- return repositoryId;
- }
-
- public void setRepositoryId( String repositoryId )
- {
- this.repositoryId = repositoryId;
- }
public boolean isPomFile()
{
@@ -262,6 +239,7 @@ public class FileMetadata
final StringBuilder sb = new StringBuilder();
sb.append( "FileMetadata" );
sb.append( "{name='" ).append( name ).append( '\'' );
+ sb.append( ", serverFileName='" ).append( serverFileName ).append( '\'' );
sb.append( ", size=" ).append( size );
sb.append( ", url='" ).append( url ).append( '\'' );
sb.append( ", deleteUrl='" ).append( deleteUrl ).append( '\'' );
@@ -271,12 +249,9 @@ public class FileMetadata
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();
}
-
}
Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js?rev=1307829&r1=1307828&r2=1307829&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp-js/src/main/webapp/js/archiva/artifacts-management.js Sat Mar 31 15:35:00 2012
@@ -46,6 +46,19 @@ define("archiva.artifacts-management",["
displayErrorMessage( $.i18n.prop("fileupload.upload.required"));
return;
}
+ var url="restServices/archivaUiServices/fileUploadService/save/"+this.repositoryId()+"/"+this.groupId()+"/"+this.artifactId();
+ if (this.generatePom()){
+ url+="?generatePom=true";
+ }
+ $.ajax(url, {
+ type: "GET",
+ dataType: 'json',
+ success: function(data) {
+
+ }
+ }
+ );
+
}
}
@@ -71,9 +84,7 @@ define("archiva.artifacts-management",["
groupId: artifactUploadViewModel.groupId(),
artifactId: artifactUploadViewModel.artifactId(),
version: artifactUploadViewModel.version(),
- packaging: artifactUploadViewModel.packaging(),
- generatePom: artifactUploadViewModel.generatePom(),
- repositoryId: artifactUploadViewModel.repositoryId()
+ packaging: artifactUploadViewModel.packaging()
};
$.blueimpUI.fileupload.prototype.options.add.call(this, e, data);
},
@@ -87,7 +98,7 @@ define("archiva.artifacts-management",["
}
);
$('#fileupload').bind('fileuploadsubmit', function (e, data) {
- var pomFile = data.context.find('#pomFile' ).val();
+ var pomFile = data.context.find('#pomFile' ).attr("checked");
var classifier = data.context.find('#classifier' ).val();
data.formData.pomFile = pomFile;
data.formData.classifier = classifier;