You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by jo...@apache.org on 2007/05/19 00:35:15 UTC

svn commit: r539619 - in /maven/archiva/trunk: archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ archiva-base/ar...

Author: joakime
Date: Fri May 18 15:35:12 2007
New Revision: 539619

URL: http://svn.apache.org/viewvc?view=rev&rev=539619
Log:
[MRM-346]: Show Artifact results in error 500.

Added:
    maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java   (with props)
Modified:
    maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
    maven/archiva/trunk/archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ArchivaModelCloner.java
    maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionExpanderTest.java
    maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400ReaderTest.java
    maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java
    maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/PlexusTagUtil.java
    maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf

Modified: maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-consumers/archiva-database-consumers/src/main/java/org/apache/maven/archiva/consumers/database/ProjectModelToDatabaseConsumer.java Fri May 18 15:35:12 2007
@@ -38,6 +38,7 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -130,6 +131,9 @@
             try
             {
                 ArchivaProjectModel model = project400Reader.read( artifactFile );
+                
+                model.setOrigin( "filesystem" );
+                
                 dao.getProjectModelDAO().saveProjectModel( model );
             }
             catch ( ProjectModelException e )

Modified: maven/archiva/trunk/archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ArchivaModelCloner.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ArchivaModelCloner.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ArchivaModelCloner.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-model/src/main/java/org/apache/maven/archiva/model/ArchivaModelCloner.java Fri May 18 15:35:12 2007
@@ -62,7 +62,7 @@
         cloned.setOrganization( clone( model.getOrganization() ) );
         cloned.setScm( clone( model.getScm() ) );
         cloned.setRepositories( cloneRepositories( model.getRepositories() ) );
-        cloned.setDependencyTree( clone( model.getDependencyTree() ) );
+        cloned.setDependencies( cloneDependencies( model.getDependencies() ) );
         cloned.setPlugins( clonePlugins( model.getPlugins() ) );
         cloned.setReports( cloneReports( model.getReports() ) );
         cloned.setDependencyManagement( cloneDependencies( model.getDependencyManagement() ) );
@@ -130,37 +130,6 @@
         return cloned;
     }
 
-    public static DependencyEdge clone( DependencyEdge edge )
-    {
-        if ( edge == null )
-        {
-            return null;
-        }
-
-        DependencyEdge cloned = new DependencyEdge();
-
-        cloned.setFromDependency( clone( edge.getFromDependency() ) );
-        cloned.setToDependency( clone( edge.getToDependency() ) );
-        cloned.setType( edge.getType() );
-
-        return cloned;
-    }
-
-    public static DependencyTree clone( DependencyTree dependencyTree )
-    {
-        if ( dependencyTree == null )
-        {
-            return null;
-        }
-
-        DependencyTree cloned = new DependencyTree();
-
-        cloned.setDependencyNodes( cloneDependencies( dependencyTree.getDependencyNodes() ) );
-        cloned.setDependencyEdges( cloneDependencyEdges( dependencyTree.getDependencyEdges() ) );
-
-        return cloned;
-    }
-
     public static IssueManagement clone( IssueManagement issueManagement )
     {
         if ( issueManagement == null )
@@ -318,32 +287,6 @@
             }
 
             ret.add( clone( dep ) );
