You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by br...@apache.org on 2009/12/21 12:34:38 UTC

svn commit: r892772 - in /archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src: main/java/org/apache/maven/archiva/web/action/ main/java/org/apache/maven/archiva/web/tags/ main/resources/ main/webapp/WEB-INF/ main/webapp/WEB-INF/jsp...

Author: brett
Date: Mon Dec 21 11:34:37 2009
New Revision: 892772

URL: http://svn.apache.org/viewvc?rev=892772&view=rev
Log:
[MRM-1285][MRM-404] improve appearance of the downloads box and correct handling of snapshots

Removed:
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifactTag.java
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/artifact/
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/decorators/artifactDecorator.jsp
Modified:
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
    archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java Mon Dec 21 11:34:37 2009
@@ -19,16 +19,26 @@
  * under the License.
  */
 
+import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import com.opensymphony.xwork2.Validateable;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.Dependency;
 import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.commons.lang.StringUtils;
+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.layout.LayoutException;
 
 /**
  * Browse the repository.
@@ -48,6 +58,11 @@
      */
     private MetadataResolver metadataResolver;
 
+    /**
+     * @plexus.requirement
+     */
+    private RepositoryContentFactory repositoryFactory;
+
     /* .\ Exposed Output Objects \.__________________________________ */
 
     private String groupId;
@@ -72,7 +87,9 @@
 
     private List<Dependency> dependencies;
 
-    private List<String> snapshotVersions;
+    private Map<String, List<ArtifactDownloadInfo>> artifacts;
+
+    private boolean dependencyTree = false;
 
     /**
      * Show the versioned project information tab.
@@ -81,18 +98,16 @@
      */
     public String artifact()
     {
+        ProjectVersionMetadata versionMetadata = null;
+        artifacts = new HashMap<String, List<ArtifactDownloadInfo>>();
+
+        List<String> repos = getObservableRepos();
         // In the future, this should be replaced by the repository grouping mechanism, so that we are only making
         // simple resource requests here and letting the resolver take care of it
-        ProjectVersionMetadata versionMetadata = null;
-        snapshotVersions = new ArrayList<String>();
-        for ( String repoId : getObservableRepos() )
+        for ( String repoId : repos )
         {
             if ( versionMetadata == null )
             {
-                // TODO: though we have a simple mapping now, do we want to support paths like /1.0-20090111.123456-1/
-                //   again by mapping it to /1.0-SNAPSHOT/? Currently, the individual versions are not supported as we
-                //   are only displaying the project's single version.
-
                 // we don't want the implementation being that intelligent - so another resolver to do the
                 // "just-in-time" nature of picking up the metadata (if appropriate for the repository type) is used
                 versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version );
@@ -100,9 +115,17 @@
                 {
                     repositoryId = repoId;
 
-                    snapshotVersions.addAll(
-                        metadataResolver.getArtifactVersions( repoId, groupId, artifactId, versionMetadata.getId() ) );
-                    snapshotVersions.remove( version );
+                    Collection<ArtifactMetadata> artifacts = metadataResolver.getArtifacts( repoId, groupId, artifactId, version );
+                    for ( ArtifactMetadata artifact : artifacts )
+                    {
+                        List<ArtifactDownloadInfo> l = this.artifacts.get( artifact.getVersion() );
+                        if ( l == null )
+                        {
+                            l = new ArrayList<ArtifactDownloadInfo>();
+                            this.artifacts.put( artifact.getVersion(), l );
+                        }
+                        l.add( new ArtifactDownloadInfo( artifact ) );
+                    }
                 }
             }
         }
@@ -122,25 +145,11 @@
      */
     public String dependencies()
     {
-        ProjectVersionMetadata versionMetadata = null;
-        for ( String repoId : getObservableRepos() )
-        {
-            if ( versionMetadata == null )
-            {
-                versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version );
-            }
-        }
-
-        if ( versionMetadata == null )
-        {
-            addActionError( "Artifact not found" );
-            return ERROR;
-        }
-        model = versionMetadata;
+        String result = artifact();
 
         this.dependencies = model.getDependencies();
 
