You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ct...@apache.org on 2008/09/08 15:27:21 UTC

svn commit: r693089 - in /continuum/trunk: continuum-api/src/main/java/org/apache/continuum/configuration/ continuum-api/src/main/java/org/apache/continuum/dao/ continuum-api/src/main/java/org/apache/maven/continuum/ continuum-api/src/main/java/org/apa...

Author: ctan
Date: Mon Sep  8 06:27:15 2008
New Revision: 693089

URL: http://svn.apache.org/viewvc?rev=693089&view=rev
Log:
[CONTINUUM-1830] ability to view release results after leaving page

Added:
    continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultDao.java
    continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultImpl.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ReleaseResultAction.java
    continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp
    continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupReleaseResults.jsp
Modified:
    continuum/trunk/continuum-api/src/main/java/org/apache/continuum/configuration/GeneralConfiguration.java
    continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java
    continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/configuration/ConfigurationService.java
    continuum/trunk/continuum-base/continuum-configuration/src/main/java/org/apache/continuum/configuration/DefaultContinuumConfiguration.java
    continuum/trunk/continuum-base/continuum-configuration/src/main/mdo/continuum-configuration.xml
    continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/configuration/DefaultConfigurationService.java
    continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/DefaultContinuumTest.java
    continuum/trunk/continuum-model/pom.xml
    continuum/trunk/continuum-model/src/main/mdo/continuum.xml
    continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/DaoUtilsImpl.java
    continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/AbstractContinuumTest.java
    continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java
    continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/ConfigurationAction.java
    continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
    continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction-configuration-validation.xml
    continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction.properties
    continuum/trunk/continuum-webapp/src/main/resources/xwork.xml
    continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configuration.jsp
    continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configurationEdit.jsp
    continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectGroupTabComponent.jsp

Modified: continuum/trunk/continuum-api/src/main/java/org/apache/continuum/configuration/GeneralConfiguration.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/continuum/configuration/GeneralConfiguration.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/continuum/configuration/GeneralConfiguration.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/continuum/configuration/GeneralConfiguration.java Mon Sep  8 06:27:15 2008
@@ -39,6 +39,8 @@
     private String baseUrl;
 
     private ProxyConfiguration proxyConfiguration;
+    
+    private File releaseOutputDirectory;
 
     public GeneralConfiguration()
     {
@@ -101,5 +103,14 @@
         return ReflectionToStringBuilder.toString( this );
     }
 
+    public File getReleaseOutputDirectory()
+    {
+        return releaseOutputDirectory;
+    }
+    
+    public void setReleaseOutputDirectory( File releaseOutputDirectory )
+    {
+        this.releaseOutputDirectory = releaseOutputDirectory;
+    }
 
 }

Added: continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultDao.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultDao.java?rev=693089&view=auto
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultDao.java (added)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultDao.java Mon Sep  8 06:27:15 2008
@@ -0,0 +1,45 @@
+package org.apache.continuum.dao;
+
+/*
+ * 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 java.util.List;
+
+import org.apache.continuum.model.release.ContinuumReleaseResult;
+import org.apache.maven.continuum.store.ContinuumObjectNotFoundException;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+
+/**
+ * @author <a href="mailto:ctan@apache.org">Maria Catherine Tan</a>
+ */
+public interface ContinuumReleaseResultDao
+{
+    ContinuumReleaseResult addContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumStoreException;
+
+    void removeContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumStoreException;
+
+    List<ContinuumReleaseResult> getContinuumReleaseResultsByProjectGroup( int projectGroupId );
+
+    List<ContinuumReleaseResult> getAllContinuumReleaseResults();
+
+    ContinuumReleaseResult getContinuumReleaseResult( int releaseResultId )
+        throws ContinuumObjectNotFoundException, ContinuumStoreException;
+}

Modified: continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/Continuum.java Mon Sep  8 06:27:15 2008
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.continuum.purge.ContinuumPurgeManager;
 import org.apache.continuum.repository.RepositoryService;
 import org.apache.maven.continuum.builddefinition.BuildDefinitionService;
@@ -645,4 +646,17 @@
     
     public void startup()
         throws ContinuumException;
+    
+    ContinuumReleaseResult addContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumException;
+
+    void removeContinuumReleaseResult( int releaseResultId )
+        throws ContinuumException;
+
+    ContinuumReleaseResult getContinuumReleaseResult( int releaseResultId )
+        throws ContinuumException;
+
+    List<ContinuumReleaseResult> getContinuumReleaseResultsByProjectGroup( int projectGroupId );
+
+    List<ContinuumReleaseResult> getAllContinuumReleaseResults();
 }

Modified: continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/configuration/ConfigurationService.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/configuration/ConfigurationService.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/configuration/ConfigurationService.java (original)
+++ continuum/trunk/continuum-api/src/main/java/org/apache/maven/continuum/configuration/ConfigurationService.java Mon Sep  8 06:27:15 2008
@@ -71,6 +71,15 @@
 
     File getTestReportsDirectory( int buildId, int projectId )
         throws ConfigurationException;
+    
+    File getReleaseOutputDirectory();
+    
+    void setReleaseOutputDirectory( File releaseOutputDirectory );
+    
+    File getReleaseOutputDirectory( int projectGroupId );
+    
+    File getReleaseOutputFile( int projectGroupId, String releaseName )
+        throws ConfigurationException;
 
     // ----------------------------------------------------------------------
     //