-        }
-
-        return ret;
-    }
-
-    public static List cloneDependencyEdges( List dependencyEdges )
-    {
-        if ( dependencyEdges == null )
-        {
-            return null;
-        }
-
-        List ret = new ArrayList();
-
-        Iterator it = dependencyEdges.iterator();
-        while ( it.hasNext() )
-        {
-            DependencyEdge edge = (DependencyEdge) it.next();
-
-            if ( edge == null )
-            {
-                // Skip empty edge.
-                continue;
-            }
-
-            ret.add( clone( edge ) );
         }
 
         return ret;

Modified: maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml (original)
+++ maven/archiva/trunk/archiva-base/archiva-model/src/main/mdo/archiva-base.xml Fri May 18 15:35:12 2007
@@ -998,7 +998,7 @@
           <name>whenIndexed</name>
           <identifier>false</identifier>
           <version>1.0.0+</version>
-          <required>true</required>
+          <required>false</required>
           <type>Date</type>
           <description>
             The timestamp when this model was indexed.
@@ -1080,14 +1080,15 @@
           </association>
         </field>
         <field>
-          <name>dependencyTree</name>
+          <name>dependencies</name>
           <version>1.0.0+</version>
           <description><![CDATA[
               This element describes all of the dependencies associated with a
               project.
           ]]></description>
           <association>
-            <type>DependencyTree</type>
+            <type>Dependency</type>
+            <multiplicity>*</multiplicity>
           </association>
         </field>
         <field>
@@ -1441,129 +1442,6 @@
         </field>
       </fields>
     </class>
-    
-    <class stash.storable="true"
-           jpox.table="DEPENDENCY_TREE">
-      <name>DependencyTree</name>
-      <description>The Dependency Tree</description>
-      <version>1.0.0+</version>
-      <fields>
-        <field>
-          <name>dependencyNodes</name>
-          <version>1.0.0+</version>
-          <description>The nodes for this dependency tree.</description>
-          <association>
-            <type>Dependency</type>
-            <multiplicity>*</multiplicity>
-          </association>
-        </field>
-        <field>
-          <name>dependencyEdges</name>
-          <version>1.0.0+</version>
-          <description>The edges for this dependency tree.</description>
-          <association>
-            <type>DependencyEdge</type>
-            <multiplicity>*</multiplicity>
-          </association>
-        </field>
-      </fields>
-      <codeSegments>
-        <codeSegment>
-          <version>1.0.0+</version>
-          <code><![CDATA[
-    /**
-     * True if the dependency tree is empty.
-     * 
-     * @return true if the dependency tree is empty.
-     */
-    public boolean isEmpty()
-    {
-        if ( this.dependencyNodes == null )
-        {
-            return true;
-        }
-
-        return this.dependencyNodes.isEmpty();
-    }          
-    
-    public void addDependencyEdge( Dependency fromNode, Dependency toNode )
-    {
-        if ( this.dependencyNodes == null )
-        {
-            this.dependencyNodes = new java.util.ArrayList();
-        }
-
-        if ( this.dependencyEdges == null )
-        {
-            this.dependencyEdges = new java.util.ArrayList();
-        }
-
-        java.util.Iterator it;
-
-        DependencyEdge edge = new DependencyEdge();
-        edge.setFromDependency( toArtifactReference( fromNode ) );
-        edge.setToDependency( toArtifactReference( toNode ) );
-
-        String key = DependencyEdge.toKey( edge );
-
-        // Test for existance of previous edge.
-        it = this.dependencyEdges.iterator();
-        while ( it.hasNext() )
-        {
-            DependencyEdge existingEdge = (DependencyEdge) it.next();
-            String existingKey = DependencyEdge.toKey( existingEdge );
-            if ( key.equals( existingKey ) )
-            {
-                // Key already exists.
-                // Update type and return.
-                existingEdge.setType( edge.getType() );
-                return;
-            }
-        }
-
-        // Test for existance of fromNode or toNode and add if not present.
-        String fromKey = Dependency.toVersionlessKey( fromNode );
-        String toKey = Dependency.toVersionlessKey( toNode );
-        
-        // Generate list of keys
-        java.util.List existingKeys = new java.util.ArrayList();
-
-        it = this.dependencyNodes.iterator();
-        while ( it.hasNext() )
-        {
-            Dependency existingDep = (Dependency) it.next();
-            String existingKey = Dependency.toVersionlessKey( existingDep );
-            existingKeys.add( existingKey );
-        }
-
-        // Now add nodes that are not present.
-        if ( !existingKeys.contains( fromKey ) )
-        {
-            this.dependencyNodes.add( fromNode );
-        }
-
-        if ( !existingKeys.contains( toKey ) )
-        {
-            this.dependencyNodes.add( toNode );
-        }
-    }
-    
-    public static ArtifactReference toArtifactReference( Dependency dependency )
-    {
-        ArtifactReference ref = new ArtifactReference();
-        
-        ref.setGroupId( dependency.getGroupId() );
-        ref.setArtifactId( dependency.getArtifactId() );
-        ref.setVersion( dependency.getVersion() );
-        ref.setClassifier( dependency.getClassifier() );
-        ref.setType( dependency.getType() );
-        
-        return ref;
-    }
-          ]]></code>
-        </codeSegment>
-      </codeSegments>
-    </class>
 
     <class stash.storable="true"
            jpox.table="DEPENDENCY">
@@ -1602,6 +1480,7 @@
           <version>1.0.0+</version>
           <type>String</type>
           <required>false</required>
+          <defaultValue></defaultValue>
           <description><![CDATA[
             The classifier of the dependency. This allows distinguishing two artifacts that belong to the same POM but
             were built differently, and is appended to the filename after the version. For example,
@@ -1732,85 +1611,6 @@
 
         return key.toString();
     }
-          ]]></code>
-        </codeSegment>
-      </codeSegments>
-    </class>
-    
-    <class stash.storable="true"
-           jpox.table="DEPENDENCY_EDGE">
-      <name>DependencyEdge</name>
-      <version>1.0.0+</version>
-      <fields>
-        <field>
-          <name>fromDependency</name>
-          <version>1.0.0+</version>
-          <required>true</required>
-          <description>The dependency reference for the 'from' node</description>
-          <association>
-            <type>ArtifactReference</type>
-          </association>
-        </field>
-        <field>
-          <name>toDependency</name>
-          <version>1.0.0+</version>
-          <required>true</required>
-          <description>The dependency reference for the 'to' node</description>
-          <association>
-            <type>ArtifactReference</type>
-          </association>
-        </field>
-        <field jpox.column="EDGE_TYPE">
-          <name>type</name>
-          <version>1.0.0+</version>
-          <required>true</required>
-          <description><![CDATA[
-          <p>
-          The type of edge you have.
-          </p>
-          
-          <dl>
-            <dt><code>runtime</code></dt>
-            <dd>A dependency node that is required for runtime of the project</dd>
-            
-            <dt><code>test</code></dt>
-            <dd>A dependency node that is used by the project for testing purposes.</dd>
-            
-            <dt><code>build</code></dt>
-            <dd>A dependency node that is used in the build/extension capacity.</dd>
-            
-            <dt><code>plugin</code></dt>
-            <dd>A dependency node that is used as, or by a, declared plugin in this project.
-              This includes the plugin itself, and any defined plugins/plugin/dependencies/dependency references.
-            </dd>
-            
-            <dt><code>report</code></dt>
-            <dd>A dependency node that is used as, or by a, declared report in this project.
-              This includes the report itself, and any defined reporting/plugins/plugin/dependencies/dependency references.</dd>
-          </dl>
-          ]]></description>
-          <type>String</type>
-        </field>
-      </fields>
-      <codeSegments>
-        <codeSegment>
-          <version>1.0.0+</version>
-          <code><![CDATA[
-    public static String toKey( DependencyEdge edge )
-    {
-        StringBuffer key = new StringBuffer();
-
-        key.append( ArtifactReference.toVersionlessKey( edge.getFromDependency() ) );
-        key.append( "->" );
-        key.append( ArtifactReference.toVersionlessKey( edge.getToDependency() ) );
-
-        return key.toString();
-    }
-
-    public String toString()
-    {
-        return DependencyEdge.toKey( this );
-    }          
           ]]></code>
         </codeSegment>
       </codeSegments>

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/ProjectModelMerge.java Fri May 18 15:35:12 2007
@@ -25,8 +25,6 @@
 import org.apache.maven.archiva.model.ArtifactReference;
 import org.apache.maven.archiva.model.CiManagement;
 import org.apache.maven.archiva.model.Dependency;
