Author: joakime
Date: Thu Oct 11 18:26:06 2007
New Revision: 584021

URL: http://svn.apache.org/viewvc?rev=584021&view=rev
Log:
[MRM-501] Saving configuration fails through the webapp.
Provided an alternative configuration location.
Added unit tests for this condition.


Modified:
    maven/archiva/trunk/archiva-base/archiva-configuration/pom.xml
    
maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
    
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
    
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/resources/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.xml

Modified: maven/archiva/trunk/archiva-base/archiva-configuration/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/pom.xml?rev=584021&r1=584020&r2=584021&view=diff
==============================================================================
--- maven/archiva/trunk/archiva-base/archiva-configuration/pom.xml (original)
+++ maven/archiva/trunk/archiva-base/archiva-configuration/pom.xml Thu Oct 11 
18:26:06 2007
@@ -70,6 +70,10 @@
     </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-expression-evaluator</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-container-default</artifactId>
     </dependency>
     <dependency>

Modified: 
maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java?rev=584021&r1=584020&r2=584021&view=diff
==============================================================================
--- 
maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
 (original)
+++ 
maven/archiva/trunk/archiva-base/archiva-configuration/src/main/java/org/apache/maven/archiva/configuration/DefaultArchivaConfiguration.java
 Thu Oct 11 18:26:06 2007
@@ -23,6 +23,10 @@
 import 
org.apache.maven.archiva.configuration.functors.ProxyConnectorConfigurationOrderComparator;
 import 
org.apache.maven.archiva.configuration.io.registry.ConfigurationRegistryReader;
 import 
org.apache.maven.archiva.configuration.io.registry.ConfigurationRegistryWriter;
+import org.codehaus.plexus.evaluator.DefaultExpressionEvaluator;
+import org.codehaus.plexus.evaluator.EvaluatorException;
+import org.codehaus.plexus.evaluator.ExpressionEvaluator;
+import org.codehaus.plexus.evaluator.sources.SystemPropertyExpressionSource;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
 import 
org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
@@ -85,6 +89,11 @@
     private String userConfigFilename;
 
     /**
+     * @plexus.configuration default-value="${appserver.base}/conf/archiva.xml"
+     */
+    private String altConfigFilename;
+
+    /**
      * Configuration Listeners we've registered.
      */
     private Set<ConfigurationListener> listeners = new 
HashSet<ConfigurationListener>();
@@ -94,11 +103,6 @@
      */
     private Set<RegistryListener> registryListeners = new 
HashSet<RegistryListener>();
 
