001 /** 002 * Copyright 2010-2013 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.codehaus.mojo.license.model; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.apache.commons.logging.Log; 020 import org.apache.commons.logging.LogFactory; 021 import org.apache.maven.plugin.MojoExecutionException; 022 023 import java.io.IOException; 024 import java.net.URL; 025 import java.util.ArrayList; 026 import java.util.Iterator; 027 import java.util.List; 028 029 /** 030 * The {@code LicenseStore} offers {@link License} coming from different {@link 031 * LicenseRepository}. 032 * 033 * @author tchemit <chemit@codelutin.com> 034 * @since 1.0 035 */ 036 public class LicenseStore 037 implements Iterable<LicenseRepository> 038 { 039 040 /** 041 * Logger 042 */ 043 private static final Log log = LogFactory.getLog( LicenseStore.class ); 044 045 /** 046 * class-path directory where is the licenses repository 047 */ 048 public static final String JAR_LICENSE_REPOSITORY = "/META-INF/licenses"; 049 050 /** 051 * list of available license repositories 052 */ 053 protected List<LicenseRepository> repositories; 054 055 /** 056 * flag to know if store was init 057 */ 058 protected boolean init; 059 060 public static LicenseStore createLicenseStore( org.apache.maven.plugin.logging.Log log, String... extraResolver ) 061 throws MojoExecutionException 062 { 063 LicenseStore store; 064 try 065 { 066 store = new LicenseStore(); 067 store.addJarRepository(); 068 if ( extraResolver != null ) 069 { 070 for ( String s : extraResolver ) 071 { 072 if ( StringUtils.isNotEmpty( s ) ) 073 { 074 log.info( "adding extra resolver " + s ); 075 store.addRepository( s ); 076 } 077 } 078 } 079 store.init(); 080 } 081 catch ( IllegalArgumentException ex ) 082 { 083 throw new MojoExecutionException( "could not obtain the license repository", ex ); 084 } 085 catch ( IOException ex ) 086 { 087 throw new MojoExecutionException( "could not obtain the license repository", ex ); 088 } 089 return store; 090 } 091 092 public void init() 093 throws IOException 094 { 095 checkNotInit( "init" ); 096 try 097 { 098 if ( repositories == null ) 099 { 100 // adding the default class-path repository 101 addJarRepository(); 102 } 103 for ( LicenseRepository r : this ) 104 { 105 r.load(); 106 } 107 } 108 finally 109 { 110 init = true; 111 } 112 } 113 114 public List<LicenseRepository> getRepositories() 115 { 116 return repositories; 117 } 118 119 public String[] getLicenseNames() 120 { 121 checkInit( "getLicenseNames" ); 122 List<String> result = new ArrayList<String>(); 123 for ( LicenseRepository repository : this ) 124 { 125 for ( License license : repository ) 126 { 127 result.add( license.getName() ); 128 } 129 } 130 return result.toArray( new String[result.size()] ); 131 } 132 133 public License[] getLicenses() 134 { 135 checkInit( "getLicenses" ); 136 List<License> result = new ArrayList<License>(); 137 if ( repositories != null ) 138 { 139 for ( LicenseRepository repository : this ) 140 { 141 for ( License license : repository ) 142 { 143 result.add( license ); 144 } 145 } 146 } 147 return result.toArray( new License[result.size()] ); 148 } 149 150 public License getLicense( String licenseName ) 151 { 152 checkInit( "getLicense" ); 153 Iterator<LicenseRepository> itr = iterator(); 154 License result = null; 155 while ( itr.hasNext() ) 156 { 157 LicenseRepository licenseRepository = itr.next(); 158 License license = licenseRepository.getLicense( licenseName ); 159 if ( license != null ) 160 { 161 result = license; 162 break; 163 } 164 } 165 if ( result == null && log.isDebugEnabled() ) 166 { 167 log.debug( "could not find license named '" + licenseName + "'" ); 168 } 169 return result; 170 } 171 172 public void addRepository( String extraResolver ) 173 throws IOException 174 { 175 addRepository( new URL( extraResolver ) ); 176 } 177 178 public void addRepository( URL baseURL ) 179 throws IOException 180 { 181 checkNotInit( "addRepository" ); 182 LicenseRepository repository = new LicenseRepository(); 183 repository.setBaseURL( baseURL ); 184 if ( log.isDebugEnabled() ) 185 { 186 log.debug( "Adding a license repository " + repository ); 187 } 188 addRepository( repository ); 189 } 190 191 public void addJarRepository() 192 throws IOException 193 { 194 checkNotInit( "addJarRepository" ); 195 URL baseURL = getClass().getResource( JAR_LICENSE_REPOSITORY ); 196 LicenseRepository repository = new LicenseRepository(); 197 repository.setBaseURL( baseURL ); 198 if ( log.isDebugEnabled() ) 199 { 200 log.debug( "Adding a jar license repository " + repository ); 201 } 202 addRepository( repository ); 203 } 204 205 public Iterator<LicenseRepository> iterator() 206 { 207 return getRepositories().iterator(); 208 } 209 210 protected void addRepository( LicenseRepository repository ) 211 { 212 checkNotInit( "addRepository" ); 213 if ( repositories == null ) 214 { 215 repositories = new ArrayList<LicenseRepository>(); 216 217 } 218 if ( log.isInfoEnabled() ) 219 { 220 log.info( "Adding a license repository " + repository.getBaseURL() ); 221 } 222 repositories.add( repository ); 223 } 224 225 protected void checkInit( String operation ) 226 throws IllegalStateException 227 { 228 if ( !init ) 229 { 230 throw new IllegalStateException( "store was not init, operation [" + operation + "] not possible." ); 231 } 232 } 233 234 protected void checkNotInit( String operation ) 235 throws IllegalStateException 236 { 237 if ( init ) 238 { 239 throw new IllegalStateException( "store was init, operation [" + operation + "+] not possible." ); 240 } 241 } 242 }