-import org.apache.maven.archiva.model.DependencyEdge;
-import org.apache.maven.archiva.model.DependencyTree;
 import org.apache.maven.archiva.model.Exclusion;
 import org.apache.maven.archiva.model.Individual;
 import org.apache.maven.archiva.model.IssueManagement;
@@ -94,7 +92,7 @@
         merged.setOrganization( merge( mainProject.getOrganization(), parentProject.getOrganization() ) );
         merged.setScm( merge( mainProject.getScm(), parentProject.getScm() ) );
         merged.setRepositories( mergeRepositories( mainProject.getRepositories(), parentProject.getRepositories() ) );
-        merged.setDependencyTree( merge( mainProject.getDependencyTree(), parentProject.getDependencyTree() ) );
+        merged.setDependencies( mergeDependencies( mainProject.getDependencies(), parentProject.getDependencies() ) );
         merged.setDependencyManagement( mergeDependencyManagement( mainProject.getDependencyManagement(), parentProject
             .getDependencyManagement() ) );
         merged.setPlugins( mergePlugins( mainProject.getPlugins(), parentProject.getPlugins() ) );
@@ -181,21 +179,6 @@
         return ret;
     }
 
-    private static Map createEdgeMap( List dependencyEdges )
-    {
-        Map ret = new HashMap();
-
-        Iterator it = dependencyEdges.iterator();
-        while ( it.hasNext() )
-        {
-            DependencyEdge edge = (DependencyEdge) it.next();
-            String key = toKey( edge );
-            ret.put( key, edge );
-        }
-
-        return ret;
-    }
-
     private static boolean empty( String val )
     {
         if ( val == null )
@@ -233,28 +216,6 @@
         return merged;
     }
 