-        return SUCCESS;
+        return result;
     }
 
     /**
@@ -148,25 +157,11 @@
      */
     public String mailingLists()
     {
-        ProjectVersionMetadata versionMetadata = null;
-        for ( String repoId : getObservableRepos() )
-        {
-            if ( versionMetadata == null )
-            {
-                versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version );
-            }
-        }
-
-        if ( versionMetadata == null )
-        {
-            addActionError( "Artifact not found" );
-            return ERROR;
-        }
-        model = versionMetadata;
-
+        String result = artifact();
+        
         this.mailingLists = model.getMailingLists();
 
-        return SUCCESS;
+        return result;
     }
 
     /**
@@ -184,22 +179,6 @@
      */
     public String dependees()
     {
-        ProjectVersionMetadata versionMetadata = null;
-        for ( String repoId : getObservableRepos() )
-        {
-            if ( versionMetadata == null )
-            {
-                versionMetadata = metadataResolver.getProjectVersion( repoId, groupId, artifactId, version );
-            }
-        }
-
-        if ( versionMetadata == null )
-        {
-            addActionError( "Artifact not found" );
-            return ERROR;
-        }
-        model = versionMetadata;
-
         List<ProjectVersionReference> references = new ArrayList<ProjectVersionReference>();
         // TODO: what if we get duplicates across repositories?
         for ( String repoId : getObservableRepos() )
@@ -213,7 +192,7 @@
         // TODO: may need to note on the page that references will be incomplete if the other artifacts are not yet stored in the content repository
         // (especially in the case of pre-population import)
 
-        return SUCCESS;
+        return artifact();
     }
 
     /**
@@ -227,6 +206,9 @@
         // TODO: may need to note on the page that tree will be incomplete if the other artifacts are not yet stored in the content repository
         // (especially in the case of pre-population import)
 
+        // TODO: a bit ugly, should really be mapping all these results differently now
+        this.dependencyTree = true;
+
         return artifact();
     }
 
@@ -299,7 +281,7 @@
         return dependees;
     }
 
-    public String getRepositoryId()
+    public String  getRepositoryId()
     {
         return repositoryId;
     }
@@ -309,13 +291,148 @@
         this.repositoryId = repositoryId;
     }
 
-    public List<String> getSnapshotVersions()
+    public MetadataResolver getMetadataResolver()
     {
-        return snapshotVersions;
+        return metadataResolver;
     }
 
-    public MetadataResolver getMetadataResolver()
+    public Map<String, List<ArtifactDownloadInfo>> getArtifacts()
     {
-        return metadataResolver;
+        return artifacts;
+    }
+
+    public Collection<String> getSnapshotVersions()
+    {
+        return artifacts.keySet();
+    }
+
+    public void setRepositoryFactory( RepositoryContentFactory repositoryFactory )
+    {
+        this.repositoryFactory = repositoryFactory;
+    }
+
+    public boolean isDependencyTree()
+    {
+        return dependencyTree;
+    }
+
+    // TODO: move this into the artifact metadata itself via facets where necessary
+    public class ArtifactDownloadInfo
+    {
+        private String type;
+
+        private String namespace;
+
+        private String project;
+
+        private String size;
+
+        private String id;
+
+        private String repositoryId;
+
+        private String version;
+
+        private String path;
+
+        public ArtifactDownloadInfo( ArtifactMetadata artifact )
+        {
+            repositoryId = artifact.getRepositoryId();
+
+            // TODO: use metadata resolver capability instead
+            ManagedRepositoryContent repo;
+            try
+            {
+                repo = repositoryFactory.getManagedRepositoryContent( repositoryId );
+            }
+            catch ( RepositoryException e )
+            {
+                throw new RuntimeException( e );
+            }
+
+            ArtifactReference ref = new ArtifactReference();
+            ref.setArtifactId( artifact.getProject() );
+            ref.setGroupId( artifact.getNamespace() );
+            ref.setVersion( artifact.getVersion() );
+            path = repo.toPath( ref );
+            path = path.substring( 0, path.lastIndexOf( "/" ) + 1 ) + artifact.getId();
+
+            try
+            {
+                type = repo.toArtifactReference( path ).getType();
+            }
+            catch ( LayoutException e )
+            {
+                throw new RuntimeException( e );
+            }
+
+            namespace = artifact.getNamespace();
+            project = artifact.getProject();
+
+            // TODO: find a reusable formatter for this
+            double s = artifact.getSize();
+            String symbol = "b";
+            if ( s > 1024 )
+            {
+                symbol = "K";
+                s /= 1024;
+
+                if ( s > 1024 )
+                {
+                    symbol = "M";
+                    s /= 1024;
+
+                    if ( s > 1024 )
+                    {
+                        symbol = "G";
+                        s /= 1024;
+                    }
+                }
+            }
+
+            size = new DecimalFormat( "#,###.##" ).format( s ) + " " + symbol;
+            id = artifact.getId();
+            version = artifact.getVersion();
+        }
+
+        public String getNamespace()
+        {
+            return namespace;
+        }
+
+        public String getType()
+        {
+            return type;
+        }
+
+        public String getProject()
+        {
+            return project;
+        }
+
+        public String getSize()
+        {
+            return size;
+        }
+
+        public String getId()
+        {
+            return id;
+        }
+
+        public String getVersion()
+        {
+            return version;
+        }
+
+        public String getRepositoryId()
+        {
+            return repositoryId;
+        }
+
+        public String getPath()
+        {
+            return path;
+        }
     }
 }

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/resources/struts.xml Mon Dec 21 11:34:37 2009
@@ -215,7 +215,7 @@
     </action>
 
     <action name="showArtifactDependencyTree" class="showArtifactAction" method="dependencyTree">
-      <result>/WEB-INF/jsp/artifact/dependencyTree.jsp</result>
+      <result>/WEB-INF/jsp/showArtifact.jsp</result>
     </action>
 
   </package>

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/decorators.xml Mon Dec 21 11:34:37 2009
@@ -27,8 +27,4 @@
   <decorator name="default" page="default.jsp">
     <pattern>/*</pattern>
   </decorator>
-  
-  <decorator name="artifactDetails" page="artifactDecorator.jsp">
-    <pattern>/*/dependencyTree</pattern>
-  </decorator>
 </decorators>