Modified: continuum/trunk/continuum-base/continuum-configuration/src/main/java/org/apache/continuum/configuration/DefaultContinuumConfiguration.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-base/continuum-configuration/src/main/java/org/apache/continuum/configuration/DefaultContinuumConfiguration.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-base/continuum-configuration/src/main/java/org/apache/continuum/configuration/DefaultContinuumConfiguration.java (original)
+++ continuum/trunk/continuum-base/continuum-configuration/src/main/java/org/apache/continuum/configuration/DefaultContinuumConfiguration.java Mon Sep  8 06:27:15 2008
@@ -143,6 +143,12 @@
                     .getProxyConfiguration().getProxyUser() );
                 this.generalConfiguration.setProxyConfiguration( proxyConfiguration );
             }
+            if ( StringUtils.isNotEmpty( configuration.getReleaseOutputDirectory() ) )
+            {
+                // TODO take care if file exists?
+                this.generalConfiguration.setReleaseOutputDirectory( new File( configuration
+                    .getReleaseOutputDirectory() ) );
+            }
         }
         catch ( IOException e )
         {
@@ -197,6 +203,11 @@
                                                                          this.generalConfiguration
                                                                              .getProxyConfiguration().getProxyHost() );
             }
+            if ( this.generalConfiguration.getReleaseOutputDirectory() != null )
+            {
+                configurationModel.setReleaseOutputDirectory( this.generalConfiguration.getReleaseOutputDirectory()
+                    .getPath() );
+            }
 
             ContinuumConfigurationModelXpp3Writer writer = new ContinuumConfigurationModelXpp3Writer();
             FileWriter fileWriter = new FileWriter( file );

Modified: continuum/trunk/continuum-base/continuum-configuration/src/main/mdo/continuum-configuration.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-base/continuum-configuration/src/main/mdo/continuum-configuration.xml?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-base/continuum-configuration/src/main/mdo/continuum-configuration.xml (original)
+++ continuum/trunk/continuum-base/continuum-configuration/src/main/mdo/continuum-configuration.xml Mon Sep  8 06:27:15 2008
@@ -60,7 +60,12 @@
             <type>ProxyConfiguration</type>
             <multiplicity>1</multiplicity>
           </association>          
-        </field>                     
+        </field>     
+        <field>
+          <name>releaseOutputDirectory</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+        </field>                
       </fields>
     </class>
     <class xml.tagName="proxy-configuration">

Modified: continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/configuration/DefaultConfigurationService.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/configuration/DefaultConfigurationService.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/configuration/DefaultConfigurationService.java (original)
+++ continuum/trunk/continuum-commons/src/main/java/org/apache/maven/continuum/configuration/DefaultConfigurationService.java Mon Sep  8 06:27:15 2008
@@ -244,6 +244,30 @@
         }
     }
 
+    public File getReleaseOutputDirectory()
+    {
+        File releaseOutputDirectory = generalConfiguration.getReleaseOutputDirectory();
+        if ( releaseOutputDirectory == null )
+        {
+            releaseOutputDirectory = getFile( systemConf.getReleaseOutputDirectory() );
+            setReleaseOutputDirectory( releaseOutputDirectory );
+        }
+        return releaseOutputDirectory;
+    }
+
+    public void setReleaseOutputDirectory( File releaseOutputDirectory )
+    {
+        File f = releaseOutputDirectory;
+        try
+        {
+            f = f.getCanonicalFile();
+        }
+        catch ( IOException e )
+        {
+        }
+        generalConfiguration.setReleaseOutputDirectory( f );
+    }
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -288,6 +312,35 @@
         return new File( dir, buildId + ".log.txt" );
     }
 
+    public File getReleaseOutputDirectory( int projectGroupId )
+    {
+        File dir = new File( getReleaseOutputDirectory(), Integer.toString( projectGroupId ) );
+        
+        try
+        {
+            dir = dir.getCanonicalFile();
+        }
+        catch ( IOException e )
+        {
+        }
+        
+        return dir;
+    }
+
+    public File getReleaseOutputFile( int projectGroupId, String name )
+        throws ConfigurationException
+    {
+        File dir = getReleaseOutputDirectory( projectGroupId );
+
+        if ( !dir.exists() && !dir.mkdirs() )
+        {
+            throw new ConfigurationException(
+                "Could not make the release output directory: " + "'" + dir.getAbsolutePath() + "'." );
+        }
+
+        return new File( dir, name + ".log.txt" );
+    }
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/DefaultContinuum.java Mon Sep  8 06:27:15 2008
@@ -37,11 +37,13 @@
 import org.apache.continuum.configuration.ContinuumConfigurationException;
 import org.apache.continuum.dao.BuildDefinitionDao;
 import org.apache.continuum.dao.BuildResultDao;
+import org.apache.continuum.dao.ContinuumReleaseResultDao;
 import org.apache.continuum.dao.DaoUtils;
 import org.apache.continuum.dao.NotifierDao;
 import org.apache.continuum.dao.ProjectDao;
 import org.apache.continuum.dao.ProjectGroupDao;
 import org.apache.continuum.dao.ScheduleDao;
+import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.continuum.purge.ContinuumPurgeManager;
 import org.apache.continuum.repository.RepositoryService;
 import org.apache.maven.continuum.build.settings.SchedulesActivationException;
@@ -162,6 +164,11 @@
     /**
      * @plexus.requirement
      */