-    private static DependencyTree merge( DependencyTree mainDependencyTree, DependencyTree parentDependencyTree )
-    {
-        if ( parentDependencyTree == null )
-        {
-            return mainDependencyTree;
-        }
-
-        if ( mainDependencyTree == null )
-        {
-            return ArchivaModelCloner.clone( parentDependencyTree );
-        }
-
-        DependencyTree merged = ArchivaModelCloner.clone( mainDependencyTree );
-
-        merged.setDependencyNodes( mergeDependencies( mainDependencyTree.getDependencyNodes(), parentDependencyTree
-            .getDependencyNodes() ) );
-        merged.setDependencyEdges( mergeDependencyEdges( mainDependencyTree.getDependencyEdges(), parentDependencyTree
-            .getDependencyEdges() ) );
-
-        return merged;
-    }
-
     private static CiManagement merge( CiManagement mainCim, CiManagement parentCim )
     {
         if ( parentCim == null )
@@ -675,45 +636,6 @@
         return merged;
     }
 
-    private static List mergeDependencyEdges( List mainDependencyEdges, List parentDependencyEdges )
-    {
-        if ( parentDependencyEdges == null )
-        {
-            return mainDependencyEdges;
-        }
-
-        if ( mainDependencyEdges == null )
-        {
-            return ArchivaModelCloner.cloneDependencyEdges( parentDependencyEdges );
-        }
-
-        List merged = new ArrayList();
-
-        Map mainEdgesMap = createEdgeMap( mainDependencyEdges );
-        Map parentEdgesMap = createEdgeMap( parentDependencyEdges );
-
-        Iterator it = mainEdgesMap.entrySet().iterator();
-        while ( it.hasNext() )
-        {
-            Map.Entry entry = (Entry) it.next();
-            String key = (String) entry.getKey();
-            DependencyEdge mainEdge = (DependencyEdge) entry.getValue();
-            DependencyEdge parentEdge = (DependencyEdge) parentEdgesMap.get( key );
-
-            if ( parentEdge == null )
-            {
-                merged.add( mainEdge );
-            }
-            else
-            {
-                // Not merging. Local wins.
-                merged.add( parentEdge );
-            }
-        }
-
-        return merged;
-    }
-
     private static String toVersionlessArtifactKey( ArtifactReference artifactReference )
     {
         StringBuffer key = new StringBuffer();
@@ -732,17 +654,6 @@
         key.append( dep.getGroupId() ).append( ":" ).append( dep.getArtifactId() );
         key.append( StringUtils.defaultString( dep.getClassifier() ) ).append( ":" );
         key.append( dep.getType() );
-
-        return key.toString();
-    }
-
-    private static String toKey( DependencyEdge edge )
-    {
-        StringBuffer key = new StringBuffer();
-
-        key.append( toVersionlessArtifactKey( edge.getFromDependency() ) );
-        key.append( "->" );
-        key.append( toVersionlessArtifactKey( edge.getToDependency() ) );
 
         return key.toString();
     }

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilter.java Fri May 18 15:35:12 2007
@@ -118,20 +118,20 @@
 
     private void applyDependencyManagement( ArchivaProjectModel pom )
     {
-        if ( ( pom.getDependencyManagement() == null ) || ( pom.getDependencyTree() == null ) )
+        if ( ( pom.getDependencyManagement() == null ) || ( pom.getDependencies() == null ) )
         {
             // Nothing to do. All done!
             return;
         }
         
-        if ( pom.getDependencyManagement().isEmpty() || pom.getDependencyTree().isEmpty() )
+        if ( pom.getDependencyManagement().isEmpty() || pom.getDependencies().isEmpty() )
         {
             // Nothing to do. All done!
             return;
         }
 
         Map managedDependencies = createDependencyMap( pom.getDependencyManagement() );
-        Iterator it = pom.getDependencyTree().getDependencyNodes().iterator();
+        Iterator it = pom.getDependencies().iterator();
         while ( it.hasNext() )
         {
             Dependency dep = (Dependency) it.next();

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionFilter.java Fri May 18 15:35:12 2007
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.maven.archiva.model.ArchivaModelCloner;
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.model.Dependency;
@@ -73,9 +74,9 @@
             ret.setVersion( evaluator.expand( ret.getVersion() ) );
             ret.setGroupId( evaluator.expand( ret.getGroupId() ) );
 
-            if ( ( ret.getDependencyTree() != null ) && !ret.getDependencyTree().isEmpty() )
+            if ( CollectionUtils.isNotEmpty( ret.getDependencies() ) )
             {
-                evaluateExpressionsInDependencyList( evaluator, ret.getDependencyTree().getDependencyNodes() );
+                evaluateExpressionsInDependencyList( evaluator, ret.getDependencies() );
             }
 
             evaluateExpressionsInDependencyList( evaluator, ret.getDependencyManagement() );

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/main/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400Reader.java Fri May 18 15:35:12 2007
@@ -25,7 +25,6 @@
 import org.apache.maven.archiva.model.CiManagement;
 import org.apache.maven.archiva.model.Dependency;
 import org.apache.maven.archiva.model.DependencyScope;
-import org.apache.maven.archiva.model.DependencyTree;
 import org.apache.maven.archiva.model.Exclusion;
 import org.apache.maven.archiva.model.Individual;
 import org.apache.maven.archiva.model.IssueManagement;
@@ -100,7 +99,7 @@
             model.setScm( getSCM( xml ) );
             model.setRepositories( getRepositories( xml ) );
 
-            model.setDependencyTree( getDependencyTree( xml ) );
+            model.setDependencies( getDependencies( xml ) );
             model.setDependencyManagement( getDependencyManagement( xml ) );
             model.setPlugins( getPlugins( xml ) );
             model.setReports( getReports( xml ) );
@@ -142,20 +141,10 @@
         return null;
     }
 
-    private DependencyTree getDependencyTree( XMLReader xml )
+    private List getDependencies( XMLReader xml )
         throws XMLException
     {
-        DependencyTree tree = new DependencyTree();
-        List dependencies = getDependencyList( xml, new String[] { "dependencies" } );
-
-        Iterator it = dependencies.iterator();
-        while ( it.hasNext() )
-        {
-            Dependency dependency = (Dependency) it.next();
-            tree.addDependencyNode( dependency );
-        }
-
-        return tree;
+        return getDependencyList( xml, new String[] { "dependencies" } );
     }
 
     private List getDependencyList( XMLReader xml, String parts[] )
@@ -187,7 +176,7 @@
             dependency.setArtifactId( elemDependency.elementTextTrim( "artifactId" ) );
             dependency.setVersion( elemDependency.elementTextTrim( "version" ) );
 
-            dependency.setClassifier( elemDependency.elementTextTrim( "classifier" ) );
+            dependency.setClassifier( StringUtils.defaultString( elemDependency.elementTextTrim( "classifier" ) ) );
             dependency.setType( StringUtils.defaultIfEmpty( elemDependency.elementTextTrim( "type" ), "jar" ) );
             dependency.setScope( StringUtils.defaultIfEmpty( elemDependency.elementTextTrim( "scope" ), "compile" ) );
             // Not for v4.0.0 -> dependency.setUrl( elemDependency.elementTextTrim("url") );

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/EffectiveProjectModelFilterTest.java Fri May 18 15:35:12 2007
@@ -22,7 +22,6 @@
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.model.ArchivaRepository;
 import org.apache.maven.archiva.model.Dependency;
-import org.apache.maven.archiva.model.DependencyTree;
 import org.apache.maven.archiva.model.Individual;
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
@@ -100,29 +99,27 @@
         assertEquals( "Equivalent Models", expectedModel, effectiveModel );
 
         assertContainsSameIndividuals( "Individuals", expectedModel.getIndividuals(), effectiveModel.getIndividuals() );
-        dumpDependencyList( "Expected", expectedModel.getDependencyTree() );
-        dumpDependencyList( "Effective", effectiveModel.getDependencyTree() );
-        assertContainsSameDependencies( "Dependencies", expectedModel.getDependencyTree().getDependencyNodes(),
-                                        effectiveModel.getDependencyTree().getDependencyNodes() );
-        assertContainsSameDependencies( "DependencyManagement", expectedModel.getDependencyManagement(), effectiveModel
-            .getDependencyManagement() );
+        dumpDependencyList( "Expected", expectedModel.getDependencies() );
+        dumpDependencyList( "Effective", effectiveModel.getDependencies() );
+        assertContainsSameDependencies( "Dependencies", expectedModel.getDependencies(), 
+                                                        effectiveModel.getDependencies() );
+        assertContainsSameDependencies( "DependencyManagement", expectedModel.getDependencyManagement(), 
+                                                                effectiveModel.getDependencyManagement() );
     }
 