-    public String getFilteredUserConfigFilename()
-    {
-        return StringUtils.replace( userConfigFilename, "${user.home}", 
System.getProperty( "user.home" ) );
-    }
-
     public synchronized Configuration getConfiguration()
     {
         if ( configuration == null )
@@ -268,14 +272,17 @@
         throws RegistryException
     {
         // TODO: may not be needed under commons-configuration 1.4 - check
-        File file = new File( getFilteredUserConfigFilename() );
-        try
-        {
-            FileUtils.writeStringToFile( file, "<configuration/>", "UTF-8" );
-        }
-        catch ( IOException e )
+        // UPDATE: Upgrading to commons-configuration 1.4 breaks half the unit 
tests. 10/11/2007 (joakime)
+        
+        String contents = "<configuration />";
+        if ( !writeFile( "user configuration", userConfigFilename, contents ) )
         {
-            throw new RegistryException( "Unable to create configuration file: 
" + e.getMessage(), e );
+            if ( !writeFile( "alternative configuration", altConfigFilename, 
contents ) )
+            {
+                throw new RegistryException( "Unable to create configuration 
file in either user ["
+                    + userConfigFilename + "] or alternative [" + 
altConfigFilename
+                    + "] locations on disk, usually happens when not allowed 
to write to those locations." );
+            }
         }
 
         try
@@ -297,6 +304,30 @@
         return registry.getSection( KEY + ".user" );
     }
 
+    /**
+     * Attempts to write the contents to a file, if an IOException occurs, 
return false.
+     * 
+     * @param filetype the filetype (freeform text) to use in logging messages 
when failure to write.
+     * @param path the path to write to.
+     * @param contents the contents to write.
+     * @return true if write successful.
+     */
+    private boolean writeFile( String filetype, String path, String contents )
+    {
+        File file = new File( path );
+
+        try
+        {
+            FileUtils.writeStringToFile( file, contents, "UTF-8" );
+            return true;
+        }
+        catch ( IOException e )
+        {
+            getLogger().error( "Unable to create " + filetype + " file: " + 
e.getMessage(), e );
+            return false;
+        }
+    }
+
     private void triggerEvent( int type )
     {
         ConfigurationEvent evt = new ConfigurationEvent( type );
@@ -358,6 +389,20 @@
     public void initialize()
         throws InitializationException
     {
+        // Resolve expressions in the userConfigFilename and altConfigFilename
+        try
+        {
+            ExpressionEvaluator expressionEvaluator = new 
DefaultExpressionEvaluator();
+            expressionEvaluator.addExpressionSource( new 
SystemPropertyExpressionSource() );
+            userConfigFilename = expressionEvaluator.expand( 
userConfigFilename );
+            altConfigFilename = expressionEvaluator.expand( altConfigFilename 
);
+        }
+        catch ( EvaluatorException e )
+        {
+            throw new InitializationException( "Unable to evaluate expressions 
found in "
+                + "userConfigFilename or altConfigFilename." );
+        }
+
         registry.addChangeListener( this );
     }
 
@@ -408,5 +453,15 @@
         }
 
         return config;
+    }
+
+    public String getUserConfigFilename()
+    {
+        return userConfigFilename;
+    }
+
+    public String getAltConfigFilename()
+    {
+        return altConfigFilename;
     }
 }

Modified: 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java?rev=584021&r1=584020&r2=584021&view=diff
==============================================================================
--- 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
 (original)
+++ 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/java/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.java
 Thu Oct 11 18:26:06 2007
@@ -19,11 +19,10 @@
  * under the License.
  */
 
-import org.apache.commons.io.IOUtils;
 import org.codehaus.plexus.PlexusTestCase;
 import org.codehaus.plexus.registry.Registry;
+import org.codehaus.plexus.registry.RegistryException;
 import org.codehaus.plexus.util.FileUtils;
-import org.custommonkey.xmlunit.XMLAssert;
 import org.easymock.MockControl;
 
 import java.io.File;
@@ -40,12 +39,12 @@
 {
     @SuppressWarnings("unused")
     private Registry registry;
-
+    
     protected void setUp()
         throws Exception
     {
         super.setUp();
-
+        
         registry = (Registry) lookup( Registry.ROLE, "commons-configuration" );
     }
 
@@ -304,9 +303,11 @@
     {
         DefaultArchivaConfiguration archivaConfiguration =
             (DefaultArchivaConfiguration) lookup( 
ArchivaConfiguration.class.getName() );
-
+        
         assertEquals( System.getProperty( "user.home" ) + "/.m2/archiva.xml",
-                      archivaConfiguration.getFilteredUserConfigFilename() );
+                      archivaConfiguration.getUserConfigFilename() );
+        assertEquals( System.getProperty( "appserver.base", 
"${appserver.base}" ) + "/conf/archiva.xml",
+                      archivaConfiguration.getAltConfigFilename() );
     }
 
     public void testStoreConfigurationFallback()
@@ -455,6 +456,36 @@
             configuration = archivaConfiguration.getConfiguration();
             assertTrue( "check value", 
configuration.getWebapp().getUi().isAppletFindEnabled() );
         }
+    }
+    
+    public void testLoadConfigurationFromInvalidBothLocationsOnDisk() throws 
Exception
+    {
+        ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) 
lookup( ArchivaConfiguration.class.getName(),
+                                                                               
    "test-not-allowed-to-write-to-both" );
