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

svn commit: r1051732 [1/4] - in /archiva/trunk/archiva-modules: archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiv...

Author: brett
Date: Wed Dec 22 01:53:10 2010
New Revision: 1051732

URL: http://svn.apache.org/viewvc?rev=1051732&view=rev
Log:
[MRM-1327] add exception handling to the metadata repository implementation

Added:
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepositoryException.java
      - copied, changed from r1050283, archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolutionException.java
Modified:
    archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java
    archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java
    archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
    archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
    archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java
    archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/ShowArtifactActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryActionTest.java
    archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/reports/GenerateReportActionTest.java
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/DefaultMetadataResolver.java
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataRepository.java
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolutionException.java
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/main/java/org/apache/archiva/metadata/repository/MetadataResolver.java
    archiva/trunk/archiva-modules/metadata/metadata-repository-api/src/test/java/org/apache/archiva/metadata/repository/AbstractMetadataRepositoryTest.java
    archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/AuditManager.java
    archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/DefaultAuditManager.java
    archiva/trunk/archiva-modules/plugins/audit/src/main/java/org/apache/archiva/audit/MetadataAuditListener.java
    archiva/trunk/archiva-modules/plugins/audit/src/test/java/org/apache/archiva/audit/AuditManagerTest.java
    archiva/trunk/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/dependency/tree/maven2/DefaultDependencyTreeBuilder.java
    archiva/trunk/archiva-modules/plugins/maven2-repository/src/main/java/org/apache/archiva/metadata/repository/storage/maven2/Maven2RepositoryMetadataResolver.java
    archiva/trunk/archiva-modules/plugins/metadata-store-jcr/src/main/java/org/apache/archiva/metadata/repository/jcr/JcrMetadataRepository.java
    archiva/trunk/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/RepositoryProblemEventListener.java
    archiva/trunk/archiva-modules/plugins/problem-reports/src/main/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumer.java
    archiva/trunk/archiva-modules/plugins/problem-reports/src/test/java/org/apache/archiva/reports/consumers/DuplicateArtifactsConsumerTest.java
    archiva/trunk/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/DefaultRepositoryStatisticsManager.java
    archiva/trunk/archiva-modules/plugins/repository-statistics/src/main/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManager.java
    archiva/trunk/archiva-modules/plugins/repository-statistics/src/test/java/org/apache/archiva/metadata/repository/stats/RepositoryStatisticsManagerTest.java

Modified: archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java (original)
+++ archiva/trunk/archiva-modules/archiva-base/archiva-consumers/archiva-metadata-consumer/src/main/java/org/apache/archiva/consumers/metadata/ArchivaMetadataCreationConsumer.java Wed Dec 22 01:53:10 2010
@@ -23,6 +23,7 @@ import org.apache.archiva.metadata.model
 import org.apache.archiva.metadata.model.ProjectMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.metadata.repository.storage.StorageMetadataResolver;
 import org.apache.maven.archiva.common.utils.VersionUtil;
@@ -169,15 +170,24 @@ public class ArchivaMetadataCreationCons
             createVersionMetadata = true;
         }
 
-        // TODO: transaction
-        // read the metadata and update it if it is newer or doesn't exist
-        artifact.setWhenGathered( whenGathered );
-        metadataRepository.updateArtifact( repoId, project.getNamespace(), project.getId(), projectVersion, artifact );
-        if ( createVersionMetadata )
+        try
+        {
+            // TODO: transaction
+            // read the metadata and update it if it is newer or doesn't exist
+            artifact.setWhenGathered( whenGathered );
+            metadataRepository.updateArtifact( repoId, project.getNamespace(), project.getId(), projectVersion,
+                                               artifact );
+            if ( createVersionMetadata )
+            {
+                metadataRepository.updateProjectVersion( repoId, project.getNamespace(), project.getId(),
+                                                         versionMetadata );
+            }
+            metadataRepository.updateProject( repoId, project );
+        }
+        catch ( MetadataRepositoryException e )
         {
-            metadataRepository.updateProjectVersion( repoId, project.getNamespace(), project.getId(), versionMetadata );
+            log.warn( "Error occurred persisting metadata for artifact: " + path + "; message: " + e.getMessage(), e );
         }
-        metadataRepository.updateProject( repoId, project );
     }
 
     public void processFile( String path, boolean executeOnEntireRepo )

Modified: archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java (original)
+++ archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutor.java Wed Dec 22 01:53:10 2010
@@ -19,8 +19,7 @@ package org.apache.archiva.scheduler.rep
  * under the License.
  */
 