-    private void dumpDependencyList( String type, DependencyTree tree )
+    private void dumpDependencyList( String type, List deps )
     {
-        if ( tree == null )
+        if ( deps == null )
         {
-            System.out.println( " Tree [" + type + "] is null." );
+            System.out.println( " Dependencies [" + type + "] is null." );
             return;
         }
 
-        if ( tree.getDependencyNodes() == null )
+        if ( deps.isEmpty() )
         {
-            System.out.println( " Tree [" + type + "] dependency list (nodes) is null." );
+            System.out.println( " Dependencies [" + type + "] dependency list is empty." );
             return;
         }
-
-        List deps = tree.getDependencyNodes();
 
         System.out.println( ".\\ [" + type + "] Dependency List (size:" + deps.size() + ") \\.________________" );
         Iterator it = deps.iterator();

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionExpanderTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionExpanderTest.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionExpanderTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/filters/ProjectModelExpressionExpanderTest.java Fri May 18 15:35:12 2007
@@ -21,11 +21,12 @@
 
 import org.apache.maven.archiva.model.ArchivaProjectModel;
 import org.apache.maven.archiva.model.Dependency;
-import org.apache.maven.archiva.model.DependencyTree;
 import org.apache.maven.archiva.repository.project.ProjectModelFilter;
 import org.codehaus.plexus.PlexusTestCase;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 /**
  * ProjectModelExpressionExpanderTest 
@@ -49,13 +50,13 @@
         model.setArtifactId( "archiva-test-project" );
         model.setVersion( "1.0-SNAPSHOT" );
 
-        DependencyTree depTree = new DependencyTree();
+        List deps = new ArrayList();
         
-        depTree.addDependencyEdge( model.asDependency(), createDependency( "org.apache.maven.archiva", "archiva-model", "${archiva.version}" ) );
-        depTree.addDependencyEdge( model.asDependency(), createDependency( "org.apache.maven.archiva", "archiva-common", "${archiva.version}" ) );
-        depTree.addDependencyEdge( model.asDependency(), createDependency( "org.apache.maven.archiva", "archiva-indexer", "${archiva.version}" ) );
+        deps.add( createDependency( "org.apache.maven.archiva", "archiva-model", "${archiva.version}" ) );
+        deps.add( createDependency( "org.apache.maven.archiva", "archiva-common", "${archiva.version}" ) );
+        deps.add( createDependency( "org.apache.maven.archiva", "archiva-indexer", "${archiva.version}" ) );
 
-        model.setDependencyTree( depTree );
+        model.setDependencies( deps );
         
         model.addProperty( "archiva.version", "1.0-SNAPSHOT" );
 
@@ -67,11 +68,10 @@
         assertEquals( "Group ID", "org.apache.maven.archiva", model.getGroupId() );
         assertEquals( "Artifact ID", "archiva-test-project", model.getArtifactId() );
         assertEquals( "Version", "1.0-SNAPSHOT", model.getVersion() );
-        assertNotNull( "DependencyTree", model.getDependencyTree() );
-        assertNotNull( "DependencyTree.dependencies", model.getDependencyTree().getDependencyNodes() );
-        assertEquals( "Dependencies Size", 4, model.getDependencyTree().getDependencyNodes().size() );
+        assertNotNull( "Dependencies", model.getDependencies() );
+        assertEquals( "Dependencies Size", 3, model.getDependencies().size() );
 
-        Iterator it = model.getDependencyTree().getDependencyNodes().iterator();
+        Iterator it = model.getDependencies().iterator();
         while ( it.hasNext() )
         {
             Dependency dep = (Dependency) it.next();

Modified: maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400ReaderTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400ReaderTest.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400ReaderTest.java (original)
+++ maven/archiva/trunk/archiva-base/archiva-repository-layer/src/test/java/org/apache/maven/archiva/repository/project/readers/ProjectModel400ReaderTest.java Fri May 18 15:35:12 2007
@@ -23,7 +23,6 @@
 import org.apache.maven.archiva.model.VersionedReference;
 import org.apache.maven.archiva.repository.project.ProjectModelException;
 import org.apache.maven.archiva.repository.project.ProjectModelReader;
-import org.apache.maven.archiva.repository.project.readers.ProjectModel400Reader;
 import org.codehaus.plexus.PlexusTestCase;
 
 import java.io.File;
@@ -63,9 +62,8 @@
         assertEquals( "Parent Artifact ID", "maven-shared-components", parentRef.getArtifactId() );
         assertEquals( "Parent Version", "4", parentRef.getVersion() );
 
-        assertNotNull( "DependencyTree", project.getDependencyTree() );
-        assertNotNull( "DependencyTree.dependencies", project.getDependencyTree().getDependencyNodes() );
-        assertEquals( "Dependencies.size", 3, project.getDependencyTree().getDependencyNodes().size() );
+        assertNotNull( "Dependencies", project.getDependencies() );
+        assertEquals( "Dependencies.size", 3, project.getDependencies().size() );
     }
 
     public void testLoadWithNamespace()
@@ -93,8 +91,7 @@
         assertEquals( "Parent Artifact ID", "archiva-base", parentRef.getArtifactId() );
         assertEquals( "Parent Version", "1.0-SNAPSHOT", parentRef.getVersion() );
         
-        assertNotNull( "DependencyTree", project.getDependencyTree() );
-        assertNotNull( "DependencyTree.dependencies", project.getDependencyTree().getDependencyNodes() );
-        assertEquals( "Dependencies.size", 6, project.getDependencyTree().getDependencyNodes().size() );
+        assertNotNull( "Dependencies", project.getDependencies() );
+        assertEquals( "Dependencies.size", 6, project.getDependencies().size() );
     }
 }

Modified: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java (original)
+++ maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraint.java Fri May 18 15:35:12 2007
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.maven.archiva.database.Constraint;
 
 /**
@@ -36,9 +35,9 @@
 
     public ArtifactsRelatedConstraint( String groupId, String artifactId, String version )
     {
-        whereClause = "groupId == '" + StringEscapeUtils.escapeSql( groupId ) + "' AND artifactId == '"
-            + StringEscapeUtils.escapeSql( artifactId ) + "' AND version == '" + StringEscapeUtils.escapeSql( version )
-            + "'";
+        whereClause = "groupId.equals(selectedGroupId) && artifactId.equals(selectedArtifactId) && version.equals(selectedVersion)";
+        declParams = new String[] { "String selectedGroupId", "String selectedArtifactId", "String selectedVersion" };
+        params = new Object[] { groupId, artifactId, version };
     }
 
     public String getSortColumn()

Modified: maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java (original)
+++ maven/archiva/trunk/archiva-database/src/main/java/org/apache/maven/archiva/database/jdo/JdoAccess.java Fri May 18 15:35:12 2007
@@ -310,11 +310,7 @@
 
         if ( constraint.getDeclaredImports() != null )
         {
-            for ( int i = 0; i < constraint.getDeclaredImports().length; i++ )
-            {
-                String qimport = constraint.getDeclaredImports()[i];
-                query.declareImports( qimport );
-            }
+            query.declareImports( StringUtils.join( constraint.getDeclaredImports(), ", " ) );
         }
 
         if ( constraint.getDeclaredParameters() != null )
@@ -331,12 +327,8 @@
                     + "> declared parameters, yet there are <" + constraint.getParameters().length
                     + "> parameter objects to use.  This should be equal." );
             }
-
-            for ( int i = 0; i < constraint.getDeclaredParameters().length; i++ )
-            {
-                String declaredParam = constraint.getDeclaredParameters()[i];
-                query.declareParameters( declaredParam );
-            }
+            
+            query.declareParameters( StringUtils.join( constraint.getDeclaredParameters(), ", " ) );
 
             return processParameterizedQuery( query, constraint.getParameters() );
         }

Added: maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java?view=auto&rev=539619
==============================================================================
--- maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java (added)
+++ maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java Fri May 18 15:35:12 2007
@@ -0,0 +1,91 @@
+package org.apache.maven.archiva.database.constraints;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.archiva.database.AbstractArchivaDatabaseTestCase;
+import org.apache.maven.archiva.database.ArchivaDAO;
+import org.apache.maven.archiva.database.ArtifactDAO;
+import org.apache.maven.archiva.database.Constraint;
+import org.apache.maven.archiva.model.ArchivaArtifact;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * ArtifactsRelatedConstraintTest 
+ *
+ * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
+ * @version $Id$
+ */
+public class ArtifactsRelatedConstraintTest
+    extends AbstractArchivaDatabaseTestCase
+{
+    private static final String TEST_GROUPID = "org.apache.maven.archiva.test";
+    private ArtifactDAO artifactDao;
+
+    protected void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        ArchivaDAO dao = (ArchivaDAO) lookup( ArchivaDAO.ROLE, "jdo" );
+        artifactDao = dao.getArtifactDAO();
+    }
+
+    public ArchivaArtifact createArtifact( String artifactId, String version, String classifier, String type )
+    {
+        ArchivaArtifact artifact = artifactDao.createArtifact( TEST_GROUPID, artifactId, version,
+                                                               classifier, type );
+        Calendar cal = Calendar.getInstance();
+        artifact.getModel().setLastModified( cal.getTime() );
+        artifact.getModel().setRepositoryId( "testable_repo" );
+        return artifact;
+    }
+
+    public void testConstraint()
+        throws Exception
+    {
+        // Setup artifacts in fresh DB.
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.0", "", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.0", "", "pom" ) );
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.0", "javadoc", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.0", "sources", "jar" ) );
+
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.1", "", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-one", "1.2", "", "jar" ) );
+        
+        artifactDao.saveArtifact( createArtifact( "test-two", "1.0", "", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-two", "2.0", "", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-two", "2.1", "", "jar" ) );
+        artifactDao.saveArtifact( createArtifact( "test-two", "3.0", "", "jar" ) );
+
+        assertConstraint( 4, new ArtifactsRelatedConstraint( TEST_GROUPID, "test-one", "1.0" ) );
+        assertConstraint( 1, new ArtifactsRelatedConstraint( TEST_GROUPID, "test-one", "1.1" ) );
+    }
+
+    private void assertConstraint( int expectedHits, Constraint constraint )
+        throws Exception
+    {
+        List results = artifactDao.queryArtifacts( constraint );
+        assertNotNull( "Related Artifacts: Not Null", results );
+        assertEquals( "Related Artifacts: Results.size", expectedHits, results.size() );
+    }
+
+}