\ No newline at end of file

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf Mon Dec 21 11:34:37 2009
@@ -91,23 +91,6 @@
       </td>
     </tr>
   </c:if>
-  <c:if test="${(snapshotVersions != null) && (!empty snapshotVersions)}">
-    <tr>
-      <th>Other Versions</th>
-      <td>
-        <c:forEach items="${snapshotVersions}" var="snapshot">         
-          <c:set var="url">
-            <s:url action="showArtifact" namespace="/">
-              <s:param name="groupId" value="%{#attr.mavenFacet.groupId}"/>
-              <s:param name="artifactId" value="%{#attr.mavenFacet.artifactId}"/>
-              <s:param name="version" value="%{#attr.snapshot}"/>
-            </s:url>
-          </c:set>
-          <a href="${url}">${snapshot}</a>
-        </c:forEach>
-      </td>
-    </tr>
-  </c:if>
   <%-- TODO: deployment timestamp
     <tr>
       <th>Deployment Date</th>

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/dependencyTree.jspf Mon Dec 21 11:34:37 2009
@@ -17,15 +17,11 @@
   ~ under the License.
   --%>
 
-<%@ taglib prefix="s" uri="/struts-tags" %>
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
-<%@ taglib prefix="archiva"   uri="/WEB-INF/taglib.tld" %>
+<%@ taglib prefix="archiva" uri="/WEB-INF/taglib.tld" %>
 
-<archiva:dependency-tree groupId="${groupId}" artifactId="${artifactId}" version="${version}" />
-
-  <%-- 
-  <my:showArtifactLink groupId="${node.artifact.groupId}" artifactId="${node.artifact.artifactId}"
-                       version="${node.artifact.version}"/>
-  --%>
-  
\ No newline at end of file
+<archiva:dependency-tree groupId="${groupId}" artifactId="${artifactId}" version="${version}"
+                         modelVersion="${model.version}">
+  <my:showArtifactLink groupId="${node.groupId}" artifactId="${node.artifactId}"
+                       version="${node.version}"/>
+</archiva:dependency-tree>

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/showArtifact.jsp Mon Dec 21 11:34:37 2009
@@ -27,6 +27,14 @@
 <head>
   <title>Browse Repository</title>
   <s:head/>