+    private ContinuumReleaseResultDao releaseResultDao;
+
+    /**
+     * @plexus.requirement
+     */
     private ContinuumInitializer initializer;
 
     /**
@@ -338,6 +345,27 @@
             {
                 removeProject( ( (Project) o ).getId() );
             }
+            
+            List<ContinuumReleaseResult> releaseResults = releaseResultDao.getContinuumReleaseResultsByProjectGroup( projectGroupId );
+            
+            try
+            {
+                for ( ContinuumReleaseResult releaseResult : releaseResults )
+                {
+                    releaseResultDao.removeContinuumReleaseResult( releaseResult );
+                }
+                
+                File releaseOutputDirectory = configurationService.getReleaseOutputDirectory( projectGroupId );
+                FileUtils.deleteDirectory( releaseOutputDirectory );
+            }
+            catch ( ContinuumStoreException e )
+            {
+                throw new ContinuumException( "Error while deleting continuum release result of project group", e );
+            }
+            catch ( IOException e )
+            {
+                throw logAndCreateException( "Error while deleting project group release output directory.", e );
+            }
         }
 
         getLogger().info( "Remove project group " + projectGroup.getName() + "(" + projectGroup.getId() + ")" );
@@ -3273,4 +3301,76 @@
         return buildDefinitionService;
     }
 
+    public ContinuumReleaseResult addContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumException
+    {
+        try
+        {
+            return releaseResultDao.addContinuumReleaseResult( releaseResult );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new ContinuumException( "Error while adding continuumReleaseResult", e );
+        }
+    }
+
+    public void removeContinuumReleaseResult( int releaseResultId )
+        throws ContinuumException
+    {
+        ContinuumReleaseResult releaseResult = getContinuumReleaseResult( releaseResultId );
+
+        try
+        {
+            releaseResultDao.removeContinuumReleaseResult( releaseResult );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new ContinuumException( "Error while deleting continuumReleaseResult: " + releaseResultId, e );
+        }
+
+        try
+        {
+            int projectGroupId = releaseResult.getProjectGroup().getId();
+
+            String name = "releases-" + releaseResult.getStartTime();
+
+            File releaseFile = getConfiguration().getReleaseOutputFile( projectGroupId, name );
+
+            if ( releaseFile.exists() )
+            {
+                releaseFile.delete();
+            }
+        }
+        catch ( ConfigurationException e )
+        {
+            getLogger().info( "skip error during cleanup release files " + e.getMessage(), e );
+        }
+    }
+
+    public ContinuumReleaseResult getContinuumReleaseResult( int releaseResultId )
+        throws ContinuumException
+    {
+        try
+        {
+            return releaseResultDao.getContinuumReleaseResult( releaseResultId );
+        }
+        catch ( ContinuumObjectNotFoundException e )
+        {
+            throw new ContinuumException( "No continuumReleaseResult found: " + releaseResultId );
+        }
+        catch ( ContinuumStoreException e )
+        {
+            throw new ContinuumException( "Error while retrieving continuumReleaseResult: " + releaseResultId, e );
+        }
+    }
+
+    public List<ContinuumReleaseResult> getAllContinuumReleaseResults()
+    {
+        return releaseResultDao.getAllContinuumReleaseResults();
+    }
+
+    public List<ContinuumReleaseResult> getContinuumReleaseResultsByProjectGroup( int projectGroupId )
+    {
+        return releaseResultDao.getContinuumReleaseResultsByProjectGroup( projectGroupId );
+    }
 }

Modified: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/DefaultContinuumTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/DefaultContinuumTest.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/DefaultContinuumTest.java (original)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/DefaultContinuumTest.java Mon Sep  8 06:27:15 2008
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.repository.RepositoryService;
 import org.apache.maven.continuum.builddefinition.BuildDefinitionService;
@@ -436,7 +437,41 @@
         assertNotNull( retrievedRepository );
         assertEquals( repository, retrievedRepository );
     }
-    
+
+    public void testContinuumReleaseResult()
+        throws Exception
+    {
+        Continuum continuum = getContinuum();
+
+        ProjectGroup defaultProjectGroup = continuum.getProjectGroupByGroupId( Continuum.DEFAULT_PROJECT_GROUP_GROUP_ID );
+
+        assertEquals( 0, continuum.getAllContinuumReleaseResults().size() );
+
+        ContinuumReleaseResult releaseResult = new ContinuumReleaseResult();
+        releaseResult.setStartTime( System.currentTimeMillis() );
+
+        File logFile = continuum.getConfiguration().getReleaseOutputFile( defaultProjectGroup.getId(), 
+                                                                          "releases-" + releaseResult.getStartTime() );
+        logFile.mkdirs();
+
+        assertTrue( logFile.exists() );
+
+        releaseResult.setResultCode( 0 );
+        releaseResult.setEndTime( System.currentTimeMillis() );
+        releaseResult.setProjectGroup( defaultProjectGroup );
+
+        releaseResult = continuum.addContinuumReleaseResult( releaseResult );
+
+        List<ContinuumReleaseResult> releaseResults = continuum.getContinuumReleaseResultsByProjectGroup( defaultProjectGroup.getId() );
+        assertEquals( 1, releaseResults.size() );
+        assertEquals( releaseResult, releaseResults.get( 0 ) );
+
+        continuum.removeContinuumReleaseResult( releaseResult.getId() );
+        assertEquals( 0 , continuum.getAllContinuumReleaseResults().size() );
+        assertFalse( logFile.exists() );
+        assertEquals( defaultProjectGroup, continuum.getProjectGroupByGroupId( Continuum.DEFAULT_PROJECT_GROUP_GROUP_ID ) );
+    }
+
     private Continuum getContinuum()
         throws Exception
     {

Modified: continuum/trunk/continuum-model/pom.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-model/pom.xml?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-model/pom.xml (original)
+++ continuum/trunk/continuum-model/pom.xml Mon Sep  8 06:27:15 2008
@@ -63,7 +63,7 @@
           </execution>
         </executions>
         <configuration>
-          <version>1.1.1</version>
+          <version>1.1.2</version>
           <packageWithVersion>false</packageWithVersion>
           <model>src/main/mdo/continuum.xml</model>
         </configuration>

Modified: continuum/trunk/continuum-model/src/main/mdo/continuum.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-model/src/main/mdo/continuum.xml?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-model/src/main/mdo/continuum.xml (original)
+++ continuum/trunk/continuum-model/src/main/mdo/continuum.xml Mon Sep  8 06:27:15 2008
@@ -1206,6 +1206,12 @@
           <type>boolean</type>
           <defaultValue>false</defaultValue>
         </field>
+        <field>
+          <name>releaseOutputDirectory</name>
+          <version>1.1.2+</version>
+          <type>String</type>
+          <defaultValue>release-output-directory</defaultValue>
+        </field>
       </fields>
     </class>
 
@@ -1463,6 +1469,41 @@
         </field>
       </fields>
     </class>
-        
+       
+    <class>
+      <name>ContinuumReleaseResult</name>
+      <version>1.1.2+</version>
+      <packageName>org.apache.continuum.model.release</packageName>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>1.1.2+</version>
+          <identifier>true</identifier>
+          <type>int</type>
+        </field>
+        <field>
+          <name>startTime</name>
+          <version>1.1.2+</version>
+          <type>long</type>
+        </field>
+        <field>
+          <name>endTime</name>
+          <version>1.1.2+</version>
+          <type>long</type>
+        </field>
+        <field>
+          <name>resultCode</name>
+          <version>1.1.2+</version>
+          <type>int</type>
+        </field>
+        <field>
+          <name>projectGroup</name>
+          <version>1.1.2+</version>
+          <association xml.reference="true" stash.part="true" jpox.dependent="false">
+            <type>ProjectGroup</type>
+          </association>
+        </field>
+      </fields>
+    </class> 
   </classes>
 </model>

Added: continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultImpl.java?rev=693089&view=auto
==============================================================================
--- continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultImpl.java (added)
+++ continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/ContinuumReleaseResultImpl.java Mon Sep  8 06:27:15 2008
@@ -0,0 +1,92 @@
+package org.apache.continuum.dao;
+
+/*
+ * 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 java.util.List;
+
+import javax.jdo.Extent;
+import javax.jdo.PersistenceManager;
+import javax.jdo.Query;
+import javax.jdo.Transaction;
+
+import org.apache.continuum.model.release.ContinuumReleaseResult;
+import org.apache.maven.continuum.store.ContinuumObjectNotFoundException;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+
+/**
+ * @author <a href="mailto:ctan@apache.org">Maria Catherine Tan</a>
+ * @plexus.component role="org.apache.continuum.dao.ContinuumReleaseResultDao"
+ */
+public class ContinuumReleaseResultImpl
+    extends AbstractDao
+    implements ContinuumReleaseResultDao
+{
+    public ContinuumReleaseResult addContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumStoreException
+    {
+        return (ContinuumReleaseResult) addObject( releaseResult );
+    }
+
+    public List<ContinuumReleaseResult> getAllContinuumReleaseResults()
+    {
+        return getAllObjectsDetached( ContinuumReleaseResult.class );
+    }
+
+    public ContinuumReleaseResult getContinuumReleaseResult( int releaseResultId )
+        throws ContinuumObjectNotFoundException, ContinuumStoreException
+    {
+        return (ContinuumReleaseResult) getObjectById( ContinuumReleaseResult.class, releaseResultId );
+    }
+
+    public List<ContinuumReleaseResult> getContinuumReleaseResultsByProjectGroup( int projectGroupId )
+    {
+        PersistenceManager pm = getPersistenceManager();
+
+        Transaction tx = pm.currentTransaction();
+
+        try
+        {
+            tx.begin();
+
+            Extent extent = pm.getExtent( ContinuumReleaseResult.class, true );
+
+            Query query = pm.newQuery( extent, "projectGroup.id == " + projectGroupId );
+
+            List result = (List) query.execute();
+
+            result = (List) pm.detachCopyAll( result );
+
+            tx.commit();
+
+            return result;
+        }
+        finally
+        {
+            rollback( tx );
+        }
+    }
+
+    public void removeContinuumReleaseResult( ContinuumReleaseResult releaseResult )
+        throws ContinuumStoreException
+    {
+        removeObject( releaseResult );
+    }
+
+}