Propchange: maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Propchange: maven/archiva/trunk/archiva-database/src/test/java/org/apache/maven/archiva/database/constraints/ArtifactsRelatedConstraintTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/DownloadArtifact.java Fri May 18 15:35:12 2007
@@ -87,7 +87,9 @@
         this.res = (HttpServletResponse) pageContext.getResponse();
         try
         {
-            dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE );
+            dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE, "jdo" );
+            layoutFactory = (BidirectionalRepositoryLayoutFactory) PlexusTagUtil
+                .lookup( pageContext, BidirectionalRepositoryLayoutFactory.class );
         }
         catch ( ComponentLookupException e )
         {

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/PlexusTagUtil.java
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/PlexusTagUtil.java?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/PlexusTagUtil.java (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/tags/PlexusTagUtil.java Fri May 18 15:35:12 2007
@@ -34,10 +34,22 @@
  */
 public class PlexusTagUtil
 {
+    public static Object lookup( PageContext pageContext, Class clazz )
+        throws ComponentLookupException
+    {
+        return getContainer( pageContext ).lookup( clazz );
+    }
+
     public static Object lookup( PageContext pageContext, String role )
         throws ComponentLookupException
     {
         return getContainer( pageContext ).lookup( role );
+    }
+
+    public static Object lookup( PageContext pageContext, Class clazz, String hint )
+        throws ComponentLookupException
+    {
+        return getContainer( pageContext ).lookup( clazz, hint );
     }
 
     public static Object lookup( PageContext pageContext, String role, String hint )

Modified: maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf
URL: http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf?view=diff&rev=539619&r1=539618&r2=539619
==============================================================================
--- maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf (original)
+++ maven/archiva/trunk/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/include/artifactInfo.jspf Fri May 18 15:35:12 2007
@@ -70,16 +70,16 @@
       </td>
     </tr>
   --%>
-  <c:if test="${model.parent != null}">
+  <c:if test="${model.parentProject != null}">
     <tr>
       <th>Parent</th>
       <td>
-          ${model.parent.groupId} ${model.parent.artifactId} ${model.parent.version}
+          ${model.parentProject.groupId} ${model.parentProject.artifactId} ${model.parentProject.version}
         <c:set var="url">
           <ww:url action="showArtifact" namespace="/">
-            <ww:param name="groupId" value="%{'${model.parent.groupId}'}"/>
-            <ww:param name="artifactId" value="%{'${model.parent.artifactId}'}"/>
-            <ww:param name="version" value="%{'${model.parent.version}'}"/>
+            <ww:param name="groupId" value="%{'${model.parentProject.groupId}'}"/>
+            <ww:param name="artifactId" value="%{'${model.parentProject.artifactId}'}"/>
+            <ww:param name="version" value="%{'${model.parentProject.version}'}"/>
           </ww:url>
         </c:set>
         (<a href="${url}">View</a>)