+  <script type="text/javascript" src="<c:url value='/js/jquery-1.3.2.min.js'/>"></script>
+  <script type="text/javascript" src="<c:url value='/js/jquery-ui-1.7.2.custom.min.js'/>"></script>
+  <script type="text/javascript">
+	$(function() {
+		$("#accordion").accordion({autoHeight:false});
+	});
+	</script>
+  <link rel="stylesheet" href="<c:url value='/css/no-theme/jquery-ui-1.7.2.custom.css'/>" type="text/css" media="all"/>
 </head>
 
 <body>
@@ -134,8 +142,64 @@
     </span>
   </div>
 
-  <div class="sidebar3">
-    <archiva:downloadArtifact groupId="${mavenFacet.groupId}" artifactId="${mavenFacet.artifactId}" version="${model.version}"/>
+  <div id="download">
+    <h2>Download</h2>
+
+    <div id="accordion">
+      <c:forEach items="${snapshotVersions}" var="v">
+        <p><a href="#">${v}</a></p>
+        <div>
+          <table cellpadding="0" cellspacing="0" border="0" width="100%">
+            <tbody>
+            <c:forEach items="${artifacts[v]}" var="a">
+              <c:choose>
+                <c:when test="${a.type == 'maven-plugin'}">
+                  <c:url var="imageUrl" value="/images/download-type-maven-plugin.png"/>
+                  <c:set var="packageName">Maven Plugin</c:set>
+                </c:when>
+                <c:when test="${a.type == 'pom'}">
+                  <c:url var="imageUrl" value="/images/download-type-pom.png"/>
+                  <c:set var="packageName">POM</c:set>
+                </c:when>
+                <%-- These types aren't usually set in the POM yet, so we fudge them for the well known ones --%>
+                <c:when test="${a.type == 'maven-archetype' or a.namespace == 'org.apache.maven.archetypes'}">
+                  <c:url var="imageUrl" value="/images/download-type-archetype.png"/>
+                  <c:set var="packageName">Maven Archetype</c:set>
+                </c:when>
+                <c:when test="${a.type == 'maven-skin' or a.namespace == 'org.apache.maven.skins'}">
+                  <c:url var="imageUrl" value="/images/download-type-skin.png"/>
+                  <c:set var="packageName">Maven Skin</c:set>
+                </c:when>
+                <c:when test="${a.type == 'java-source'}">
+                  <c:url var="imageUrl" value="/images/download-type-jar.png"/>
+                  <c:set var="packageName">Java Sources</c:set>
+                </c:when>
+                <c:when test="${a.type == 'javadoc'}">
+                  <c:url var="imageUrl" value="/images/download-type-other.png"/>
+                  <c:set var="packageName">JavaDoc Archive</c:set>
+                </c:when>
+                <%-- Must be last so that the above get picked up if possible --%>
+                <c:when test="${a.type == 'jar'}">
+                  <c:url var="imageUrl" value="/images/download-type-jar.png"/>
+                  <c:set var="packageName">JAR</c:set>
+                </c:when>
+                <c:otherwise>
+                  <c:url var="imageUrl" value="/images/download-type-other.png"/>
+                  <c:set var="packageName">${a.type}</c:set>
+                </c:otherwise>
+              </c:choose>
+              <c:url var="url" value="/repository/${a.repositoryId}/${a.path}" />
+              <tr>
+                <td><a href="${url}" title="Download ${a.id}"><img src="${imageUrl}" alt="" width="24" height="24"/></a></td>
+                <td class="type"><a href="${url}" title="Download ${a.id}">${packageName}</a></td>
+                <td class="size">${a.size}</td>
+              </tr>
+            </c:forEach>
+            </tbody>
+          </table>
+        </div>
+      </c:forEach>
+    </div>
   </div>
 
   <%-- TODO: perhaps using ajax? --%>