-import java.util.Date;
-
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.archiva.repository.scanner.RepositoryContentConsumers;
@@ -38,6 +37,8 @@ import org.codehaus.plexus.taskqueue.exe
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Date;
+
 /**
  * ArchivaRepositoryScanningTaskExecutor
  *
@@ -80,7 +81,7 @@ public class ArchivaRepositoryScanningTa
         log.info( "Initialized " + this.getClass().getName() );
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public void executeTask( Task task )
         throws TaskExecutionException
     {
@@ -103,8 +104,8 @@ public class ArchivaRepositoryScanningTa
             throw new TaskExecutionException( "Unable to execute RepositoryTask with blank repository Id." );
         }
 
-        ManagedRepositoryConfiguration arepo =
-            archivaConfiguration.getConfiguration().findManagedRepositoryById( repoId );
+        ManagedRepositoryConfiguration arepo = archivaConfiguration.getConfiguration().findManagedRepositoryById(
+            repoId );
 
         // execute consumers on resource file if set
         if ( repoTask.getResourceFile() != null )
@@ -117,50 +118,66 @@ public class ArchivaRepositoryScanningTa
             log.info( "Executing task from queue with job name: " + repoTask );
 
             // otherwise, execute consumers on whole repository
-            try
+            if ( arepo == null )
             {
-                if ( arepo == null )
-                {
-                    throw new TaskExecutionException(
-                        "Unable to execute RepositoryTask with invalid repository id: " + repoId );
-                }
+                throw new TaskExecutionException(
+                    "Unable to execute RepositoryTask with invalid repository id: " + repoId );
+            }
 
-                long sinceWhen = RepositoryScanner.FRESH_SCAN;
-                long previousFileCount = 0;
+            long sinceWhen = RepositoryScanner.FRESH_SCAN;
+            long previousFileCount = 0;
 
-                if ( !repoTask.isScanAll() )
+            if ( !repoTask.isScanAll() )
+            {
+                RepositoryStatistics previousStats;
+                try
+                {
+                    previousStats = repositoryStatisticsManager.getLastStatistics( repoId );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    throw new TaskExecutionException( "Unable to get previous statistics: " + e.getMessage(), e );
+                }
+                if ( previousStats != null )
                 {
-                    RepositoryStatistics previousStats = repositoryStatisticsManager.getLastStatistics( repoId );
-                    if ( previousStats != null )
-                    {
-                        sinceWhen = previousStats.getScanStartTime().getTime();
-                        previousFileCount = previousStats.getTotalFileCount();
-                    }
+                    sinceWhen = previousStats.getScanStartTime().getTime();
+                    previousFileCount = previousStats.getTotalFileCount();
                 }
+            }
 
-                RepositoryScanStatistics stats = repoScanner.scan( arepo, sinceWhen );
+            RepositoryScanStatistics stats;
+            try
+            {
+                stats = repoScanner.scan( arepo, sinceWhen );
+            }
+            catch ( RepositoryScannerException e )
+            {
+                throw new TaskExecutionException( "Repository error when executing repository job.", e );
+            }
 
-                log.info( "Finished first scan: " + stats.toDump( arepo ) );
+            log.info( "Finished first scan: " + stats.toDump( arepo ) );
 
-                // further statistics will be populated by the following method
-                Date endTime = new Date( stats.getWhenGathered().getTime() + stats.getDuration() );
+            // further statistics will be populated by the following method
+            Date endTime = new Date( stats.getWhenGathered().getTime() + stats.getDuration() );
+            try
+            {
                 repositoryStatisticsManager.addStatisticsAfterScan( repoId, stats.getWhenGathered(), endTime,
                                                                     stats.getTotalFileCount(),
                                                                     stats.getTotalFileCount() - previousFileCount );
+            }
+            catch ( MetadataRepositoryException e )
+            {
+                throw new TaskExecutionException( "Unable to store updated statistics: " + e.getMessage(), e );
+            }
 
 //                log.info( "Scanning for removed repository content" );
 
 //                metadataRepository.findAllProjects();
-                // FIXME: do something
+            // FIXME: do something
 
-                log.info( "Finished repository task: " + repoTask );
+            log.info( "Finished repository task: " + repoTask );
 
-                this.task = null;
-            }
-            catch ( RepositoryScannerException e )
-            {
-                throw new TaskExecutionException( "Repository error when executing repository job.", e );
-            }
+            this.task = null;
         }
     }
 

Modified: archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java (original)
+++ archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/main/java/org/apache/archiva/scheduler/repository/RepositoryArchivaTaskScheduler.java Wed Dec 22 01:53:10 2010
@@ -19,12 +19,7 @@ package org.apache.archiva.scheduler.rep
  * under the License.
  */
 
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.archiva.scheduler.ArchivaTaskScheduler;
 import org.apache.maven.archiva.common.ArchivaException;
@@ -46,6 +41,12 @@ import org.quartz.SchedulerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 /**
  * Default implementation of a scheduling component for archiva.
  *
@@ -110,28 +111,36 @@ public class RepositoryArchivaTaskSchedu
     public void start()
         throws StartingException
     {
-        try
-        {
-            List<ManagedRepositoryConfiguration> repositories = archivaConfiguration.getConfiguration()
-                .getManagedRepositories();
+        List<ManagedRepositoryConfiguration> repositories =
+            archivaConfiguration.getConfiguration().getManagedRepositories();
 
-            for ( ManagedRepositoryConfiguration repoConfig : repositories )
+        for ( ManagedRepositoryConfiguration repoConfig : repositories )
+        {
+            if ( repoConfig.isScanned() )
             {
-                if ( repoConfig.isScanned() )
+                try
                 {
                     scheduleRepositoryJobs( repoConfig );
+                }
+                catch ( SchedulerException e )
+                {
+                    throw new StartingException( "Unable to start scheduler: " + e.getMessage(), e );
+                }
 
-                    if( !isPreviouslyScanned( repoConfig ) )
+                try
+                {
+                    if ( !isPreviouslyScanned( repoConfig ) )
                     {
                         queueInitialRepoScan( repoConfig );
                     }
                 }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to determine if a repository is already scanned, skipping initial scan: " +
+                                  e.getMessage(), e );
+                }
             }
         }
-        catch ( SchedulerException e )
-        {
-            throw new StartingException( "Unable to start scheduler: " + e.getMessage(), e );
-        }
     }
 
     public void stop()
@@ -152,10 +161,10 @@ public class RepositoryArchivaTaskSchedu
         }
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public boolean isProcessingRepositoryTask( String repositoryId )
     {
-        synchronized( repositoryScanningQueue )
+        synchronized ( repositoryScanningQueue )
         {
             List<RepositoryTask> queue = null;
 
@@ -179,10 +188,10 @@ public class RepositoryArchivaTaskSchedu
         }
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     private boolean isProcessingRepositoryTask( RepositoryTask task )
     {
-        synchronized( repositoryScanningQueue )
+        synchronized ( repositoryScanningQueue )
         {
             List<RepositoryTask> queue = null;
 
@@ -240,7 +249,8 @@ public class RepositoryArchivaTaskSchedu
             }
             jobs.clear();
 
-            List<ManagedRepositoryConfiguration> repositories = archivaConfiguration.getConfiguration().getManagedRepositories();
+            List<ManagedRepositoryConfiguration> repositories =
+                archivaConfiguration.getConfiguration().getManagedRepositories();
 
             for ( ManagedRepositoryConfiguration repoConfig : repositories )
             {
@@ -259,8 +269,9 @@ public class RepositoryArchivaTaskSchedu
         }
     }
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     private boolean isPreviouslyScanned( ManagedRepositoryConfiguration repoConfig )
+        throws MetadataRepositoryException
     {
         return repositoryStatisticsManager.getLastStatistics( repoConfig.getId() ) != null;
     }
@@ -310,13 +321,13 @@ public class RepositoryArchivaTaskSchedu
         if ( !cronValidator.validate( cronString ) )
         {
             log.warn( "Cron expression [" + cronString + "] for repository [" + repoConfig.getId() +
-                "] is invalid.  Defaulting to hourly." );
+                          "] is invalid.  Defaulting to hourly." );
             cronString = CRON_HOURLY;
         }
 
         // setup the unprocessed artifact job
-        JobDetail repositoryJob =
-            new JobDetail( REPOSITORY_JOB + ":" + repoConfig.getId(), REPOSITORY_SCAN_GROUP, RepositoryTaskJob.class );
+        JobDetail repositoryJob = new JobDetail( REPOSITORY_JOB + ":" + repoConfig.getId(), REPOSITORY_SCAN_GROUP,
+                                                 RepositoryTaskJob.class );
 
         JobDataMap dataMap = new JobDataMap();
         dataMap.put( TASK_QUEUE, repositoryScanningQueue );
@@ -325,17 +336,16 @@ public class RepositoryArchivaTaskSchedu
 
         try
         {
-            CronTrigger trigger =
-                new CronTrigger( REPOSITORY_JOB_TRIGGER + ":" + repoConfig.getId(), REPOSITORY_SCAN_GROUP, cronString );
+            CronTrigger trigger = new CronTrigger( REPOSITORY_JOB_TRIGGER + ":" + repoConfig.getId(),
+                                                   REPOSITORY_SCAN_GROUP, cronString );
 
             jobs.add( REPOSITORY_JOB + ":" + repoConfig.getId() );
             scheduler.scheduleJob( repositoryJob, trigger );
         }
         catch ( ParseException e )
         {
-            log.error(
-                "ParseException in repository scanning cron expression, disabling repository scanning for '" +
-                    repoConfig.getId() + "': " + e.getMessage() );
+            log.error( "ParseException in repository scanning cron expression, disabling repository scanning for '" +
+                           repoConfig.getId() + "': " + e.getMessage() );
         }
 
     }

Modified: archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-scheduler/archiva-scheduler-repository/src/test/java/org/apache/archiva/scheduler/repository/ArchivaRepositoryScanningTaskExecutorTest.java Wed Dec 22 01:53:10 2010
@@ -19,12 +19,7 @@ package org.apache.archiva.scheduler.rep
  * under the License.
  */
 
