001 /*
002 * #%L
003 * License Maven Plugin
004 *
005 * $Id: LicenseRepository.java 14741 2011-09-20 08:31:41Z tchemit $
006 * $HeadURL: http://svn.codehaus.org/mojo/tags/license-maven-plugin-1.0/src/main/java/org/codehaus/mojo/license/model/LicenseRepository.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.model;
027
028 import org.apache.commons.lang.StringUtils;
029 import org.apache.commons.logging.Log;
030 import org.apache.commons.logging.LogFactory;
031 import org.codehaus.mojo.license.MojoHelper;
032
033 import java.io.IOException;
034 import java.net.URL;
035 import java.net.URLConnection;
036 import java.util.*;
037 import java.util.Map.Entry;
038 import java.util.regex.Matcher;
039 import java.util.regex.Pattern;
040
041 /**
042 * @author tchemit <chemit@codelutin.com>
043 * @since 1.0
044 */
045 public class LicenseRepository
046 implements Iterable<License>
047 {
048
049 /**
050 * Logger
051 */
052 private static final Log log = LogFactory.getLog( LicenseRepository.class );
053
054 public static final String REPOSITORY_DEFINITION_FILE = "licenses.properties";
055
056 public static final Pattern LICENSE_DESCRIPTION_PATTERN =
057 Pattern.compile( "(.*)\\s*~~\\s*license\\s*:\\s*(.*)\\s*~~\\s*header\\s*:\\s*(.*)\\s*" );
058
059 /**
060 * the base url of the licenses repository
061 */
062 protected URL baseURL;
063
064 /**
065 * licenses of this repository
066 */
067 protected List<License> licenses;
068
069 /**
070 * flag to known if repository was init (pass to {@code true} when invoking
071 * the method {@link #load()}).
072 */
073 protected boolean init;
074
075 public LicenseRepository()
076 {
077 }
078
079 public URL getBaseURL()
080 {
081 return baseURL;
082 }
083
084 public void setBaseURL( URL baseURL )
085 {
086 checkNotInit( "setBaseURL" );
087 this.baseURL = baseURL;
088 }
089
090 public void load()
091 throws IOException
092 {
093 checkNotInit( "load" );
094 try
095 {
096 if ( baseURL == null || StringUtils.isEmpty( baseURL.toString() ) )
097 {
098 throw new IllegalStateException( "no baseURL defined in " + this );
099 }
100
101 URL definitionURL = MojoHelper.getUrl( getBaseURL(), REPOSITORY_DEFINITION_FILE );
102 if ( licenses != null )
103 {
104 licenses.clear();
105 }
106 else
107 {
108 licenses = new ArrayList<License>();
109 }
110
111 if ( !checkExists( definitionURL ) )
112 {
113 throw new IllegalArgumentException(
114 "no licenses.properties found with url [" + definitionURL + "] for resolver " + this );
115 }
116 Properties p = new Properties();
117 p.load( definitionURL.openStream() );
118
119 for ( Entry<Object, Object> entry : p.entrySet() )
120 {
121 String licenseName = (String) entry.getKey();
122 licenseName = licenseName.trim().toLowerCase();
123 URL licenseBaseURL = MojoHelper.getUrl( baseURL, licenseName );
124
125 License license = new License();
126 license.setName( licenseName );
127 license.setBaseURL( licenseBaseURL );
128
129 String licenseDescription = (String) entry.getValue();
130 Matcher matcher = LICENSE_DESCRIPTION_PATTERN.matcher( licenseDescription );
131 String licenseFile;
132 String headerFile;
133
134 if ( matcher.matches() )
135 {
136 licenseDescription = matcher.group( 1 );
137 licenseFile = matcher.group( 2 );
138 headerFile = matcher.group( 3 );
139 }
140 else
141 {
142 licenseFile = License.LICENSE_CONTENT_FILE;
143 headerFile = License.LICENSE_HEADER_FILE;
144 }
145
146 URL licenseURL = MojoHelper.getUrl( licenseBaseURL, licenseFile );
147 if ( !checkExists( licenseURL ) )
148 {
149 throw new IllegalArgumentException(
150 "Could not find license (" + license + ") content file at [" + licenseURL + "] for resolver " +
151 this );
152 }
153 license.setLicenseURL( licenseURL );
154
155 URL headerURL = MojoHelper.getUrl( licenseBaseURL, headerFile );
156 if ( !checkExists( headerURL ) )
157 {
158 throw new IllegalArgumentException(
159 "Could not find license (" + license + ") header file at [" + headerURL + "] for resolver " +
160 this );
161 }
162 license.setHeaderURL( headerURL );
163
164 license.setDescription( licenseDescription );
165
166 if ( log.isInfoEnabled() )
167 {
168 log.info( "register " + license.getDescription() );
169 }
170 if ( log.isDebugEnabled() )
171 {
172 log.debug( license );
173 }
174 licenses.add( license );
175 }
176 licenses = Collections.unmodifiableList( licenses );
177 }
178 finally
179 {
180 // mark repository as available
181 init = true;
182 }
183 }
184
185 public String[] getLicenseNames()
186 {
187 checkInit( "getLicenseNames" );
188 List<String> result = new ArrayList<String>( licenses.size() );
189 for ( License license : this )
190 {
191 result.add( license.getName() );
192 }
193 return result.toArray( new String[result.size()] );
194 }
195
196 public License[] getLicenses()
197 {
198 checkInit( "getLicenses" );
199 return licenses.toArray( new License[licenses.size()] );
200 }
201
202 public License getLicense( String licenseName )
203 {
204 checkInit( "getLicense" );
205 if ( StringUtils.isEmpty( licenseName ) )
206 {
207 throw new IllegalArgumentException( "licenceName can not be null, nor empty" );
208 }
209
210 License license = null;
211 for ( License l : this )
212 {
213 if ( licenseName.equals( l.getName() ) )
214 {
215 // got it
216 license = l;
217 break;
218 }
219 }
220 return license;
221 }
222
223 public Iterator<License> iterator()
224 {
225 checkInit( "iterator" );
226 return licenses.iterator();
227 }
228
229 protected boolean checkExists( URL url )
230 throws IOException
231 {
232 URLConnection openConnection = url.openConnection();
233 return openConnection.getContentLength() > 0;
234 }
235
236 protected void checkInit( String operation )
237 throws IllegalStateException
238 {
239 if ( !init )
240 {
241 throw new IllegalStateException(
242 "repository " + this + " was not init, operation [" + operation + "] not possible." );
243 }
244 }
245
246 protected void checkNotInit( String operation )
247 throws IllegalStateException
248 {
249 if ( init )
250 {
251 throw new IllegalStateException(
252 "repository " + this + "was init, operation [" + operation + "+] not possible." );
253 }
254 }
255
256 }