001    /*
002     * #%L
003     * License Maven Plugin
004     * 
005     * $Id: UpdateProjectLicenseMojo.java 14625 2011-08-26 12:49:21Z tchemit $
006     * $HeadURL: http://svn.codehaus.org/mojo/tags/license-maven-plugin-1.0/src/main/java/org/codehaus/mojo/license/UpdateProjectLicenseMojo.java $
007     * %%
008     * Copyright (C) 2008 - 2011 CodeLutin, Codehaus, Tony Chemit
009     * %%
010     * This program is free software: you can redistribute it and/or modify
011     * it under the terms of the GNU Lesser General Public License as 
012     * published by the Free Software Foundation, either version 3 of the 
013     * License, or (at your option) any later version.
014     * 
015     * This program is distributed in the hope that it will be useful,
016     * but WITHOUT ANY WARRANTY; without even the implied warranty of
017     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
018     * GNU General Lesser Public License for more details.
019     * 
020     * You should have received a copy of the GNU General Lesser Public 
021     * License along with this program.  If not, see
022     * <http://www.gnu.org/licenses/lgpl-3.0.html>.
023     * #L%
024     */
025    
026    package org.codehaus.mojo.license;
027    
028    import org.codehaus.mojo.license.model.License;
029    
030    import java.io.File;
031    
032    /**
033     * Updates (or creates) the main project license file according to the given
034     * license defines as {@link #licenseName}.
035     * <p/>
036     * Can also generate a bundled license file (to avoid collision names in
037     * class-path). This file is by default generated in
038     * {@code META-INF class-path directory}.
039     *
040     * @author tchemit <chemit@codelutin.com>
041     * @goal update-project-license
042     * @phase generate-resources
043     * @requiresProject true
044     * @since 1.0
045     */
046    public class UpdateProjectLicenseMojo
047        extends AbstractLicenseNameMojo
048    {
049    
050        /**
051         * Project license file to synchronize with main license defined in
052         * descriptor file.
053         *
054         * @parameter expression="${license.licenceFile}" default-value="${basedir}/LICENSE.txt"
055         * @required
056         * @since 1.0
057         */
058        protected File licenseFile;
059    
060        /**
061         * The directory where to generate license resources.
062         * <p/>
063         * <b>Note:</b> This option is not available for {@code pom} module types.
064         *
065         * @parameter expression="${license.outputDirectory}"  default-value="target/generated-sources/license"
066         * @since 1.0
067         */
068        protected File outputDirectory;
069    
070        /**
071         * A flag to copy the main license file in a bundled place.
072         * <p/>
073         * This is usefull for final application to have a none confusing location
074         * to seek for the application license.
075         * <p/>
076         * If Sets to {@code true}, will copy the license file to the
077         * {@link #bundleLicensePath} to {@link #outputDirectory}.
078         * <p/>
079         * <b>Note:</b> This option is not available for {@code pom} module types.
080         *
081         * @parameter expression="${license.generateBundle}"  default-value="false"
082         * @since 1.0
083         */
084        protected boolean generateBundle;
085    
086        /**
087         * The path of the bundled license file to produce when
088         * {@link #generateBundle} is on.
089         * <p/>
090         * <b>Note:</b> This option is not available for {@code pom} module types.
091         *
092         * @parameter expression="${license.bundleLicensePath}"  default-value="META-INF/${project.artifactId}-LICENSE.txt"
093         * @since 1.0
094         */
095        protected String bundleLicensePath;
096    
097        /**
098         * A flag to force to generate project license file even if it is up-to-date.
099         *
100         * @parameter expression="${license.force}"  default-value="false"
101         * @since 1.0.0
102         */
103        protected boolean force;
104    
105        /**
106         * A flag to skip the goal.
107         *
108         * @parameter expression="${license.skipUpdateProjectLicense}" default-value="false"
109         * @since 1.0
110         */
111        protected boolean skipUpdateProjectLicense;
112    
113        /**
114         * Flag to known if generate is needed.
115         */
116        private boolean doGenerate;
117    
118        @Override
119        protected void init()
120            throws Exception
121        {
122    
123            if ( isSkip() )
124            {
125                return;
126            }
127    
128            super.init();
129    
130            // must generate if file does not exist or pom never thant license file
131            File licenseFile = getLicenseFile();
132            if ( licenseFile != null )
133            {
134                File pomFile = getProject().getFile();
135    
136                setDoGenerate( isForce() || !licenseFile.exists() || licenseFile.lastModified() <= pomFile.lastModified() );
137            }
138        }
139    
140        @Override
141        protected void doAction()
142            throws Exception
143        {
144    
145            License license = getLicense();
146    
147            File target = getLicenseFile();
148    
149            if ( isDoGenerate() )
150            {
151    
152                getLog().info( "Will create or update license file [" + license.getName() + "] to " + target );
153                if ( isVerbose() )
154                {
155                    getLog().info( "detail of license :\n" + license );
156                }
157    
158                if ( target.exists() && isKeepBackup() )
159                {
160                    if ( isVerbose() )
161                    {
162                        getLog().info( "backup " + target );
163                    }
164                    // copy it to backup file
165                    FileUtil.backupFile( target );
166                }
167            }
168    
169            // obtain license content
170            String licenseContent = license.getLicenseContent( getEncoding() );
171    
172            if ( isDoGenerate() )
173            {
174    
175                // writes it root main license file
176                FileUtil.writeString( target, licenseContent, getEncoding() );
177            }
178    
179            if ( hasClassPath() )
180            {
181    
182                // copy the license file to the resources directory
183                File resourceTarget = new File( getOutputDirectory(), target.getName() );
184                FileUtil.copyFile( getLicenseFile(), resourceTarget );
185    
186                addResourceDir( getOutputDirectory(), "**/" + resourceTarget.getName() );
187    
188                if ( isGenerateBundle() )
189                {
190    
191                    // creates the bundled license file
192                    File bundleTarget = FileUtil.getFile( getOutputDirectory(), getBundleLicensePath() );
193                    FileUtil.copyFile( target, bundleTarget );
194    
195                    if ( !resourceTarget.getName().equals( bundleTarget.getName() ) )
196                    {
197    
198                        addResourceDir( getOutputDirectory(), "**/" + bundleTarget.getName() );
199                    }
200                }
201    
202    
203            }
204        }
205    
206        public File getLicenseFile()
207        {
208            return licenseFile;
209        }
210    
211        public boolean isGenerateBundle()
212        {
213            return generateBundle;
214        }
215    
216        public File getOutputDirectory()
217        {
218            return outputDirectory;
219        }
220    
221        public String getBundleLicensePath()
222        {
223            return bundleLicensePath;
224        }
225    
226        public boolean isDoGenerate()
227        {
228            return doGenerate;
229        }
230    
231        public boolean isForce()
232        {
233            return force;
234        }
235    
236        @Override
237        public boolean isSkip()
238        {
239            return skipUpdateProjectLicense;
240        }
241    
242        public void setLicenseFile( File licenseFile )
243        {
244            this.licenseFile = licenseFile;
245        }
246    
247        public void setGenerateBundle( boolean generateBundle )
248        {
249            this.generateBundle = generateBundle;
250        }
251    
252        public void setOutputDirectory( File outputDirectory )
253        {
254            this.outputDirectory = outputDirectory;
255        }
256    
257        public void setBundleLicensePath( String bundleLicensePath )
258        {
259            this.bundleLicensePath = bundleLicensePath;
260        }
261    
262        public void setDoGenerate( boolean doGenerate )
263        {
264            this.doGenerate = doGenerate;
265        }
266    
267        @Override
268        public void setSkip( boolean skipUpdateProjectLicense )
269        {
270            this.skipUpdateProjectLicense = skipUpdateProjectLicense;
271        }
272    
273        public void setForce( boolean force )
274        {
275            this.force = force;
276        }
277    }