Modified: continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/DaoUtilsImpl.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/DaoUtilsImpl.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/DaoUtilsImpl.java (original)
+++ continuum/trunk/continuum-store/src/main/java/org/apache/continuum/dao/DaoUtilsImpl.java Mon Sep  8 06:27:15 2008
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.continuum.model.repository.DirectoryPurgeConfiguration;
 import org.apache.continuum.model.repository.LocalRepository;
 import org.apache.continuum.model.repository.RepositoryPurgeConfiguration;
@@ -75,6 +76,7 @@
     {
         PlexusJdoUtils.removeAll( getPersistenceManager(), BuildDefinitionTemplate.class );
         PlexusJdoUtils.removeAll( getPersistenceManager(), BuildResult.class );
+        PlexusJdoUtils.removeAll( getPersistenceManager(), ContinuumReleaseResult.class );
         PlexusJdoUtils.removeAll( getPersistenceManager(), ProjectGroup.class );
         PlexusJdoUtils.removeAll( getPersistenceManager(), Project.class );
         PlexusJdoUtils.removeAll( getPersistenceManager(), BuildDefinition.class );

Modified: continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/AbstractContinuumTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/AbstractContinuumTest.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/AbstractContinuumTest.java (original)
+++ continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/AbstractContinuumTest.java Mon Sep  8 06:27:15 2008
@@ -131,6 +131,8 @@
         configurationService.setBuildOutputDirectory( getTestFile( "target/build-output" ) );
 
         configurationService.setWorkingDirectory( getTestFile( "target/working-directory" ) );
+        
+        configurationService.setReleaseOutputDirectory( getTestFile( "target/release-outpur" ) );
 
         configurationService.store();
     }

Modified: continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java (original)
+++ continuum/trunk/continuum-test/src/main/java/org/apache/maven/continuum/configuration/ConfigurationServiceMock.java Mon Sep  8 06:27:15 2008
@@ -207,4 +207,33 @@
 
     }
 
