You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by oc...@apache.org on 2008/03/13 11:33:45 UTC
svn commit: r636703 - in
/maven/archiva/trunk/archiva-web/archiva-webapp/src/main:
java/org/apache/maven/archiva/web/action/UploadAction.java
resources/xwork.xml webapp/WEB-INF/jsp/include/uploadForm.jspf
webapp/WEB-INF/jsp/upload.jsp
Author: oching
Date: Thu Mar 13 03:33:39 2008
New Revision: 636703
URL: http://svn.apache.org/viewvc?rev=636703&view=rev
Log:
[MRM-216]
-generate pom for the artifact if set by the user
-update metadata file
Modified:
maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml
maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/uploadForm.jspf
maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/upload.jsp
Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java?rev=636703&r1=636702&r2=636703&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/UploadAction.java Thu Mar 13 03:33:39 2008
@@ -20,54 +20,110 @@
*/
import org.codehaus.plexus.xwork.action.PlexusActionSupport;
+import org.apache.maven.archiva.common.utils.VersionComparator;
+import org.apache.maven.archiva.common.utils.VersionUtil;
import org.apache.maven.archiva.configuration.ArchivaConfiguration;
import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.model.ArchivaProjectModel;
+import org.apache.maven.archiva.model.ArchivaRepositoryMetadata;
import org.apache.maven.archiva.model.ArtifactReference;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryException;
import org.apache.maven.archiva.repository.RepositoryNotFoundException;
+import org.apache.maven.archiva.repository.metadata.MetadataTools;
+import org.apache.maven.archiva.repository.metadata.RepositoryMetadataException;
+import org.apache.maven.archiva.repository.metadata.RepositoryMetadataReader;
+import org.apache.maven.archiva.repository.metadata.RepositoryMetadataWriter;
+import org.apache.maven.archiva.repository.project.ProjectModelException;
+import org.apache.maven.archiva.repository.project.ProjectModelWriter;
import org.apache.maven.archiva.security.ArchivaSecurityException;
import org.apache.maven.archiva.security.ArchivaUser;
import org.apache.maven.archiva.security.PrincipalNotFoundException;
import org.apache.maven.archiva.security.UserRepositories;
+import com.opensymphony.xwork.Preparable;
import com.opensymphony.xwork.Validateable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.List;
/**
- * Upload an artifact.
+ * Upload an artifact using Jakarta file upload in webwork. If set by the user
+ * a pom will also be generated. Metadata will also be updated if one exists,
+ * otherwise it would be created.
+ *
+ * @author <a href="mailto:wsmoak@apache.org">Wendy Smoak</a>
+ * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
*
- * @author Wendy Smoak
* @plexus.component role="com.opensymphony.xwork.Action" role-hint="uploadAction"
*/
public class UploadAction
extends PlexusActionSupport
- implements Validateable
+ implements Validateable, Preparable
{
+ /**
+ * The groupId of the artifact to be deployed.
+ */
private String groupId;
+ /**
+ * The artifactId of the artifact to be deployed.
+ */
private String artifactId;
+ /**
+ * The version of the artifact to be deployed.
+ */
private String version;
+ /**
+ * The packaging of the artifact to be deployed.
+ */
private String packaging;
+ /**
+ * The classifier of the artifact to be deployed.
+ */
private String classifier;
+ /**
+ * The artifact to be deployed.
+ */
private File file;
+ /**
+ * The content type of the artifact to be deployed.
+ */
private String contentType;
+ /**
+ * The temporary filename of the artifact to be deployed.
+ */
private String filename;
+ /**
+ * The repository where the artifact is to be deployed.
+ */
private String repositoryId;
/**
+ * Flag whether to generate a pom for the artifact or not.
+ */
+ private boolean generatePom;
+
+ /**
+ * List of managed repositories to deploy to.
+ */
+ private List<String> managedRepoIdList;
+
+ /**
* @plexus.requirement role-hint="xwork"
*/
private ArchivaUser archivaUser;
@@ -87,6 +143,11 @@
*/
private RepositoryContentFactory repositoryFactory;
+ /**
+ * @plexus.requirement role-hint="model400"
+ */
+ private ProjectModelWriter pomWriter;
+
public void setUpload( File file )
{
this.file = file;
@@ -162,12 +223,35 @@
this.repositoryId = repositoryId;
}
+ public boolean isGeneratePom()
+ {
+ return generatePom;
+ }
+
+ public void setGeneratePom( boolean generatePom )
+ {
+ this.generatePom = generatePom;
+ }
+
+ public List<String> getManagedRepoIdList()
+ {
+ return managedRepoIdList;
+ }
+
+ public void setManagedRepoIdList( List<String> managedRepoIdList )
+ {
+ this.managedRepoIdList = managedRepoIdList;
+ }
+
+ public void prepare()
+ {
+ managedRepoIdList =
+ new ArrayList<String>( configuration.getConfiguration().getManagedRepositoriesAsMap().keySet() );
+ }
+
public String upload()
{
- // TODO populate repository id field
// TODO form validation
-
- getLogger().debug( "upload" );
return INPUT;
}
@@ -198,30 +282,38 @@
targetPath.mkdirs();
}
- copyFile( targetPath, artifactPath.substring( lastIndex + 1 ) );
-
- // 1. check if user has permission to deploy to the repository
- // - get writable user repositories (need to add new method
- // for this in DefaultUserRepositories)
-
- // 2. if user has write permission:
- // - get repository path (consider the layout -- default or legacy)
- // - if the artifact is not a pom, create pom file (use ProjectModel400Writer in archiva-repository-layer)
- // - create directories in the repository (groupId, artifactId, version)
- // - re-write uploaded jar file
- // - write generated pom
- // - update metadata
+ try
+ {
+ copyFile( targetPath, artifactPath.substring( lastIndex + 1 ) );
+ }
+ catch ( IOException ie )
+ {
+ addActionError( "Error encountered while uploading file: " + ie.getMessage() );
+ return ERROR;
+ }
- // TODO delete temporary file (upload)
- // TODO improve action error messages below
+ if ( generatePom )
+ {
+ try
+ {
+ createPom( targetPath, artifactPath.substring( lastIndex + 1 ) );
+ }
+ catch ( IOException ie )
+ {
+ addActionError( "Error encountered while writing pom file: " + ie.getMessage() );
+ return ERROR;
+ }
+ catch ( ProjectModelException pe )
+ {
+ addActionError( "Error encountered while generating pom file: " + pe.getMessage() );
+ return ERROR;
+ }
+ }
+ updateMetadata( getMetadata( targetPath.getAbsolutePath() ) );
+
return SUCCESS;
}
- catch ( IOException ie )
- {
- addActionError( "Error encountered while uploading file: " + ie.getMessage() );
- return ERROR;
- }
catch ( RepositoryNotFoundException re )
{
addActionError( "Target repository cannot be found: " + re.getMessage() );
@@ -260,11 +352,82 @@
}
}
- private void generatePom()
+ private void createPom( File targetPath, String filename )
+ throws IOException, ProjectModelException
+ {
+ ArchivaProjectModel projectModel = new ArchivaProjectModel();
+ projectModel.setGroupId( groupId );
+ projectModel.setArtifactId( artifactId );
+ projectModel.setVersion( version );
+ projectModel.setPackaging( packaging );
+
+ File pomFile = new File( targetPath, filename.replaceAll( packaging, "pom" ) );
+
+ pomWriter.write( projectModel, pomFile );
+ }
+
+ private File getMetadata( String targetPath )
{
- // TODO: use ProjectModel400Writer
+ String artifactPath = targetPath.substring( 0, targetPath.lastIndexOf( '/' ) );
+
+ return new File( artifactPath, MetadataTools.MAVEN_METADATA );
}
+ /**
+ * Update artifact level metadata. If it does not exist, create the metadata.
+ *
+ * @param targetPath
+ */
+ private void updateMetadata( File metadataFile )
+ throws RepositoryMetadataException
+ {
+ List<String> availableVersions = new ArrayList<String>();
+ ArchivaRepositoryMetadata metadata = new ArchivaRepositoryMetadata();
+
+ if ( metadataFile.exists() )
+ {
+ metadata = RepositoryMetadataReader.read( metadataFile );
+ availableVersions = metadata.getAvailableVersions();
+
+ Collections.sort( availableVersions, VersionComparator.getInstance() );
+
+ if ( !availableVersions.contains( version ) )
+ {
+ availableVersions.add( version );
+ }
+
+ String latestVersion = availableVersions.get( availableVersions.size() - 1 );
+ metadata.setLatestVersion( latestVersion );
+ metadata.setAvailableVersions( availableVersions );
+ metadata.setLastUpdatedTimestamp( Calendar.getInstance().getTime() );
+
+ if( !VersionUtil.isSnapshot( version ) )
+ {
+ metadata.setReleasedVersion( latestVersion );
+ }
+ // TODO:
+ // what about the metadata checksums? re-calculate or
+ // just leave it to the consumers to fix it?
+ }
+ else
+ {
+ availableVersions.add( version );
+
+ metadata.setGroupId( groupId );
+ metadata.setArtifactId( artifactId );
+ metadata.setLatestVersion( version );
+ metadata.setLastUpdatedTimestamp( Calendar.getInstance().getTime() );
+ metadata.setAvailableVersions( availableVersions );
+
+ if( !VersionUtil.isSnapshot( version ) )
+ {
+ metadata.setReleasedVersion( version );
+ }
+ }
+
+ RepositoryMetadataWriter.write( metadata, metadataFile );
+ }
+
public void validate()
{
try
@@ -274,6 +437,19 @@
{
addActionError( "User is not authorized to upload in repository " + repositoryId );
}
+
+ // TODO fix validation
+ /*
+ if ( file == null || file.length() == 0 )
+ {
+ addActionError( "Please add a file to upload." );
+ }
+
+ if ( !VersionUtil.isVersion( version ) )
+ {
+ addActionError( "Invalid version." );
+ }
+ */
}
catch ( PrincipalNotFoundException pe )
{
Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml?rev=636703&r1=636702&r2=636703&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/resources/xwork.xml Thu Mar 13 03:33:39 2008
@@ -74,7 +74,6 @@
<interceptor-ref name="params"/>
<interceptor-ref name="configuredArchivaStack"/>
</interceptor-stack>
-
</interceptors>
<!-- Default interceptor stack. -->
@@ -130,7 +129,7 @@
<result name="access_to_no_repos">/WEB-INF/jsp/accessToNoRepos.jsp</result>
</global-results>
</package>
-
+
<!-- Configuration for the default package. -->
<package name="default" extends="base" namespace="/">
@@ -144,7 +143,7 @@
<action name="index" class="searchAction" method="input">
<result name="input">/WEB-INF/jsp/quickSearch.jsp</result>
</action>
-
+
<action name="quickSearch" class="searchAction" method="quickSearch">
<result name="input">/WEB-INF/jsp/quickSearch.jsp</result>
<result>/WEB-INF/jsp/results.jsp</result>
@@ -155,6 +154,13 @@
<result name="input">/WEB-INF/jsp/findArtifact.jsp</result>
</action>
+ <action name="upload" class="uploadAction" method="upload">
+ <result name="input">/WEB-INF/jsp/upload.jsp</result>
+ <result name="success">/WEB-INF/jsp/upload.jsp</result>
+ <interceptor-ref name="configuredPrepareParamsStack"/>
+ <interceptor-ref name="fileUpload"/>
+ </action>
+
<action name="checksumSearch" class="searchAction" method="findArtifact">
<result name="input">/WEB-INF/jsp/findArtifact.jsp</result>
<result name="results">/WEB-INF/jsp/results.jsp</result>
@@ -162,14 +168,7 @@
<result name="artifact" type="redirect">
/browse/${databaseResults.get(0).getGroupId()}/${databaseResults.get(0).getArtifactId()}/${databaseResults.get(0).getVersion()}
</result>
- </action>
-
- <action name="upload" class="uploadAction" method="upload">
- <interceptor-ref name="fileUpload"/>
- <interceptor-ref name="basicStack"/>
- <result name="input">/WEB-INF/jsp/upload.jsp</result>
- <result name="success">/WEB-INF/jsp/upload.jsp</result>
- </action>
+ </action>
<action name="browse" class="browseAction" method="browse">
<result>/WEB-INF/jsp/browse.jsp</result>
@@ -234,7 +233,7 @@
<action name="indexRepository" class="schedulerAction" method="scanRepository">
<result type="redirect-action">repositories</result>
</action>
-
+
<action name="addRepository" class="addManagedRepositoryAction" method="input">
<result name="input">/WEB-INF/jsp/admin/addRepository.jsp</result>
<result name="error">/WEB-INF/jsp/admin/addRepository.jsp</result>
Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/uploadForm.jspf
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/uploadForm.jspf?rev=636703&r1=636702&r2=636703&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/uploadForm.jspf (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/uploadForm.jspf Thu Mar 13 03:33:39 2008
@@ -27,7 +27,9 @@
<ww:textfield name="version" label="Version" size="50" required="true"/>
<ww:textfield name="packaging" label="Packaging" size="50" required="true"/>
<ww:textfield name="classifier" label="Classifier" size="50" required="false"/>
-<ww:select list="#@java.util.LinkedHashMap@{'internal' : 'internal'}"
- name="repositoryId" label="Repository Id"/>
+<ww:select name="repositoryId" list="managedRepoIdList" label="Repository Id"/>
<ww:file name="upload" label="File"/>
+<ww:checkbox name="generatePom" value="generatePom"
+ label="Generate Pom (Currently, only Maven 2 poms can be generated)"/>
+
Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/upload.jsp
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/upload.jsp?rev=636703&r1=636702&r2=636703&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/upload.jsp (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/upload.jsp Thu Mar 13 03:33:39 2008
@@ -29,10 +29,10 @@
</head>
<body>
-
<h1>Upload Artifact</h1>
+
<div id="contentArea">
- <ww:form action="upload!doUpload" method="post" enctype="multipart/form-data">
+ <ww:form action="upload!doUpload" method="post" enctype="multipart/form-data" validate="false">
<%@ include file="/WEB-INF/jsp/include/uploadForm.jspf" %>
<ww:submit/>
</ww:form>