-import java.io.File;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
@@ -35,6 +30,12 @@ import org.codehaus.plexus.spring.Plexus
 import org.codehaus.plexus.taskqueue.execution.TaskExecutor;
 import org.codehaus.plexus.util.FileUtils;
 
+import java.io.File;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
 /**
  * ArchivaRepositoryScanningTaskExecutorTest
  *
@@ -294,6 +295,7 @@ public class ArchivaRepositoryScanningTa
     }
 
     private void createAndSaveTestStats()
+        throws MetadataRepositoryException
     {
         Date date = Calendar.getInstance().getTime();
         RepositoryStatistics stats = new RepositoryStatistics();

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewArtifactsRssFeedProcessor.java Wed Dec 22 01:53:10 2010
@@ -19,32 +19,34 @@ package org.apache.archiva.rss.processor
  * under the License.
  */
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
 import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.io.FeedException;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.rss.RssFeedEntry;
 import org.apache.archiva.rss.RssFeedGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
 /**
  * Retrieve and process all artifacts of a repository from the database and generate a rss feed.
- * The artifacts will be grouped by the date when the artifacts were gathered. 
+ * The artifacts will be grouped by the date when the artifacts were gathered.
  * Each group will appear as one entry in the feed.
- * 
+ *
  * @plexus.component role="org.apache.archiva.rss.processor.RssFeedProcessor" role-hint="new-artifacts"
  */
 public class NewArtifactsRssFeedProcessor
     extends AbstractArtifactsRssFeedProcessor
 {
     private int numberOfDaysBeforeNow = 30;
-    
+
     private static final String title = "New Artifacts in Repository ";
 
     private static final String desc = "These are the new artifacts found in the repository ";
@@ -63,6 +65,7 @@ public class NewArtifactsRssFeedProcesso
      * new versions of artifact.
      */
     public SyndFeed process( Map<String, String> reqParams )
+        throws FeedException
     {
         log.debug( "Process new artifacts into rss feeds." );
 
@@ -76,13 +79,22 @@ public class NewArtifactsRssFeedProcesso
     }
 
     private SyndFeed processNewArtifactsInRepo( String repoId )
+        throws FeedException
     {
         Calendar greaterThanThisDate = Calendar.getInstance( GMT_TIME_ZONE );
         greaterThanThisDate.add( Calendar.DATE, -( getNumberOfDaysBeforeNow() ) );
         greaterThanThisDate.clear( Calendar.MILLISECOND );
 
-        List<ArtifactMetadata> artifacts =
-            metadataRepository.getArtifactsByDateRange( repoId, greaterThanThisDate.getTime(), null );
+        List<ArtifactMetadata> artifacts = null;
+        try
+        {
+            artifacts = metadataRepository.getArtifactsByDateRange( repoId, greaterThanThisDate.getTime(), null );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new FeedException( "Unable to construct feed, metadata could not be retrieved: " + e.getMessage(),
+                                     e );
+        }
 
         long tmp = 0;
         RssFeedEntry entry = null;
@@ -104,7 +116,8 @@ public class NewArtifactsRssFeedProcesso
                 }
 
                 String repoId1 = artifact.getRepositoryId();
-                entry = new RssFeedEntry( this.getTitle() + "\'" + repoId1 + "\'" + " as of " + new Date( whenGathered ) );
+                entry = new RssFeedEntry( this.getTitle() + "\'" + repoId1 + "\'" + " as of " + new Date(
+                    whenGathered ) );
                 entry.setPublishedDate( artifact.getWhenGathered() );
                 description = this.getDescription() + "\'" + repoId1 + "\'" + ": \n" + id + " | ";
             }
@@ -123,8 +136,9 @@ public class NewArtifactsRssFeedProcesso
             idx++;
         }
 
-        return generator.generateFeed( getTitle() + "\'" + repoId + "\'", "New artifacts found in repository " +
-            "\'" + repoId + "\'" + " during repository scan.", entries );
+        return generator.generateFeed( getTitle() + "\'" + repoId + "\'",
+                                       "New artifacts found in repository " + "\'" + repoId + "\'" +
+                                           " during repository scan.", entries );
     }
 
     public String getTitle()

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/NewVersionsOfArtifactRssFeedProcessor.java Wed Dec 22 01:53:10 2010
@@ -19,17 +19,22 @@ package org.apache.archiva.rss.processor
  * under the License.
  */
 