+    public File getReleaseOutputDirectory()
+    {
+        return new File( basedir, "src/test/resources" + "/" + "release-output-directory" );
+    }
+
+    public File getReleaseOutputDirectory( int projectGroupId )
+    {
+        return new File( getReleaseOutputDirectory(), Integer.toString( projectGroupId ) );
+    }
+
+    public File getReleaseOutputFile( int projectGroupId, String releaseName )
+        throws ConfigurationException
+    {
+        File dir = getReleaseOutputDirectory( projectGroupId );
+
+        if ( !dir.exists() && !dir.mkdirs() )
+        {
+            throw new ConfigurationException(
+                "Could not make the release output directory: " + "'" + dir.getAbsolutePath() + "'." );
+        }
+    
+        return new File( dir, releaseName + ".log.txt" );
+    }
+
+    public void setReleaseOutputDirectory( File releaseOutputDirectory )
+    {
+    }
+
+
 }

Added: continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ReleaseResultAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ReleaseResultAction.java?rev=693089&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ReleaseResultAction.java (added)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/continuum/web/action/ReleaseResultAction.java Mon Sep  8 06:27:15 2008
@@ -0,0 +1,258 @@
+package org.apache.continuum.web.action;
+
+/*
+ * 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.continuum.model.release.ContinuumReleaseResult;
+import org.apache.maven.continuum.ContinuumException;
+import org.apache.maven.continuum.configuration.ConfigurationException;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.web.action.ContinuumConfirmAction;
+import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
+import org.apache.maven.shared.release.ReleaseResult;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:ctan@apache.org">Maria Catherine Tan</a>
+ * @plexus.component role="com.opensymphony.xwork.Action" role-hint="releaseResult"
+ */
+public class ReleaseResultAction
+    extends ContinuumConfirmAction
+{
+    private int projectGroupId;
+    
+    private int releaseResultId;
+    
+    private List<ContinuumReleaseResult> releaseResults;
+    
+    private List<String> selectedReleaseResults;
+    
+    private ProjectGroup projectGroup;
+    
+    private ReleaseResult result;
+    
+    private boolean confirmed;
+    
+    public String list()
+        throws ContinuumException
+    {
+        try
+        {
+            checkViewProjectGroupAuthorization( getProjectGroupName() );
+        }
+        catch ( AuthorizationRequiredException authzE )
+        {
+            addActionError( authzE.getMessage() );
+            return REQUIRES_AUTHORIZATION;
+        }
+        
+        releaseResults = getContinuum().getContinuumReleaseResultsByProjectGroup( projectGroupId );
+        
+        return SUCCESS;
+
+    }
+    
+    public String remove()
+        throws ContinuumException
+    {
+        try
+        {
+            checkModifyProjectGroupAuthorization( getProjectGroupName() );
+        }
+        catch ( AuthorizationRequiredException e )
+        {
+            return REQUIRES_AUTHORIZATION;
+        }
+     
+        if ( confirmed )
+        {
+            if ( selectedReleaseResults != null && !selectedReleaseResults.isEmpty() )
+            {
+                for ( String id : selectedReleaseResults )
+                {
+                    int resultId = Integer.parseInt( id );
+
+                    try
+                    {
+                        getLogger().info( "Removing ContinuumReleaseResult with id=" + resultId );
+
+                        getContinuum().removeContinuumReleaseResult( resultId );
+                    }
+                    catch ( ContinuumException e )
+                    {
+                        getLogger().error( "Error removing ContinuumReleaseResult with id=" + resultId );
+                        addActionError( "Unable to remove ContinuumReleaseResult with id=" + resultId );
+                    }
+                }
+            }
+            return SUCCESS;
+        }
+        
+        return CONFIRM;
+    }
+    
+    public String viewResult()
+        throws ContinuumException
+    {
+        try
+        {
+            checkViewProjectGroupAuthorization( getProjectGroupName() );
+        }
+        catch ( AuthorizationRequiredException authzE )
+        {
+            addActionError( authzE.getMessage() );
+            return REQUIRES_AUTHORIZATION;
+        }
+        
+        ContinuumReleaseResult releaseResult = getContinuum().getContinuumReleaseResult( releaseResultId );
+        
+        result = new ReleaseResult();
+        result.setStartTime( releaseResult.getStartTime() );
+        result.setEndTime( releaseResult.getEndTime() );
+        result.setResultCode( releaseResult.getResultCode() );
+        
+        try
+        {
+            File logFile = getContinuum().getConfiguration().getReleaseOutputFile( projectGroupId, "releases-" + releaseResult.getStartTime() );
+            StringBuilder output = new StringBuilder();
+            
+            BufferedReader reader = new BufferedReader( new FileReader( logFile ) );
+            char[] buf = new char[1024];
+            int numRead=0;
+            
+            while( ( numRead = reader.read( buf ) ) != -1 )
+            {
+                output.append( buf, 0, numRead );
+            }
+            reader.close();
+            
+            result.appendOutput( output.toString() );
+        }
+        catch ( ConfigurationException e )
+        {
+            //getLogger().error( "" );
+        }
+        catch ( IOException e )
+        {
+            //getLogger().error( "" );
+        }
+        
+        return SUCCESS;
+    }
+    
+    public String getProjectGroupName()
+        throws ContinuumException
+    {
+    
+        return getProjectGroup( projectGroupId ).getName();
+    }
+    
+    public ProjectGroup getProjectGroup( int projectGroupId )
+        throws ContinuumException
+    {
+        if ( projectGroup == null )
+        {
+            projectGroup = getContinuum().getProjectGroup( projectGroupId );
+        }
+        else
+        {
+            if ( projectGroup.getId() != projectGroupId )
+            {
+                projectGroup = getContinuum().getProjectGroup( projectGroupId );
+            }
+        }
+    
+        return projectGroup;
+    }
+    
+    public ProjectGroup getProjectGroup()
+    {
+        return projectGroup;
+    }
+    
+    public void setProjectGroup( ProjectGroup projectGroup )
+    {
+        this.projectGroup = projectGroup;
+    }
+    
+    public int getProjectGroupId()
+    {
+        return projectGroupId;
+    }
+    
+    public void setProjectGroupId( int projectGroupId )
+    {
+        this.projectGroupId = projectGroupId;
+    }
+    
+    public int getReleaseResultId()
+    {
+        return releaseResultId;
+    }
+    
+    public void setReleaseResultId( int releaseResultId )
+    {
+        this.releaseResultId = releaseResultId;
+    }
+    
+    public List<ContinuumReleaseResult> getReleaseResults()
+    {
+        return releaseResults;
+    }
+    
+    public void setReleaseResults( List<ContinuumReleaseResult> releaseResults )
+    {
+        this.releaseResults = releaseResults;
+    }
+
+    public List<String> getSelectedReleaseResults()
+    {
+        return selectedReleaseResults;
+    }
+    
+    public void setSelectedReleaseResults( List<String> selectedReleaseResults )
+    {
+        this.selectedReleaseResults = selectedReleaseResults;
+    }
+    
+    public ReleaseResult getResult()
+    {
+        return result;
+    }
+    
+    public void setResult( ReleaseResult result )
+    {
+        this.result = result;
+    }
+    
+    public boolean isConfirmed()
+    {
+        return confirmed;
+    }
+    
+    public void setConfirmed( boolean confirmed )
+    {
+        this.confirmed = confirmed;
+    }
+}

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/ReleaseInProgressAction.java Mon Sep  8 06:27:15 2008
@@ -19,7 +19,16 @@
  * under the License.
  */
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import org.apache.continuum.model.release.ContinuumReleaseResult;
 import org.apache.maven.continuum.ContinuumException;
