]> source.dussan.org Git - archiva.git/blob
d2e2e3f2f1ca6d1fb094c645c050e7c2689d4791
[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.FileUtils;
23 import org.apache.commons.io.IOUtils;
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.commons.lang.math.NumberUtils;
26 import org.apache.maven.archiva.xml.XMLException;
27 import org.apache.maven.archiva.xml.XMLReader;
28 import org.codehaus.plexus.logging.Logger;
29 import org.codehaus.plexus.logging.console.ConsoleLogger;
30
31 import java.io.File;
32 import java.io.FileOutputStream;
33 import java.io.FileWriter;
34 import java.io.IOException;
35 import java.io.InputStream;
36 import java.net.URL;
37
38 /**
39  * A component that is first in the plexus startup that ensure that the configuration
40  * file format has been upgraded properly. 
41  *
42  * @author <a href="mailto:joakim@erdfelt.com">Joakim Erdfelt</a>
43  * @version $Id$
44  */
45 public class ConfigurationUpgrade
46 {
47     public static final int CURRENT_CONFIG_VERSION = 1;
48
49     private Logger logger;
50
51     /**
52      * Perform the upgrade (if needed).
53      * 
54      * NOTE: This component should *NOT USE* the configuration api to do it's upgrade
55      * 
56      * @return true if the upgrade modified the archiva.xml file. false otherwise.
57      */
58     public boolean perform()
59     {
60         File userConfigFile = new File( System.getProperty( "user.home" ), ".m2/archiva.xml" );
61
62         if ( !userConfigFile.exists() )
63         {
64             writeDefaultConfigFile( userConfigFile );
65             return true;
66         }
67
68         boolean configOk = false;
69         try
70         {
71             XMLReader xml = new XMLReader( "configuration", userConfigFile );
72             String configVersion = xml.getElementText( "//configuration/version" );
73             if ( StringUtils.isNotBlank( configVersion ) )
74             {
75                 configOk = true;
76
77                 // Found an embedded configuration version.
78                 int version = NumberUtils.toInt( configVersion, 0 );
79                 if ( version < CURRENT_CONFIG_VERSION )
80                 {
81                     upgradeVersion( userConfigFile, xml );
82                 }
83             }
84         }
85         catch ( XMLException e )
86         {
87             getLogger().warn( "Unable to read user configuration XML: " + e.getMessage(), e );
88             return false;
89         }
90
91         if ( !configOk )
92         {
93             try
94             {
95                 FileUtils.copyFile( userConfigFile, new File( userConfigFile.getAbsolutePath() + ".bak" ) );
96                 writeDefaultConfigFile( userConfigFile );
97                 return true;
98             }
99             catch ( IOException e )
100             {
101                 getLogger().warn( "Unable to create backup of your configuration file: " + e.getMessage(), e );
102             }
103         }
104
105         return false;
106     }
107
108     private void upgradeVersion( File userConfigFile, XMLReader xml )
109     {
110         // TODO: write implementation when we have a current version greater than 1.
111     }
112
113     private void writeDefaultConfigFile( File userConfigFile )
114     {
115         URL defaultConfigURL = this.getClass()
116             .getResource( "/org/apache/maven/archiva/configuration/default-archiva.xml" );
117
118         if ( defaultConfigURL == null )
119         {
120             try
121             {
122                 FileWriter writer = new FileWriter( userConfigFile );
123                 writer.write( "<?xml version=\"1.0\"?>\n" );
124                 writer.write( "<configuration />" );
125                 writer.flush();
126                 writer.close();
127                 return;
128             }
129             catch ( IOException e )
130             {
131                 getLogger().warn( "Unable to write default (generic) configuration file: " + e.getMessage(), e );
132             }
133         }
134
135         // Write default to user config file location.
136         try
137         {
138             FileOutputStream output = new FileOutputStream( userConfigFile );
139             InputStream input = defaultConfigURL.openStream();
140             IOUtils.copy( input, output );
141             output.flush();
142             input.close();
143             output.close();
144         }
145         catch ( IOException e )
146         {
147             getLogger().warn( "Unable to write default configuration file: " + e.getMessage(), e );
148         }
149     }
150
151     public Logger getLogger()
152     {
153         if ( logger == null )
154         {
155             logger = new ConsoleLogger( ConsoleLogger.LEVEL_INFO, this.getClass().getName() );
156         }
157         return logger;
158     }
159
160     public void setLogger( Logger logger )
161     {
162         this.logger = logger;
163     }
164
165 }