+import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.io.FeedException;
+import org.apache.archiva.metadata.model.ArtifactMetadata;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
+import org.apache.archiva.metadata.repository.MetadataResolutionException;
+import org.apache.archiva.rss.RssFeedEntry;
+import org.apache.archiva.rss.RssFeedGenerator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
-import com.sun.syndication.feed.synd.SyndFeed;
-import org.apache.archiva.metadata.model.ArtifactMetadata;
-import org.apache.archiva.rss.RssFeedEntry;
-import org.apache.archiva.rss.RssFeedGenerator;
-
 /**
  * Retrieve and process new versions of an artifact from the database and
  * generate a rss feed. The versions will be grouped by the date when the artifact
@@ -40,6 +45,8 @@ import org.apache.archiva.rss.RssFeedGen
 public class NewVersionsOfArtifactRssFeedProcessor
     extends AbstractArtifactsRssFeedProcessor
 {
+    private Logger log = LoggerFactory.getLogger( NewVersionsOfArtifactRssFeedProcessor.class );
+
     private static final String title = "New Versions of Artifact ";
 
     private static final String desc = "These are the new versions of artifact ";
@@ -53,6 +60,7 @@ public class NewVersionsOfArtifactRssFee
      * Process all versions of the artifact which had a rss feed request.
      */
     public SyndFeed process( Map<String, String> reqParams )
+        throws FeedException
     {
         String groupId = reqParams.get( RssFeedProcessor.KEY_GROUP_ID );
         String artifactId = reqParams.get( RssFeedProcessor.KEY_ARTIFACT_ID );
@@ -66,16 +74,30 @@ public class NewVersionsOfArtifactRssFee
     }
 
     private SyndFeed processNewVersionsOfArtifact( String groupId, String artifactId )