+import org.apache.maven.continuum.configuration.ConfigurationException;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
 import org.apache.maven.continuum.release.ContinuumReleaseManager;
 import org.apache.maven.continuum.release.ContinuumReleaseManagerListener;
 import org.apache.maven.continuum.web.exception.AuthorizationRequiredException;
@@ -82,6 +91,14 @@
             throw new Exception( "There is no on-going or finished release operation with id " + releaseId );
         }
 
+        if ( status.equals( SUCCESS ) )
+        {
+            ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( releaseId );
+
+            ContinuumReleaseResult releaseResult = createContinuumReleaseResult( result );
+            getContinuum().addContinuumReleaseResult( releaseResult );
+        }
+
         return status;
     }
 
@@ -180,4 +197,39 @@
 
         return projectGroupName;
     }
+
+    private ContinuumReleaseResult createContinuumReleaseResult( ReleaseResult result )
+        throws ContinuumException
+    {
+        ContinuumReleaseResult releaseResult = new ContinuumReleaseResult();
+        releaseResult.setStartTime( result.getStartTime() );
+        releaseResult.setEndTime( result.getEndTime() );
+        releaseResult.setResultCode( result.getResultCode() );
+
+        Project project = getContinuum().getProject( projectId );
+        ProjectGroup projectGroup = project.getProjectGroup();
+        releaseResult.setProjectGroup( projectGroup );
+
+        String releaseName = "releases-" + result.getStartTime();
+
+        try
+        {
+            File logFile = getContinuum().getConfiguration().getReleaseOutputFile( projectGroup.getId(), releaseName );
+
+            PrintWriter writer = new PrintWriter( new FileWriter( logFile ) );
+            writer.write( result.getOutput() );
+            writer.close();
+        }
+        catch ( ConfigurationException e )
+        {
+            throw new ContinuumException( e.getMessage(), e );
+        }
+        catch ( IOException e )
+        {
+            throw new ContinuumException( "Unable to write output to file", e );
+        }
+
+        return releaseResult;
+    }
+
 }

Modified: continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/ConfigurationAction.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/ConfigurationAction.java?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/ConfigurationAction.java (original)
+++ continuum/trunk/continuum-webapp/src/main/java/org/apache/maven/continuum/web/action/admin/ConfigurationAction.java Mon Sep  8 06:27:15 2008
@@ -54,6 +54,8 @@
     private String deploymentRepositoryDirectory;
 
     private String baseUrl;
+    
+    private String releaseOutputDirectory;
 
     public void prepare()
     {
@@ -86,6 +88,12 @@
                 request.getContextPath();
             getLogger().info( "baseUrl='" + baseUrl + "'" );
         }
+
+        File releaseOutputDirectoryFile = configuration.getReleaseOutputDirectory();
+        if ( releaseOutputDirectoryFile != null )
+        {
+            releaseOutputDirectory = releaseOutputDirectoryFile.getAbsolutePath();
+        }
     }
 
     public String input()
@@ -115,6 +123,8 @@
 
         configuration.setInitialized( true );
 
+        configuration.setReleaseOutputDirectory( new File( releaseOutputDirectory ) );
+
         configuration.store();
 
         return SUCCESS;
@@ -169,4 +179,14 @@
 
         return bundle;
     }
+
+    public String getReleaseOutputDirectory()
+    {
+        return releaseOutputDirectory;
+    }
+
+    public void setReleaseOutputDirectory( String releaseOutputDirectory )
+    {
+        this.releaseOutputDirectory = releaseOutputDirectory;
+    }
 }

Modified: continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/localization/Continuum.properties Mon Sep  8 06:27:15 2008
@@ -180,6 +180,7 @@
 projectGroup.buildDefinition.label = Default Build Definition
 projectGroup.addProject.label = Add New Project
 projectGroup.repository.label = Local Repository
+projectGroup.tab.releaseResults = Release Results
 
 # ----------------------------------------------------------------------
 # Page: Project Group - Members
@@ -234,6 +235,8 @@
 configuration.companyName.message = Enter the company name
 configuration.companyLogo.message = Enter the company logo
 configuration.companyUrl.message = Enter the URL of the official company website