+        Configuration config = archivaConfiguration.getConfiguration();
+        
+        try
+        {
+            archivaConfiguration.save( config );
+            fail( "Should have thrown a RegistryException because the 
configuration can't be saved." );
+        }
+        catch ( RegistryException e )
+        {
+            /* expected exception */
+        }
+    }
+    
+    public void testLoadConfigurationFromInvalidUserLocationOnDisk() throws 
Exception
+    {
+        File testConfDir = getTestFile( "target/test-appserver-base/conf/" );
+        testConfDir.mkdirs();
+        
+        ArchivaConfiguration archivaConfiguration = (ArchivaConfiguration) 
lookup( ArchivaConfiguration.class.getName(),
+                                                                               
    "test-not-allowed-to-write-to-user" );
+        Configuration config = archivaConfiguration.getConfiguration();
+        archivaConfiguration.save( config );
+        // No Exception == test passes. 
+        // Expected Path is: Should not have thrown an exception.
     }
 
     public void testConfigurationUpgradeFrom09()

Modified: 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/resources/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.xml
URL: 
http://svn.apache.org/viewvc/maven/archiva/trunk/archiva-base/archiva-configuration/src/test/resources/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.xml?rev=584021&r1=584020&r2=584021&view=diff
==============================================================================
--- 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/resources/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.xml
 (original)
+++ 
maven/archiva/trunk/archiva-base/archiva-configuration/src/test/resources/org/apache/maven/archiva/configuration/ArchivaConfigurationTest.xml
 Thu Oct 11 18:26:06 2007
@@ -262,5 +262,64 @@
         </properties>
       </configuration>
     </component>
+    
+    <component>
+      <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role>
+      <role-hint>test-not-allowed-to-write-to-both</role-hint>
+      
<implementation>org.apache.maven.archiva.configuration.DefaultArchivaConfiguration</implementation>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.registry.Registry</role>
+          <role-hint>not-allowed-to-write-to-both</role-hint>
+        </requirement>
+      </requirements>
+      <configuration>
+        
<user-config-filename>${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml</user-config-filename>
+        
<alt-config-filename>${basedir}/target/*intentionally:invalid*/conf/archiva.xml</alt-config-filename>
+      </configuration>
+    </component>
+    <component>
+      <role>org.codehaus.plexus.registry.Registry</role>
+      <role-hint>not-allowed-to-write-to-both</role-hint>
+      
<implementation>org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry</implementation>
+      <configuration>
+        <properties>
+          <xml 
fileName="${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml" 
config-optional="true"
+               config-name="org.apache.maven.archiva.user" 
config-at="org.apache.maven.archiva"/>
+          <xml 
fileName="${basedir}/target/*intentionally:invalid*/conf/archiva.xml" 
config-optional="true"
+               config-name="org.apache.maven.archiva.user" 
config-at="org.apache.maven.archiva"/>
+        </properties>
+      </configuration>
+    </component>
+    
+    <component>
+      <role>org.apache.maven.archiva.configuration.ArchivaConfiguration</role>
+      <role-hint>test-not-allowed-to-write-to-user</role-hint>
+      
<implementation>org.apache.maven.archiva.configuration.DefaultArchivaConfiguration</implementation>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.registry.Registry</role>
+          <role-hint>not-allowed-to-write-to-user</role-hint>
+        </requirement>
+      </requirements>
+      <configuration>
+        
<user-config-filename>${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml</user-config-filename>
+        
<alt-config-filename>${basedir}/target/test-appserver-base/conf/archiva.xml</alt-config-filename>
+      </configuration>
+    </component>
+    <component>
+      <role>org.codehaus.plexus.registry.Registry</role>
+      <role-hint>not-allowed-to-write-to-user</role-hint>
+      
<implementation>org.codehaus.plexus.registry.commons.CommonsConfigurationRegistry</implementation>
+      <configuration>
+        <properties>
+          <xml 
fileName="${basedir}/target/*intentionally:invalid*/.m2/archiva-user.xml" 
config-optional="true"
+               config-name="org.apache.maven.archiva.user" 
config-at="org.apache.maven.archiva"/>
+          <xml 
fileName="${basedir}/target/test-appserver-base/conf/archiva.xml" 
config-optional="true"
+               config-name="org.apache.maven.archiva.user" 
config-at="org.apache.maven.archiva"/>
+        </properties>
+      </configuration>
+    </component>
+    
   </components>
 </component-set>


Reply via email to