+        throws FeedException
     {
         List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>();
-        for ( String repoId : metadataRepository.getRepositories() )
+        try
         {
-            Collection<String> versions = metadataRepository.getProjectVersions( repoId, groupId, artifactId );
-            for ( String version : versions )
+            for ( String repoId : metadataRepository.getRepositories() )
             {
-                artifacts.addAll( metadataRepository.getArtifacts( repoId, groupId, artifactId, version ) );
+                Collection<String> versions = metadataRepository.getProjectVersions( repoId, groupId, artifactId );
+                for ( String version : versions )
+                {
+                    artifacts.addAll( metadataRepository.getArtifacts( repoId, groupId, artifactId, version ) );
+                }
             }
         }
+        catch ( MetadataRepositoryException e )
+        {
+            throw new FeedException( "Unable to construct feed, metadata could not be retrieved: " + e.getMessage(),
+                                     e );
+        }
+        catch ( MetadataResolutionException e )
+        {
+            throw new FeedException( "Unable to construct feed, metadata could not be retrieved: " + e.getMessage(),
+                                     e );
+        }
 
         long tmp = 0;
         RssFeedEntry entry = null;

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-rss/src/main/java/org/apache/archiva/rss/processor/RssFeedProcessor.java Wed Dec 22 01:53:10 2010
@@ -19,9 +19,10 @@ package org.apache.archiva.rss.processor
  * under the License.
  */
 
-import java.util.Map;
-
 import com.sun.syndication.feed.synd.SyndFeed;
+import com.sun.syndication.io.FeedException;
+
+import java.util.Map;
 
 /**
  * Retrieve and process the data that will be fed into the RssFeedGenerator.
@@ -34,5 +35,6 @@ public interface RssFeedProcessor
 
     public static final String KEY_ARTIFACT_ID = "artifactId";
 
-    SyndFeed process( Map<String, String> reqParams );
+    SyndFeed process( Map<String, String> reqParams )
+        throws FeedException;
 }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/pom.xml Wed Dec 22 01:53:10 2010
@@ -288,6 +288,11 @@
       <!--  FIXME: temporary coupling to plugin, should be runtime -->
       <artifactId>maven2-repository</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <resources>

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/BrowseAction.java Wed Dec 22 01:53:10 2010
@@ -19,13 +19,6 @@ package org.apache.maven.archiva.web.act
  * under the License.
  */
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.metadata.repository.MetadataResolver;
@@ -33,6 +26,13 @@ import org.apache.archiva.metadata.repos
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
 /**
  * Browse the repository.
  *
@@ -62,6 +62,7 @@ public class BrowseAction
     private Collection<String> projectVersions;
 
     public String browse()
+        throws MetadataResolutionException
     {
         List<String> selectedRepos = getObservableRepos();
         if ( CollectionUtils.isEmpty( selectedRepos ) )
@@ -91,6 +92,7 @@ public class BrowseAction
     }
 
     private String collapseNamespaces( Collection<String> repoIds, String n )
+        throws MetadataResolutionException
     {
         Set<String> subNamespaces = new LinkedHashSet<String>();
         for ( String repoId : repoIds )
@@ -124,6 +126,7 @@ public class BrowseAction
     }
 
     public String browseGroup()
+        throws MetadataResolutionException
     {
         if ( StringUtils.isEmpty( groupId ) )
         {
@@ -171,6 +174,7 @@ public class BrowseAction
     }
 
     public String browseArtifact()
+        throws MetadataResolutionException
     {
         if ( StringUtils.isEmpty( groupId ) )
         {
@@ -249,8 +253,8 @@ public class BrowseAction
             }
             else
             {
-                MavenProjectFacet versionMetadataMavenFacet =
-                    (MavenProjectFacet) versionMetadata.getFacet( MavenProjectFacet.FACET_ID );
+                MavenProjectFacet versionMetadataMavenFacet = (MavenProjectFacet) versionMetadata.getFacet(
+                    MavenProjectFacet.FACET_ID );
                 if ( versionMetadataMavenFacet != null )
                 {
                     if ( mavenFacet.getPackaging() != null && !StringUtils.equalsIgnoreCase( mavenFacet.getPackaging(),
@@ -260,14 +264,14 @@ public class BrowseAction
                     }
                 }
 
-                if ( sharedModel.getName() != null &&
-                    !StringUtils.equalsIgnoreCase( sharedModel.getName(), versionMetadata.getName() ) )
+                if ( sharedModel.getName() != null && !StringUtils.equalsIgnoreCase( sharedModel.getName(),
+                                                                                     versionMetadata.getName() ) )
                 {
                     sharedModel.setName( "" );
                 }
 
-                if ( sharedModel.getDescription() != null &&
-                    !StringUtils.equalsIgnoreCase( sharedModel.getDescription(), versionMetadata.getDescription() ) )
+                if ( sharedModel.getDescription() != null && !StringUtils.equalsIgnoreCase(
+                    sharedModel.getDescription(), versionMetadata.getDescription() ) )
                 {
                     sharedModel.setDescription( null );
                 }
@@ -293,8 +297,8 @@ public class BrowseAction
                     sharedModel.setOrganization( null );
                 }
 
-                if ( sharedModel.getUrl() != null &&
-                    !StringUtils.equalsIgnoreCase( sharedModel.getUrl(), versionMetadata.getUrl() ) )
+                if ( sharedModel.getUrl() != null && !StringUtils.equalsIgnoreCase( sharedModel.getUrl(),
+                                                                                    versionMetadata.getUrl() ) )
                 {
                     sharedModel.setUrl( null );
                 }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java Wed Dec 22 01:53:10 2010
@@ -27,6 +27,8 @@ import org.apache.archiva.checksum.Check
 import org.apache.archiva.checksum.ChecksummedFile;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
+import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.repository.events.RepositoryListener;
 import org.apache.maven.archiva.common.utils.VersionComparator;
 import org.apache.maven.archiva.common.utils.VersionUtil;
@@ -199,8 +201,8 @@ public class DeleteArtifactAction
             TimeZone timezone = TimeZone.getTimeZone( "UTC" );
             DateFormat fmt = new SimpleDateFormat( "yyyyMMdd.HHmmss" );
             fmt.setTimeZone( timezone );
-            ManagedRepositoryConfiguration repoConfig =
-                configuration.getConfiguration().findManagedRepositoryById( repositoryId );
+            ManagedRepositoryConfiguration repoConfig = configuration.getConfiguration().findManagedRepositoryById(
+                repositoryId );
 
             VersionedReference ref = new VersionedReference();
             ref.setArtifactId( artifactId );
@@ -228,8 +230,8 @@ public class DeleteArtifactAction
 
             updateMetadata( metadata, metadataFile, lastUpdatedTimestamp );
 
-            Collection<ArtifactMetadata> artifacts =
-                metadataRepository.getArtifacts( repositoryId, groupId, artifactId, version );
+            Collection<ArtifactMetadata> artifacts = metadataRepository.getArtifacts( repositoryId, groupId, artifactId,
+                                                                                      version );
 
             for ( ArtifactMetadata artifact : artifacts )
             {
@@ -237,8 +239,7 @@ public class DeleteArtifactAction
                 if ( artifact.getVersion().equals( version ) )
                 {
                     metadataRepository.deleteArtifact( artifact.getRepositoryId(), artifact.getNamespace(),
-                                                       artifact.getProject(), artifact.getVersion(),
-                                                       artifact.getId() );
+                                                       artifact.getProject(), artifact.getVersion(), artifact.getId() );
 
                     // TODO: move into the metadata repository proper - need to differentiate attachment of
                     //       repository metadata to an artifact
@@ -275,6 +276,16 @@ public class DeleteArtifactAction
             addActionError( "Repository exception: " + e.getMessage() );
             return ERROR;
         }
+        catch ( MetadataResolutionException e )
+        {
+            addActionError( "Repository exception: " + e.getMessage() );
+            return ERROR;
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            addActionError( "Repository exception: " + e.getMessage() );
+            return ERROR;
+        }
     }
 
     private File getMetadata( String targetPath )

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/ShowArtifactAction.java Wed Dec 22 01:53:10 2010
@@ -20,7 +20,6 @@ package org.apache.maven.archiva.web.act
  */
 
 import com.opensymphony.xwork2.Validateable;
-
 import org.apache.archiva.metadata.generic.GenericMetadataFacet;
 import org.apache.archiva.metadata.model.ArtifactMetadata;
 import org.apache.archiva.metadata.model.Dependency;
@@ -28,6 +27,7 @@ import org.apache.archiva.metadata.model
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.model.ProjectVersionReference;
 import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.MetadataResolutionException;
 import org.apache.archiva.metadata.repository.MetadataResolver;
 import org.apache.archiva.metadata.repository.storage.maven2.MavenArtifactFacet;
@@ -49,12 +49,12 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * Browse the repository. 
- * 
+ * Browse the repository.
+ *
  * TODO change name to ShowVersionedAction to conform to terminology.
- * 
+ *
  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="showArtifactAction"
- *                   instantiation-strategy="per-lookup"
+ * instantiation-strategy="per-lookup"
  */
 @SuppressWarnings( "serial" )
 public class ShowArtifactAction
@@ -171,9 +171,19 @@ public class ShowArtifactAction
                 {
                     repositoryId = repoId;
 
-                    List<ArtifactMetadata> artifacts =
-                        new ArrayList<ArtifactMetadata>( metadataResolver.getArtifacts( repoId, groupId, artifactId,
-                                                                                        version ) );
+                    List<ArtifactMetadata> artifacts;
+                    try
+                    {
+                        artifacts = new ArrayList<ArtifactMetadata>( metadataResolver.getArtifacts( repoId, groupId,
+                                                                                                    artifactId,
+                                                                                                    version ) );
+                    }
+                    catch ( MetadataResolutionException e )
+                    {
+                        addIncompleteModelWarning();
+
+                        artifacts = Collections.emptyList();
+                    }
                     Collections.sort( artifacts, new Comparator<ArtifactMetadata>()
                     {
                         public int compare( ArtifactMetadata o1, ArtifactMetadata o2 )
@@ -181,9 +191,8 @@ public class ShowArtifactAction
                             // sort by version (reverse), then ID
                             // TODO: move version sorting into repository handling (maven2 specific), and perhaps add a
                             // way to get latest instead
-                            int result =
-                                new DefaultArtifactVersion( o2.getVersion() ).compareTo( new DefaultArtifactVersion(
-                                                                                                                     o1.getVersion() ) );
+                            int result = new DefaultArtifactVersion( o2.getVersion() ).compareTo(
+                                new DefaultArtifactVersion( o1.getVersion() ) );
                             return result != 0 ? result : o1.getId().compareTo( o2.getId() );
                         }
                     } );
@@ -207,7 +216,8 @@ public class ShowArtifactAction
 
     private void addIncompleteModelWarning()
     {
-        addActionMessage( "The model may be incomplete due to a previous error in resolving information. Refer to the repository problem reports for more information." );
+        addActionMessage(
+            "The model may be incomplete due to a previous error in resolving information. Refer to the repository problem reports for more information." );
     }
 
     /**
@@ -248,6 +258,7 @@ public class ShowArtifactAction
      * Show the dependees (other artifacts that depend on this project) tab.
      */
     public String dependees()
+        throws MetadataResolutionException
     {
         List<ProjectVersionReference> references = new ArrayList<ProjectVersionReference>();
         // TODO: what if we get duplicates across repositories?
@@ -321,8 +332,8 @@ public class ShowArtifactAction
             genericMetadata = projectMetadata.getFacet( GenericMetadataFacet.FACET_ID ).toProperties();
         }
 
-        if ( propertyName == null || "".equals( propertyName.trim() ) || propertyValue == null ||
-            "".equals( propertyValue.trim() ) )
+        if ( propertyName == null || "".equals( propertyName.trim() ) || propertyValue == null || "".equals(
+            propertyValue.trim() ) )
         {
             model = projectMetadata;
             addActionError( errorMsg != null ? errorMsg : "Property Name and Property Value are required." );
@@ -331,7 +342,16 @@ public class ShowArtifactAction
 
         genericMetadata.put( propertyName, propertyValue );
 
-        updateProjectMetadata( projectMetadata );
+        try
+        {
+            updateProjectMetadata( projectMetadata );
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            log.warn( "Unable to persist modified project metadata after adding entry: " + e.getMessage(), e );
+            addActionError( "Unable to add metadata item to underlying content storage - consult application logs." );
+            return ERROR;
+        }
 
         projectMetadata = getProjectVersionMetadata();
 
@@ -352,7 +372,7 @@ public class ShowArtifactAction
 
         if ( projectMetadata == null )
         {
-            addActionError( errorMsg != null ? errorMsg : "Artifact not found" );
+            addActionError( "Artifact not found" );
             return ERROR;
         }
 
@@ -364,7 +384,18 @@ public class ShowArtifactAction
             {
                 genericMetadata.remove( deleteItem );
 
-                updateProjectMetadata( projectMetadata );
+                try
+                {
+                    updateProjectMetadata( projectMetadata );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to persist modified project metadata after removing entry: " + e.getMessage(),
+                              e );
+                    addActionError(
+                        "Unable to remove metadata item to underlying content storage - consult application logs." );
+                    return ERROR;
+                }
 
                 projectMetadata = getProjectVersionMetadata();
 
@@ -379,7 +410,7 @@ public class ShowArtifactAction
         }
         else
         {
-            addActionError( errorMsg != null ? errorMsg : "No generic metadata facet for this artifact." );
+            addActionError( "No generic metadata facet for this artifact." );
             return ERROR;
         }
 
@@ -387,6 +418,7 @@ public class ShowArtifactAction
     }
 
     private void updateProjectMetadata( ProjectVersionMetadata projectMetadata )