+configuration.releaseOutputDirectory.label = Release Output Directory
+configuration.releaseOutputDirectory.message = Enter the release output directory of the Continuum web application
 
 # ----------------------------------------------------------------------
 # Page: Add Project
@@ -892,3 +895,21 @@
 purgeConfig.description.label = Description
 purgeConfig.enabled.label = Enabled
 purgeConfig.no.repositories = No repositories to purge
+
+# ----------------------------------------------------------------------
+# Page: Release Results
+# ----------------------------------------------------------------------
+projectGroup.releaseResults.section.title = Release Results of {0} group
+releaseResults.viewResult = View Result
+releaseResults.state = State
+releaseResults.startTime = Start Time
+releaseResults.endTime = End Time
+releaseResults.success = SUCCESSFUL
+releaseResults.error = ERROR
+
+# ----------------------------------------------------------------------
+# Page: Confirm Delete Release Results
+# ----------------------------------------------------------------------
+deleteReleaseResults.page.title = Continuum - Delete Release Results
+deleteReleaseResults.section.title = Delete Release Results
+deleteReleaseResults.confirmation.message = Are you sure you want to delete {0} release results ?
\ No newline at end of file

Modified: continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction-configuration-validation.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction-configuration-validation.xml?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction-configuration-validation.xml (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction-configuration-validation.xml Mon Sep  8 06:27:15 2008
@@ -40,4 +40,9 @@
       <message key="configuration.baseUrl.invalid"/>
     </field-validator>
   </field>
+  <field name="releaseOutputDirectory">
+    <field-validator type="requiredstring">
+      <message key="configuration.releaseOutputDirectory.required"/>
+    </field-validator>
+  </field>
 </validators>

Modified: continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction.properties
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction.properties?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction.properties (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/org/apache/maven/continuum/web/action/admin/ConfigurationAction.properties Mon Sep  8 06:27:15 2008
@@ -21,3 +21,4 @@
 configuration.buildOutputDirectory.required = You must define a build output directory.
 configuration.baseUrl.required = You must define a URL.
 configuration.baseUrl.invalid = You must define a valid URL.
+configuration.releaseOutputDirectory.required = You must define a release output directory.
\ No newline at end of file

Modified: continuum/trunk/continuum-webapp/src/main/resources/xwork.xml
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/resources/xwork.xml?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/resources/xwork.xml (original)
+++ continuum/trunk/continuum-webapp/src/main/resources/xwork.xml Mon Sep  8 06:27:15 2008
@@ -526,6 +526,21 @@
       <result name="success">/WEB-INF/jsp/releaseViewResult.jsp</result>
     </action>
 
+    <action name="viewReleaseResult" class="releaseResult" method="viewResult">
+      <result name="success">/WEB-INF/jsp/releaseViewResult.jsp</result>
+    </action>
+
+    <action name="projectGroupReleaseResults" class="releaseResult" method="list">
+      <result name="success">/WEB-INF/jsp/projectGroupReleaseResults.jsp</result>
+    </action>
+
+    <action name="removeReleaseResults" class="releaseResult" method="remove">
+      <result name="confirm">/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp</result>
+      <result name="success" type="redirect-action">
+        <param name="actionName">projectGroupReleaseResults</param>
+        <param name="projectGroupId">${projectGroupId}</param>
+      </result>
+    </action>
   </package>
 
   <!--

Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configuration.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configuration.jsp?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configuration.jsp (original)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configuration.jsp Mon Sep  8 06:27:15 2008
@@ -36,6 +36,7 @@
       <table border="1" cellspacing="2" cellpadding="3" width="100%">
         <c1:data label="%{getText('configuration.workingDirectory.label')}" name="workingDirectory"/>
         <c1:data label="%{getText('configuration.buildOutputDirectory.label')}" name="buildOutputDirectory"/>
+        <c1:data label="%{getText('configuration.releaseOutputDirectory.label')}" name="releaseOutputDirectory"/>
         <c1:data label="%{getText('configuration.deploymentRepositoryDirectory.label')}"
                  name="deploymentRepositoryDirectory"/>
         <c1:data label="%{getText('configuration.baseUrl.label')}" name="baseUrl"/>

Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configurationEdit.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configurationEdit.jsp?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configurationEdit.jsp (original)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/admin/configurationEdit.jsp Mon Sep  8 06:27:15 2008
@@ -61,6 +61,13 @@
               </p></ww:param>
             </ww:textfield>
 
+            <ww:textfield label="%{getText('configuration.releaseOutputDirectory.label')}" name="releaseOutputDirectory"
+                          required="true">
+              <ww:param name="desc"><p>
+                <ww:text name="configuration.releaseOutputDirectory.message"/>
+              </ww:param>
+            </ww:textfield>
+
             <ww:textfield label="%{getText('configuration.deploymentRepositoryDirectory.label')}"
                           name="deploymentRepositoryDirectory">
               <ww:param name="desc"><p>

Modified: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectGroupTabComponent.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectGroupTabComponent.jsp?rev=693089&r1=693088&r2=693089&view=diff
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectGroupTabComponent.jsp (original)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/components/projectGroupTabComponent.jsp Mon Sep  8 06:27:15 2008
@@ -39,6 +39,9 @@
         <ww:url id="projectGroupNotifierUrl" action="projectGroupNotifier" includeParams="none">
           <ww:param name="projectGroupId" value="projectGroupId"/>
         </ww:url>
+        <ww:url id="projectGroupReleaseResultsUrl" action="projectGroupReleaseResults" includeParams="none">
+          <ww:param name="projectGroupId" value="projectGroupId"/>
+        </ww:url>
 
         <ww:set name="tabName" value="tabName"/>
         <c:choose>
@@ -76,6 +79,15 @@
                 <b style="border: 1px solid #DFDEDE; padding-left: 1em; padding-right: 1em;"><ww:text name="projectGroup.tab.notifiers"/></b>
             </c:otherwise>
         </c:choose>
+        
+        <c:choose>
+            <c:when test="${tabName != 'ReleaseResults'}">
+                <a style="border: 1px solid #DFDEDE; padding-left: 1em; padding-right: 1em; text-decoration: none;" href="${projectGroupReleaseResultsUrl}"><ww:text name="projectGroup.tab.releaseResults"/></a>
+            </c:when>
+            <c:otherwise>
+                <b style="border: 1px solid #DFDEDE; padding-left: 1em; padding-right: 1em;"><ww:text name="projectGroup.tab.releaseResults"/></b>
+            </c:otherwise>
+        </c:choose>
       </p>
     </div>
   </div>

Added: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp?rev=693089&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp (added)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/confirmReleaseResultsRemoval.jsp Mon Sep  8 06:27:15 2008
@@ -0,0 +1,55 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ taglib uri="/webwork" prefix="ww" %>
+<%@ taglib uri="continuum" prefix="c1" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<html>
+  <ww:i18n name="localization.Continuum">
+    <head>
+        <title><ww:text name="deleteReleaseResults.page.title"/></title>
+    </head>
+    <body>
+      <div id="axial" class="h3">
+        <h3><ww:text name="deleteReleseResults.section.title"/></h3>
+
+        <div class="warningmessage">
+          <p>
+            <strong>
+                <ww:text name="deleteReleaseResults.confirmation.message">
+                    <ww:param><ww:property value="%{selectedReleaseResults.size}"/></ww:param>
+                </ww:text>
+            </strong>
+          </p>
+        </div>
+        
+        <div class="functnbar3">
+          <ww:form action="removeReleaseResults" method="post">
+            <ww:iterator value="selectedReleaseResults">
+              <input type="hidden" value="<ww:property/>" name="selectedReleaseResults"/>
+            </ww:iterator>
+            <input type="hidden" name="projectGroupId" value="${projectGroupId}" />
+            <ww:hidden name="confirmed" value="true"/>
+            <c1:submitcancel value="%{getText('delete')}" cancel="%{getText('cancel')}"/>
+          </ww:form>
+        </div>
+      </div>
+    </body>
+  </ww:i18n>
+</html>
\ No newline at end of file

Added: continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupReleaseResults.jsp
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupReleaseResults.jsp?rev=693089&view=auto
==============================================================================
--- continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupReleaseResults.jsp (added)
+++ continuum/trunk/continuum-webapp/src/main/webapp/WEB-INF/jsp/projectGroupReleaseResults.jsp Mon Sep  8 06:27:15 2008
@@ -0,0 +1,95 @@
+<%--
+  ~ 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.
+  --%>
+
+<%@ taglib uri="/webwork" prefix="ww" %>
+<%@ taglib uri="http://www.extremecomponents.org" prefix="ec" %>
+<%@ taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
+<%@ taglib uri="continuum" prefix="c1" %>
+<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://plexus.codehaus.org/redback/taglib-1.0" prefix="redback" %>
+
+<html>
+  <ww:i18n name="localization.Continuum">
+    <head>
+      <title><ww:text name="projectGroup.page.title"/></title>
+    </head>
+
+    <body>
+      <div id="h3">
+
+      <ww:action name="projectGroupTab" executeResult="true">
+        <ww:param name="tabName" value="'ReleaseResults'"/>
+      </ww:action>
+    
+      <h3><ww:text name="projectGroup.releaseResults.section.title"><ww:param>${projectGroup.name}</ww:param></ww:text></h3>
+      
+      <form id="releaseResultsForm" action="removeReleaseResults.action" method="post">
+        <ww:hidden name="projectGroupId"/>
+        <ec:table items="releaseResults"
+                var="result"
+                showExports="false"
+                showPagination="false"
+                showStatusBar="false"
+                filterable="false"
+                sortable="false">
+          <ec:row highlightRow="true">
+            <redback:ifAuthorized permission="continuum-modify-group" resource="${projectGroup.name}">
+              <ec:column alias="selectedReleaseResults" title=" " style="width:5px" filterable="false" sortable="false" headerCell="selectAll">
+                <input type="checkbox" name="selectedReleaseResults" value="${result.id}" />
+              </ec:column>
+            </redback:ifAuthorized>
+            <ec:column property="startTime" title="releaseResults.startTime" cell="date"/>
+            <ec:column property="endTime" title="releaseResults.endTime" cell="date"/>
+            <ec:column property="resultCode" title="releaseResults.state">
+              <ww:if test="${pageScope.result.resultCode == 0}">
+                <ww:text name="releaseViewResult.success"/>
+              </ww:if>
+              <ww:else>
+                <ww:text name="releaseViewResult.error"/>
+              </ww:else>
+            </ec:column>
+            <ec:column property="actions" title="&nbsp;">
+               <ww:url id="viewReleaseResultUrl" action="viewReleaseResult">
+                 <ww:param name="releaseResultId" value="${pageScope.result.id}"/>
+                 <ww:param name="projectGroupId" value="${projectGroupId}"/>
+               </ww:url>
+               <ww:a href="%{viewReleaseResultUrl}"><ww:text name="releaseResults.viewResult"/></ww:a>
+             </ec:column>
+          </ec:row>
+        </ec:table>
+        <ww:if test="${not empty releaseResults}">
+          <div class="functnbar3">
+            <table>
+              <tbody>
+                <tr>
+                  <td>
+                    <redback:ifAuthorized permission="continuum-modify-group" resource="${projectGroup.name}">
+                      <input type="button" name="delete-release-results" value="<ww:text name="delete"/>" onclick="document.forms.releaseResultsForm.submit();" />
+                    </redback:ifAuthorized>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </ww:if>
+      </form>
+      </div>
+    </body>
+  </ww:i18n>
+</html>
\ No newline at end of file