]> source.dussan.org Git - archiva.git/blob
911f7eb87ad6ccb82b4f04cf8cb5123cadb90985
[archiva.git] /
1 package org.apache.maven.archiva.configuration;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.commons.io.IOUtils;
23 import org.apache.commons.lang.StringUtils;
24 import org.apache.maven.archiva.configuration.io.xpp3.ConfigurationXpp3Reader;
25 import org.apache.maven.archiva.configuration.io.xpp3.ConfigurationXpp3Writer;
26 import org.codehaus.plexus.logging.AbstractLogEnabled;
27 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
28
29 import java.io.File;
30 import java.io.FileNotFoundException;
31 import java.io.FileReader;
32 import java.io.FileWriter;
33 import java.io.IOException;
34 import java.util.Iterator;
35 import java.util.LinkedList;
36 import java.util.List;
37
38 /**
39  * Load and store the configuration. No synchronization is used, but it is unnecessary as the old configuration object
40  * can continue to be used.
41  *
42  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
43  * @todo would be great for plexus to do this for us - so the configuration would be a component itself rather than this store
44  * @todo would be good to monitor the store file for changes
45  * @todo support other implementations than XML file
46  * @plexus.component
47  */
48 public class DefaultConfigurationStore
49     extends AbstractLogEnabled
50     implements ConfigurationStore
51 {
52     /**
53      * @plexus.configuration default-value="${configuration.store.file}"
54      */
55     private File file;
56
57     /**
58      * The cached configuration.
59      */
60     private Configuration configuration;
61
62     /**
63      * List of listeners to configuration changes.
64      */
65     private List/*<ConfigurationChangeListener>*/ listeners = new LinkedList();
66
67     public Configuration getConfigurationFromStore()
68         throws ConfigurationStoreException
69     {
70         if ( configuration == null )
71         {
72             ConfigurationXpp3Reader reader = new ConfigurationXpp3Reader();
73
74             if ( file == null )
75             {
76                 file = new File( System.getProperty( "user.home" ), "/.m2/archiva.xml" );
77
78                 // migration for those with the old file
79                 if ( !file.exists() )
80                 {
81                     File file = new File( System.getProperty( "user.home" ), "/.m2/repository-manager.xml" );
82                     if ( file.exists() )
83                     {
84                         getLogger().info( "Migrating " + file + " to " + this.file );
85                         file.renameTo( this.file );
86                     }
87                 }
88             }
89
90             FileReader fileReader;
91             try
92             {
93                 fileReader = new FileReader( file );
94             }
95             catch ( FileNotFoundException e )
96             {
97                 getLogger().warn( "Configuration file: " + file + " not found. Using defaults." );
98                 configuration = new Configuration();
99                 return configuration;
100             }
101
102             getLogger().info( "Reading configuration from " + file );
103             try
104             {
105                 configuration = reader.read( fileReader, false );
106                 sanitizeConfiguration( configuration );
107             }
108             catch ( IOException e )
109             {
110                 throw new ConfigurationStoreException( e.getMessage(), e );
111             }
112             catch ( XmlPullParserException e )
113             {
114                 throw new ConfigurationStoreException( e.getMessage(), e );
115             }
116             finally
117             {
118                 IOUtils.closeQuietly( fileReader );
119             }
120         }
121         return configuration;
122     }
123
124     /**
125      * Perform any Upgrades and Adjustments needed to bring configuration up to the
126      * current configuration format.
127      *
128      * @param config the configuration to upgrade and adjust.
129      */
130     private void sanitizeConfiguration( Configuration config )
131     {
132         Iterator it = config.getRepositories().iterator();
133         while ( it.hasNext() )
134         {
135             RepositoryConfiguration repo = (RepositoryConfiguration) it.next();
136
137             // Ensure that the repo.urlName is set.
138             if ( StringUtils.isEmpty( repo.getUrlName() ) )
139             {
140                 repo.setUrlName( repo.getId() );
141             }
142         }
143     }
144
145     public void storeConfiguration( Configuration configuration )
146         throws ConfigurationStoreException, InvalidConfigurationException, ConfigurationChangeException
147     {
148         for ( Iterator i = listeners.iterator(); i.hasNext(); )
149         {
150             ConfigurationChangeListener listener = (ConfigurationChangeListener) i.next();
151
152             listener.notifyOfConfigurationChange( configuration );
153         }
154
155         ConfigurationXpp3Writer writer = new ConfigurationXpp3Writer();
156
157         getLogger().info( "Writing configuration to " + file );
158         FileWriter fileWriter = null;
159         try
160         {
161             //does file directory exist ?
162             if ( file.getParentFile() != null && !file.getParentFile().exists() )
163             {
164                 file.getParentFile().mkdirs();
165             }
166
167             fileWriter = new FileWriter( file );
168             writer.write( fileWriter, configuration );
169         }
170         catch ( IOException e )
171         {
172             throw new ConfigurationStoreException( e.getMessage(), e );
173         }
174         finally
175         {
176             IOUtils.closeQuietly( fileWriter );
177         }
178     }
179
180     public void addChangeListener( ConfigurationChangeListener listener )
181     {
182         listeners.add( listener );
183     }
184 }