+        throws MetadataRepositoryException
     {
         GenericMetadataFacet genericMetadataFacet = new GenericMetadataFacet();
         genericMetadataFacet.fromProperties( genericMetadata );

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/DeleteManagedRepositoryAction.java Wed Dec 22 01:53:10 2010
@@ -22,6 +22,7 @@ package org.apache.maven.archiva.web.act
 import com.opensymphony.xwork2.Preparable;
 import org.apache.archiva.audit.AuditEvent;
 import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.Configuration;
@@ -35,7 +36,7 @@ import java.util.Map;
 
 /**
  * DeleteManagedRepositoryAction
- * 
+ *
  * @version $Id$
  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="deleteManagedRepositoryAction" instantiation-strategy="per-lookup"
  */
@@ -64,7 +65,8 @@ public class DeleteManagedRepositoryActi
         if ( StringUtils.isNotBlank( repoid ) )
         {
             this.repository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid );
-            this.stagingRepository = archivaConfiguration.getConfiguration().findManagedRepositoryById( repoid +"-stage");
+            this.stagingRepository = archivaConfiguration.getConfiguration().findManagedRepositoryById(
+                repoid + "-stage" );
         }
     }
 
@@ -104,23 +106,23 @@ public class DeleteManagedRepositoryActi
         try
         {
             Configuration configuration = archivaConfiguration.getConfiguration();
-            cleanupRepositoryData( existingRepository );
-            removeRepository( repoid, configuration );
-            triggerAuditEvent( repoid, null, AuditEvent.DELETE_MANAGED_REPO );
-            if(attachedStagingRepo !=null)
+            if ( attachedStagingRepo != null )
             {
                 cleanupRepositoryData( attachedStagingRepo );
-                removeRepository( repoid +"-stage", configuration );
-                triggerAuditEvent(repoid +"-stage", null, AuditEvent.DELETE_MANAGED_REPO );
+                removeRepository( repoid + "-stage", configuration );
+                triggerAuditEvent( repoid + "-stage", null, AuditEvent.DELETE_MANAGED_REPO );
 
             }
+            cleanupRepositoryData( existingRepository );
+            removeRepository( repoid, configuration );
+            triggerAuditEvent( repoid, null, AuditEvent.DELETE_MANAGED_REPO );
             result = saveConfiguration( configuration );
 
             if ( result.equals( SUCCESS ) )
             {
                 if ( deleteContents )
                 {
-                    if(attachedStagingRepo !=null)
+                    if ( attachedStagingRepo != null )
                     {
                         removeContents( attachedStagingRepo );
                     }
@@ -130,12 +132,20 @@ public class DeleteManagedRepositoryActi
         }
         catch ( IOException e )
         {
-            addActionError( "Unable to delete repository: " + e.getMessage() );
+            addActionError(
+                "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
             result = ERROR;
         }
         catch ( RoleManagerException e )
         {
-            addActionError( "Unable to delete repository: " + e.getMessage() );
+            addActionError(
+                "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
+            result = ERROR;
+        }
+        catch ( MetadataRepositoryException e )
+        {
+            addActionError(
+                "Unable to delete repository, content may already be partially removed: " + e.getMessage() );
             result = ERROR;
         }
 
@@ -143,7 +153,7 @@ public class DeleteManagedRepositoryActi
     }
 
     private void cleanupRepositoryData( ManagedRepositoryConfiguration cleanupRepository )
-        throws RoleManagerException
+        throws RoleManagerException, MetadataRepositoryException
     {
         removeRepositoryRoles( cleanupRepository );
         cleanupDatabase( cleanupRepository.getId() );
@@ -160,20 +170,22 @@ public class DeleteManagedRepositoryActi
         }
 
         Map<String, List<String>> repoToGroupMap = archivaConfiguration.getConfiguration().getRepositoryToGroupMap();
-        if( repoToGroupMap != null )
+        if ( repoToGroupMap != null )
         {
-            if( repoToGroupMap.containsKey( cleanupRepository.getId() ) )
+            if ( repoToGroupMap.containsKey( cleanupRepository.getId() ) )
             {
                 List<String> repoGroups = repoToGroupMap.get( cleanupRepository.getId() );
-                for( String repoGroup : repoGroups )
+                for ( String repoGroup : repoGroups )
                 {
-                    archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup ).removeRepository( cleanupRepository.getId() );
+                    archivaConfiguration.getConfiguration().findRepositoryGroupById( repoGroup ).removeRepository(
+                        cleanupRepository.getId() );
                 }
             }
         }
     }
 
     private void cleanupDatabase( String repoId )
+        throws MetadataRepositoryException
     {
         metadataRepository.deleteRepository( repoId );
     }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java Wed Dec 22 01:53:10 2010
@@ -22,6 +22,7 @@ package org.apache.maven.archiva.web.act
 import com.opensymphony.xwork2.Preparable;
 import com.opensymphony.xwork2.Validateable;
 import org.apache.archiva.audit.AuditEvent;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.commons.lang.StringUtils;
 import org.apache.maven.archiva.configuration.Configuration;
@@ -144,7 +145,7 @@ public class EditManagedRepositoryAction
             //delete staging repo when we dont need it
             if ( !stageNeeded )
             {
-                stagingRepository = getStageRepoConfig(configuration);
+                stagingRepository = getStageRepoConfig( configuration );
                 removeRepository( stagingRepository.getId(), configuration );
                 removeContents( stagingRepository );
                 removeRepositoryRoles( stagingRepository );
@@ -166,6 +167,11 @@ public class EditManagedRepositoryAction
             addActionError( "Role Manager Exception: " + e.getMessage() );
             result = ERROR;
         }
+        catch ( MetadataRepositoryException e )
+        {
+            addActionError( "Metadata Exception: " + e.getMessage() );
+            result = ERROR;
+        }
 
         return result;
     }