@@ -145,7 +209,7 @@
       <c:when test="${dependencies != null}">
         <%@ include file="/WEB-INF/jsp/include/artifactDependencies.jspf" %>
       </c:when>
-      <c:when test="${dependencyTree != null}">
+      <c:when test="${dependencyTree}">
         <%@ include file="/WEB-INF/jsp/include/dependencyTree.jspf" %>
       </c:when>
       <c:when test="${dependees != null}">

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/taglib.tld Mon Dec 21 11:34:37 2009
@@ -39,47 +39,6 @@
 
    <tag>
 
-      <name>downloadArtifact</name>
-      <tag-class>org.apache.maven.archiva.web.tags.DownloadArtifactTag</tag-class>
-      <body-content>empty</body-content>
-      <description><![CDATA[Render a a set of download links for an artifact]]></description>
-
-      <attribute>
-        <name>groupId</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The GroupID String]]></description>
-      </attribute>
-      
-      <attribute>
-        <name>artifactId</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The ArtifactID String]]></description>
-      </attribute>
-      
-      <attribute>
-        <name>version</name>
-        <required>true</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[The Version String]]></description>
-      </attribute>
-      
-      <attribute>
-        <name>mini</name>
-        <required>false</required>
-        <rtexprvalue>true</rtexprvalue>
-        
-        <description><![CDATA[Boolean indicating if the download link is to be generated in mini format instead.]]></description>
-      </attribute>
-      
-   </tag>
-
-   <tag>
-
       <name>copy-paste-snippet</name>
       <tag-class>org.apache.maven.archiva.web.tags.CopyPasteSnippetTag</tag-class>
       <body-content>empty</body-content>

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/css/site.css Mon Dec 21 11:34:37 2009
@@ -16,119 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-.sidebar3 {
-	width: 10em;
-	float: right;
-	text-align: center;
-}
-
-#sidebarb {
-	font-size: small;
-	text-align: center;
-	padding: 10px 10px 10px 10px;
-	border: 1px #DFDEDE solid;
-	width: 10em;
-}
-
-#sidebar {
-	float: right;
-	font-size: small;
-	margin: 10px;
-	padding: 10px;
-	border: 1px #DFDEDE solid;
-	width: 10em;
-}
-
-.download {
-	float: right;
-	font-size: small;
-	font-weight: bold;
-	margin: 15px auto 0px auto;
-	height: auto;
-	width: 150px;
-	min-width: 120px;
-	display: block;
-}
-
-.download .hd .c,
-.download .ft .c {
-	font-size: 1px; /* ensure minimum height */
-	height: 10px;
-}
-
-.download .ft .c {
-	height: 10px;
-}
-
-.download .hd {
-	background: transparent url(../images/download.tl.gif) no-repeat 0px 0px;
-}
-
-.download .hd .c {
-	background: transparent url(../images/download.tr.gif) no-repeat right 0px;
-}
-
-.download .bd {
-	background: transparent url(../images/download.ml.gif) repeat-y 0px 0px;
-}
 
-.download .bd .c {
-	background: transparent url(../images/download.mr.gif) repeat-y right 0px;
+#download {
+    float: right;
 }
 
-.download .bd .c .s {
-	margin: 0px 8px 0px 4px;
-	background: #000 url(../images/download.ms.jpg) repeat-x 0px 0px;
-	padding: 1em;
-}
-
-.download .ft {
-	background: transparent url(../images/download.bl.gif) no-repeat 0px 0px;
-}
-
-.download .ft .c {
-	background: transparent url(../images/download.br.gif) no-repeat right 0px;
-}
-
-.download .bd h2 {
-	margin: 0px;
-	text-align: center;
-	border-bottom-width: 0px !important;
-}
-
-.download .bd p {
-	margin: 0px;
-	border: 0px;
-	text-align: left;
-	padding-left: 0px;
-}
-
-.download a {
+#download a {
 	text-decoration: none;
 }
 
-.download p.body {
-  font-weight: bold;
-}
-
-.download table {
-  margin-left: 2px;
-  width: 140px;
-}
-
-.download .icon {
-  width: 16px;
+#download td.type {
+    padding-right: 1em;
+    white-space: nowrap;
 }
 