@@ -177,7 +183,7 @@ public class EditManagedRepositoryAction
             if ( repoConf.getId().equals( repository.getId() + "-stage" ) )
             {
                 stagingRepository = repoConf;
-                removeRepository( repoConf .getId() , configuration);
+                removeRepository( repoConf.getId(), configuration );
                 updateStagingRepository( stagingRepository );
                 return stagingRepository;
             }
@@ -220,6 +226,7 @@ public class EditManagedRepositoryAction
     }
 
     private void resetStatistics()
+        throws MetadataRepositoryException
     {
         repositoryStatisticsManager.deleteStatistics( repository.getId() );
     }

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/RepositoriesAction.java Wed Dec 22 01:53:10 2010
@@ -19,14 +19,8 @@ package org.apache.maven.archiva.web.act
  * under the License.
  */
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import javax.servlet.http.HttpServletRequest;
-
 import com.opensymphony.xwork2.Preparable;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.maven.archiva.configuration.ArchivaConfiguration;
@@ -43,6 +37,13 @@ import org.codehaus.redback.integration.
 import org.codehaus.redback.integration.interceptor.SecureActionBundle;
 import org.codehaus.redback.integration.interceptor.SecureActionException;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * Shows the Repositories Tab for the administrator.
  *
@@ -108,7 +109,17 @@ public class RepositoriesAction
         repositoryStatistics = new HashMap<String, RepositoryStatistics>();
         for ( ManagedRepositoryConfiguration repo : managedRepositories )
         {
-            RepositoryStatistics stats = repositoryStatisticsManager.getLastStatistics( repo.getId() );
+            RepositoryStatistics stats = null;
+            try
+            {
+                stats = repositoryStatisticsManager.getLastStatistics( repo.getId() );
+            }
+            catch ( MetadataRepositoryException e )
+            {
+                addActionError(
+                    "Error retrieving statistics for repository " + repo.getId() + " - consult application logs" );
+                log.warn( "Error retrieving repository statistics: " + e.getMessage(), e );
+            }
             if ( stats != null )
             {
                 repositoryStatistics.put( repo.getId(), stats );

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/reports/GenerateReportAction.java Wed Dec 22 01:53:10 2010
@@ -19,22 +19,9 @@ package org.apache.maven.archiva.web.act
  * under the License.
  */
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.StringReader;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
 import com.opensymphony.xwork2.Preparable;
 import org.apache.archiva.metadata.repository.MetadataRepository;
+import org.apache.archiva.metadata.repository.MetadataRepositoryException;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatistics;
 import org.apache.archiva.metadata.repository.stats.RepositoryStatisticsManager;
 import org.apache.archiva.reports.RepositoryProblemFacet;
@@ -51,6 +38,20 @@ import org.codehaus.redback.integration.
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 /**
  * @plexus.component role="com.opensymphony.xwork2.Action" role-hint="generateReport" instantiation-strategy="per-lookup"
  */
@@ -114,7 +115,7 @@ public class GenerateReportAction
      */
     private MetadataRepository metadataRepository;
 
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings( "unchecked" )
     public void prepare()
     {
         repositoryIds = new ArrayList<String>();
@@ -186,9 +187,16 @@ public class GenerateReportAction
             // multiple repos
             for ( String repo : selectedRepositories )
             {
-                List<RepositoryStatistics> stats =
-                    repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF );
-                if ( stats.isEmpty() )
+                List<RepositoryStatistics> stats = null;
+                try
+                {
+                    stats = repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
+                }
+                if ( stats == null || stats.isEmpty() )
                 {
                     log.info( "No statistics available for repository '" + repo + "'." );
                     // TODO set repo's stats to 0
@@ -212,10 +220,17 @@ public class GenerateReportAction
                     return INPUT;
                 }
 
-                List<RepositoryStatistics> stats =
-                    repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF, endDateInDF );
-
-                if ( stats.isEmpty() )
+                List<RepositoryStatistics> stats = null;
+                try
+                {
+                    stats = repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF,
+                                                                              endDateInDF );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
+                }
+                if ( stats == null || stats.isEmpty() )
                 {
                     addActionError( "No statistics available for repository. Repository might not have been scanned." );
                     return ERROR;
@@ -304,9 +319,16 @@ public class GenerateReportAction
             // multiple repos
             for ( String repo : selectedRepositories )
             {
-                List<RepositoryStatistics> stats =
-                    repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF );
-                if ( stats.isEmpty() )
+                List<RepositoryStatistics> stats = null;
+                try
+                {
+                    stats = repositoryStatisticsManager.getStatisticsInRange( repo, startDateInDF, endDateInDF );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
+                }
+                if ( stats == null || stats.isEmpty() )
                 {
                     log.info( "No statistics available for repository '" + repo + "'." );
                     // TODO set repo's stats to 0
@@ -344,9 +366,17 @@ public class GenerateReportAction
                     return INPUT;
                 }
 
-                List<RepositoryStatistics> stats =
-                    repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF, endDateInDF );
-                if ( stats.isEmpty() )
+                List<RepositoryStatistics> stats = null;
+                try
+                {
+                    stats = repositoryStatisticsManager.getStatisticsInRange( repositoryId, startDateInDF,
+                                                                              endDateInDF );
+                }
+                catch ( MetadataRepositoryException e )
+                {
+                    log.warn( "Unable to retrieve stats, assuming is empty: " + e.getMessage(), e );
+                }
+                if ( stats == null || stats.isEmpty() )
                 {
                     addActionError( "No statistics available for repository. Repository might not have been scanned." );
                     return ERROR;
@@ -503,10 +533,8 @@ public class GenerateReportAction
             // TODO: improve performance by navigating into a group subtree. Currently group is property, not part of name of item
             for ( String name : metadataRepository.getMetadataFacets( repoId, RepositoryProblemFacet.FACET_ID ) )
             {
-                RepositoryProblemFacet metadataFacet =
-                    (RepositoryProblemFacet) metadataRepository.getMetadataFacet( repoId,
-                                                                                  RepositoryProblemFacet.FACET_ID,
-                                                                                  name );
+                RepositoryProblemFacet metadataFacet = (RepositoryProblemFacet) metadataRepository.getMetadataFacet(
+                    repoId, RepositoryProblemFacet.FACET_ID, name );
 
                 if ( StringUtils.isEmpty( groupId ) || groupId.equals( metadataFacet.getNamespace() ) )
                 {

Modified: archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java
URL: http://svn.apache.org/viewvc/archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java?rev=1051732&r1=1051731&r2=1051732&view=diff
==============================================================================
--- archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java (original)
+++ archiva/trunk/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/BrowseActionTest.java Wed Dec 22 01:53:10 2010
@@ -19,14 +19,14 @@ package org.apache.maven.archiva.web.act
  * under the License.
  */
 
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
 import com.opensymphony.xwork2.Action;
 import org.apache.archiva.metadata.model.ProjectVersionMetadata;
 import org.apache.archiva.metadata.repository.memory.TestMetadataResolver;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 public class BrowseActionTest
     extends AbstractActionTestCase
 {
@@ -34,9 +34,8 @@ public class BrowseActionTest
 
     private BrowseAction action;
 
-    private static final List<String> GROUPS =
-        Arrays.asList( "org.apache.archiva", "commons-lang", "org.apache.maven", "com.sun", "com.oracle",
-                       "repeat.repeat" );
+    private static final List<String> GROUPS = Arrays.asList( "org.apache.archiva", "commons-lang", "org.apache.maven",
+                                                              "com.sun", "com.oracle", "repeat.repeat" );
 
     private static final String OTHER_TEST_REPO = "other-repo";
 
@@ -46,6 +45,7 @@ public class BrowseActionTest
     }
 
     public void testBrowse()
+        throws Exception
     {
         metadataResolver.setNamespaces( TEST_REPO, GROUPS );
 
@@ -63,6 +63,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseNoObservableRepos()
+        throws Exception
     {
         setObservableRepos( Collections.<String>emptyList() );
 
@@ -73,6 +74,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseGroupNoObservableRepos()
+        throws Exception
     {
         setObservableRepos( Collections.<String>emptyList() );
         String selectedGroupId = "org";
@@ -91,6 +93,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseArtifactNoObservableRepos()
+        throws Exception
     {
         setObservableRepos( Collections.<String>emptyList() );
         String selectedGroupId = "org.apache";
@@ -111,6 +114,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseGroupNoGroupId()
+        throws Exception
     {
         String result = action.browseGroup();
         assertErrorResult( result );
@@ -118,6 +122,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseGroupNoArtifacts()
+        throws Exception
     {
         String selectedGroupId = "org";
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache.maven" );
@@ -138,6 +143,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseGroupWithArtifacts()
+        throws Exception
     {
         String artifacts = "apache";
         String selectedGroupId = "org.apache";
@@ -160,6 +166,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseWithCollapsedGroupsAndArtifacts()
+        throws Exception
     {
         List<String> groups = Arrays.asList( "org.apache.archiva", "org.apache" );
 
@@ -181,6 +188,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseWithCollapsedGroupsAndArtifactsAcrossRepositories()
+        throws Exception
     {
         setObservableRepos( Arrays.asList( TEST_REPO, OTHER_TEST_REPO ) );
 
@@ -204,6 +212,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseGroupWithCollapsedGroupsAndArtifacts()
+        throws Exception
     {
         String artifacts = "apache";
         String selectedGroupId = "org.apache";
@@ -228,6 +237,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseArtifactNoGroupId()
+        throws Exception
     {
         String selectedArtifactId = "apache";
 
@@ -245,6 +255,7 @@ public class BrowseActionTest
     }
 
     public void testBrowseArtifactNoArtifactId()
+        throws Exception
     {
         String selectedGroupId = "org.apache";
 
@@ -262,19 +273,21 @@ public class BrowseActionTest
     }
 
     public void testBrowseArtifact()
+        throws Exception
+
     {
         String selectedGroupId = "org.apache";
         String selectedArtifactId = "apache";
 
         List<String> versions = Arrays.asList( "1", "2", "3", "4" );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "1" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "2" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "3" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "4" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "1" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "2" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "3" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "4" ) );
 
         action.setGroupId( selectedGroupId );
         action.setArtifactId( selectedArtifactId );
@@ -294,23 +307,25 @@ public class BrowseActionTest
     }
 
     public void testBrowseArtifactWithSnapshots()
+        throws Exception
+
     {
         String selectedGroupId = "org.apache";
         String selectedArtifactId = "apache";
 
         List<String> versions = Arrays.asList( "1", "2", "3", "4-SNAPSHOT", "4", "5-SNAPSHOT" );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "1" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "2" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "3" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "4-SNAPSHOT" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "4" ) );
-        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId,
-                                            createProjectModel( selectedGroupId, selectedArtifactId, "5-SNAPSHOT" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "1" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "2" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "3" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "4-SNAPSHOT" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "4" ) );
+        metadataResolver.setProjectVersion( TEST_REPO, selectedGroupId, selectedArtifactId, createProjectModel(
+            selectedGroupId, selectedArtifactId, "5-SNAPSHOT" ) );
 
         action.setGroupId( selectedGroupId );
         action.setArtifactId( selectedArtifactId );