-.download .type {
-  font-size: 0.9em;
-  text-align: center;
-}
-
-.download .size {
-  font-weight: normal;
-  font-size: 0.8em;
-  text-align: right;
+#download td.size {
+    text-align: right;
 }
 
 #contentArea {

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/archiva/metadata/repository/memory/TestMetadataResolver.java Mon Dec 21 11:34:37 2009
@@ -38,7 +38,7 @@
 {
     private Map<String, ProjectVersionMetadata> projectVersions = new HashMap<String, ProjectVersionMetadata>();
 
-    private Map<String, List<String>> artifactVersions = new HashMap<String, List<String>>();
+    private Map<String, List<ArtifactMetadata>> artifacts = new HashMap<String, List<ArtifactMetadata>>();
 
     private Map<String, List<ProjectVersionReference>> references =
         new HashMap<String, List<ProjectVersionReference>>();
@@ -66,8 +66,7 @@
     public Collection<String> getArtifactVersions( String repoId, String namespace, String projectId,
                                                    String projectVersion )
     {
-        List<String> versions = artifactVersions.get( createMapKey( repoId, namespace, projectId, projectVersion ) );
-        return ( versions != null ? versions : Collections.<String>emptyList() );
+        throw new UnsupportedOperationException();
     }
 
     public Collection<ProjectVersionReference> getProjectReferences( String repoId, String namespace, String projectId,
@@ -123,7 +122,9 @@
     public Collection<ArtifactMetadata> getArtifacts( String repoId, String namespace, String projectId,
                                                       String projectVersion )
     {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+        List<ArtifactMetadata> artifacts =
+            this.artifacts.get( createMapKey( repoId, namespace, projectId, projectVersion ) );
+        return ( artifacts != null ? artifacts : Collections.<ArtifactMetadata>emptyList() );
     }
 
     public void setProjectVersion( String repoId, String namespace, String projectId,
@@ -149,10 +150,10 @@
         versions.add( versionMetadata.getId() );
     }
 
-    public void setArtifactVersions( String repoId, String namespace, String projectId, String projectVersion,
-                                     List<String> versions )
+    public void setArtifacts( String repoId, String namespace, String projectId, String projectVersion,
+                              List<ArtifactMetadata> artifacts )
     {
-        artifactVersions.put( createMapKey( repoId, namespace, projectId, projectVersion ), versions );
+        this.artifacts.put( createMapKey( repoId, namespace, projectId, projectVersion ), artifacts );
     }
 
     private String createMapKey( String repoId, String namespace, String projectId, String projectVersion )

Modified: archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
URL: http://svn.apache.org/viewvc/archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java?rev=892772&r1=892771&r2=892772&view=diff
==============================================================================
--- archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java (original)
+++ archiva/branches/MRM-1025/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java Mon Dec 21 11:34:37 2009
@@ -22,13 +22,21 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 
 import com.opensymphony.xwork2.Action;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.Dependency;
 import org.apache.archiva.metadata.model.MailingList;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.memory.TestMetadataResolver;
+import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration;
+import org.apache.maven.archiva.repository.ManagedRepositoryContent;
+import org.apache.maven.archiva.repository.RepositoryContentFactory;
+import org.apache.maven.archiva.repository.content.ManagedDefaultRepositoryContent;
+import org.easymock.MockControl;
+import org.easymock.classextension.MockClassControl;
 
 public class ShowArtifactActionTest
     extends AbstractActionTestCase
@@ -41,13 +49,18 @@
 
     private static final String TEST_TS_SNAPSHOT_VERSION = "1.0-20091120.111111-1";
 
-    private static final List<String> ALL_TEST_SNAPSHOT_VERSIONS =
-        Arrays.asList( TEST_TS_SNAPSHOT_VERSION, "1.0-20091120.222222-2", "1.0-20091123.333333-3" );
-
     private static final String OTHER_TEST_REPO = "first-repo";
 
     private ShowArtifactAction action;
 
+    private static final List<ArtifactMetadata> TEST_SNAPSHOT_ARTIFACTS =
+        Arrays.asList( createArtifact( TEST_TS_SNAPSHOT_VERSION ), createArtifact( "1.0-20091120.222222-2" ),
+                       createArtifact( "1.0-20091123.333333-3" ) );
+
+    private static final long TEST_SIZE = 12345L;
+
+    private static final String TEST_TYPE = "jar";
+
     public void testInstantiation()
     {
         assertFalse( action == lookup( Action.class, ACTION_HINT ) );
@@ -73,15 +86,15 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetArtifactUniqueSnapshot()
     {
         metadataResolver.setProjectVersion( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID,
                                             createProjectModel( TEST_SNAPSHOT_VERSION ) );
-        metadataResolver.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_SNAPSHOT_VERSION,
-                                              ALL_TEST_SNAPSHOT_VERSIONS );
+        metadataResolver.setArtifacts( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_SNAPSHOT_VERSION,
+                                       TEST_SNAPSHOT_ARTIFACTS );
 
         action.setGroupId( TEST_GROUP_ID );
         action.setArtifactId( TEST_ARTIFACT_ID );
@@ -99,7 +112,7 @@
 
         assertEquals( TEST_REPO, action.getRepositoryId() );
 
-        assertEquals( ALL_TEST_SNAPSHOT_VERSIONS, action.getSnapshotVersions() );
+        assertArtifacts( TEST_SNAPSHOT_ARTIFACTS, action.getArtifacts() );
 
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
@@ -109,32 +122,17 @@
     public void testGetArtifactUniqueSnapshotTimestamped()
     {
         metadataResolver.setProjectVersion( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID,
-                                            createProjectModel( TEST_TS_SNAPSHOT_VERSION ) );
-        metadataResolver.setArtifactVersions( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_TS_SNAPSHOT_VERSION,
-                                              ALL_TEST_SNAPSHOT_VERSIONS );
+                                            createProjectModel( TEST_SNAPSHOT_VERSION ) );
+        metadataResolver.setArtifacts( TEST_REPO, TEST_GROUP_ID, TEST_ARTIFACT_ID, TEST_SNAPSHOT_VERSION,
+                                       TEST_SNAPSHOT_ARTIFACTS );
 
         action.setGroupId( TEST_GROUP_ID );
         action.setArtifactId( TEST_ARTIFACT_ID );
         action.setVersion( TEST_TS_SNAPSHOT_VERSION );
 
         String result = action.artifact();
-
-        assertActionSuccess( action, result );
-
-        assertEquals( TEST_GROUP_ID, action.getGroupId() );
-        assertEquals( TEST_ARTIFACT_ID, action.getArtifactId() );
-        assertEquals( TEST_TS_SNAPSHOT_VERSION, action.getVersion() );
-        ProjectVersionMetadata model = action.getModel();
-        assertDefaultModel( model, TEST_TS_SNAPSHOT_VERSION );
-
-        assertEquals( TEST_REPO, action.getRepositoryId() );
-
-        assertEquals( Arrays.asList( ALL_TEST_SNAPSHOT_VERSIONS.get( 1 ), ALL_TEST_SNAPSHOT_VERSIONS.get( 2 ) ),
-                      action.getSnapshotVersions() );
-
-        assertNull( action.getDependees() );
-        assertNull( action.getDependencies() );
-        assertNull( action.getMailingLists() );
+        assertError( result );
+        assertNoOutputFields();
     }
 
     public void testGetMissingProject()
@@ -197,7 +195,7 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetArtifactSeenInBothObservableRepo()
@@ -223,7 +221,7 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetArtifactCanOnlyObserveInOneOfTwoRepos()
@@ -249,7 +247,7 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetArtifactNoMavenFacet()
@@ -280,7 +278,7 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetMailingLists()
@@ -305,10 +303,10 @@
         assertMailingList( action.getMailingLists().get( 0 ), "Users List", "users" );
         assertMailingList( action.getMailingLists().get( 1 ), "Developers List", "dev" );
 
-        assertNull( action.getRepositoryId() );
+        assertEquals( TEST_REPO, action.getRepositoryId() );
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
-        assertNull( action.getSnapshotVersions() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetDependencies()
@@ -333,10 +331,10 @@
         assertDependencyBasic( action.getDependencies().get( 0 ), "artifactId1" );
         assertDependencyExtended( action.getDependencies().get( 1 ), "artifactId2" );
 
-        assertNull( action.getRepositoryId() );
+        assertEquals( TEST_REPO, action.getRepositoryId() );
         assertNull( action.getDependees() );
         assertNull( action.getMailingLists() );
-        assertNull( action.getSnapshotVersions() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     public void testGetDependees()
@@ -362,10 +360,45 @@
         assertCoordinate( action.getDependees().get( 0 ), "artifactId1" );
         assertCoordinate( action.getDependees().get( 1 ), "artifactId2" );
 
-        assertNull( action.getRepositoryId() );
+        assertEquals( TEST_REPO, action.getRepositoryId() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertNull( action.getSnapshotVersions() );
+        assertTrue( action.getArtifacts().isEmpty() );
+    }
+
+    private void assertArtifacts( List<ArtifactMetadata> expectedArtifacts,
+                                  Map<String, List<ShowArtifactAction.ArtifactDownloadInfo>> artifactMap )
+    {
+        // assuming only one of each version at this point
+        assertEquals( expectedArtifacts.size(), artifactMap.size() );
+        for ( ArtifactMetadata artifact : expectedArtifacts )
+        {
+            assertTrue( artifactMap.containsKey( artifact.getVersion() ) );
+            List<ShowArtifactAction.ArtifactDownloadInfo> list = artifactMap.get( artifact.getVersion() );
+            ShowArtifactAction.ArtifactDownloadInfo actual = list.get( 0 );
+            assertEquals( artifact.getNamespace(), actual.getNamespace() );
+            assertEquals( artifact.getId(), actual.getId() );
+            assertEquals( artifact.getProject(), actual.getProject() );
+            assertEquals( artifact.getRepositoryId(), actual.getRepositoryId() );
+            assertEquals( artifact.getSize(), actual.getSize() );
+            assertEquals( artifact.getVersion(), actual.getVersion() );
+            assertEquals( TEST_TYPE, actual.getType() );
+            assertEquals( TEST_SIZE, actual.getSize() );
+            assertEquals( artifact.getNamespace() + "/" + artifact.getProject() + "/" + TEST_SNAPSHOT_VERSION + "/" +
+                artifact.getId(), actual.getPath() );
+        }
+    }
+
+    private static ArtifactMetadata createArtifact( String version )
+    {
+        ArtifactMetadata metadata = new ArtifactMetadata();
+        metadata.setProject( TEST_ARTIFACT_ID );
+        metadata.setId( TEST_ARTIFACT_ID + "-" + version + ".jar" );
+        metadata.setNamespace( TEST_GROUP_ID );
+        metadata.setRepositoryId( TEST_REPO );
+        metadata.setSize( TEST_SIZE );
+        metadata.setVersion( version );
+        return metadata;
     }
 
     private ProjectVersionReference createReference( String projectId )
@@ -452,7 +485,7 @@
         assertNull( action.getDependees() );
         assertNull( action.getDependencies() );
         assertNull( action.getMailingLists() );
-        assertTrue( action.getSnapshotVersions().isEmpty() );
+        assertTrue( action.getArtifacts().isEmpty() );
     }
 
     private void assertError( String result )
@@ -493,5 +526,17 @@
         super.setUp();
         action = (ShowArtifactAction) lookup( Action.class, ACTION_HINT );
         metadataResolver = (TestMetadataResolver) action.getMetadataResolver();
+        MockControl control = MockClassControl.createControl( RepositoryContentFactory.class );
+        RepositoryContentFactory factory = (RepositoryContentFactory) control.getMock();
+        action.setRepositoryFactory( factory );
+
+        ManagedRepositoryConfiguration config = new ManagedRepositoryConfiguration();
+        config.setId( TEST_REPO );
+        config.setLocation( getTestFile( "target/test-repo" ).getAbsolutePath() );
+        ManagedRepositoryContent content = new ManagedDefaultRepositoryContent();
+        content.setRepository( config );
+        factory.getManagedRepositoryContent( TEST_REPO );
+        control.setDefaultReturnValue( content );
+        control.replay();
     }
 }