1 /* 2 * jDTAUS Banking RI Bankleitzahlenverzeichnis 3 * Copyright (C) 2005 Christian Schulte 4 * <cs@schulte.it> 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 */ 21 package org.jdtaus.banking.ri.blzdirectory; 22 23 import java.io.IOException; 24 import java.net.URL; 25 import java.util.Locale; 26 import java.util.Properties; 27 import org.jdtaus.core.container.ContainerFactory; 28 import org.jdtaus.core.container.PropertyException; 29 import org.jdtaus.core.logging.spi.Logger; 30 31 /** 32 * Default {@code BankfileProvider} implementation backed by a property file. 33 * 34 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 35 * @version $JDTAUS: DefaultBankfileProvider.java 8865 2014-01-10 17:13:42Z schulte $ 36 * 37 * @see BankfileBankleitzahlenVerzeichnis 38 */ 39 public final class DefaultBankfileProvider extends AbstractPropertiesBankfileProvider 40 { 41 42 /** Class loader searched for resources. */ 43 private ClassLoader classLoader; 44 45 /** Location searched for resources. */ 46 private String classpathLocation; 47 48 /** Name of the properties resource. */ 49 private String propertiesResourceName; 50 51 /** Properties backing the instance. */ 52 private Properties properties; 53 54 /** 55 * Creates a new {@code ClasspathBankfileProvider} instance taking a class loader to search for resources, 56 * a location resources are searched at and the name of the properties resource backing the instance. 57 * 58 * @param classLoader Class loader to search for resources or {@code null}. 59 * @param classpathLocation Location to search resources at or {@code null}. 60 * @param propertiesResourceName Name of the properties resource backing the instance or {@code null}. 61 */ 62 public DefaultBankfileProvider( final ClassLoader classLoader, final String classpathLocation, 63 final String propertiesResourceName ) 64 { 65 super(); 66 this.classLoader = classLoader; 67 this.classpathLocation = classpathLocation; 68 this.propertiesResourceName = propertiesResourceName; 69 } 70 71 public URL getBankfile( final int index ) throws IOException 72 { 73 if ( index < 0 || index >= this.getBankfileCount() ) 74 { 75 throw new IndexOutOfBoundsException( Integer.toString( index ) ); 76 } 77 78 final String resourceName = this.getClasspathLocation() + "/" + this.getBankfileLocation( index ); 79 final URL resource = this.getClassLoader().getResource( resourceName ); 80 assert resource != null : "Resource '" + resourceName + "' not found."; 81 return resource; 82 } 83 84 /** 85 * Gets the class loader searched for resources. 86 * <p>This method returns either the current thread's context class loader or this classes class loader, if the 87 * current thread has no context class loader set. A custom class loader can be specified by using one of the 88 * constructors taking a class loader.</p> 89 * 90 * @return The class loader searched for resources. 91 */ 92 public ClassLoader getClassLoader() 93 { 94 if ( this.classLoader == null ) 95 { 96 if ( Thread.currentThread().getContextClassLoader() != null ) 97 { 98 return Thread.currentThread().getContextClassLoader(); 99 } 100 101 this.classLoader = this.getClass().getClassLoader(); 102 if ( this.classLoader == null ) 103 { 104 this.classLoader = ClassLoader.getSystemClassLoader(); 105 } 106 } 107 108 return this.classLoader; 109 } 110 111 /** 112 * Gets the classpath location searched for resources. 113 * 114 * @return The classpath location searched for resources. 115 */ 116 public String getClasspathLocation() 117 { 118 if ( this.classpathLocation == null ) 119 { 120 this.classpathLocation = this.getDefaultClasspathLocation(); 121 } 122 123 return this.classpathLocation; 124 } 125 126 /** 127 * Gets the name of the properties resource backing the instance. 128 * 129 * @return The name of the properties resource backing the instance. 130 */ 131 public String getPropertiesResourceName() 132 { 133 if ( this.propertiesResourceName == null ) 134 { 135 this.propertiesResourceName = this.getDefaultPropertiesResourceName(); 136 } 137 138 return this.propertiesResourceName; 139 } 140 141 /** 142 * Gets the properties backing the instance. 143 * 144 * @return The properties backing the instance. 145 * 146 * @throws IOException if loading the properties fails. 147 */ 148 public Properties getProperties() throws IOException 149 { 150 if ( this.properties == null ) 151 { 152 this.assertValidProperties(); 153 final String propertiesLocation = this.getClasspathLocation() + "/" + this.getPropertiesResourceName(); 154 final URL rsrc = this.getClassLoader().getResource( propertiesLocation ); 155 final Properties p = new Properties(); 156 157 if ( rsrc != null ) 158 { 159 p.load( rsrc.openStream() ); 160 } 161 else 162 { 163 this.getLogger().info( this.getPropertiesNotFoundMessage( this.getLocale(), propertiesLocation ) ); 164 } 165 166 this.properties = p; 167 } 168 169 return this.properties; 170 } 171 172 /** 173 * Checks configured properties. 174 * 175 * @throws PropertyException if properties hold invalid values. 176 */ 177 private void assertValidProperties() 178 { 179 if ( this.getClasspathLocation() == null ) 180 { 181 throw new PropertyException( "classpathLocation", this.getClasspathLocation() ); 182 } 183 if ( this.getPropertiesResourceName() == null || this.getPropertiesResourceName().length() <= 0 ) 184 { 185 throw new PropertyException( "propertiesResourceName", this.getPropertiesResourceName() ); 186 } 187 } 188 189 //--Constructors------------------------------------------------------------ 190 191 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausConstructors 192 // This section is managed by jdtaus-container-mojo. 193 194 /** Standard implementation constructor <code>org.jdtaus.banking.ri.blzdirectory.DefaultBankfileProvider</code>. */ 195 public DefaultBankfileProvider() 196 { 197 super(); 198 } 199 200 // </editor-fold>//GEN-END:jdtausConstructors 201 202 //------------------------------------------------------------Constructors-- 203 //--Dependencies------------------------------------------------------------ 204 205 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausDependencies 206 // This section is managed by jdtaus-container-mojo. 207 208 /** 209 * Gets the configured <code>Logger</code> implementation. 210 * 211 * @return The configured <code>Logger</code> implementation. 212 */ 213 private Logger getLogger() 214 { 215 return (Logger) ContainerFactory.getContainer(). 216 getDependency( this, "Logger" ); 217 218 } 219 220 /** 221 * Gets the configured <code>Locale</code> implementation. 222 * 223 * @return The configured <code>Locale</code> implementation. 224 */ 225 private Locale getLocale() 226 { 227 return (Locale) ContainerFactory.getContainer(). 228 getDependency( this, "Locale" ); 229 230 } 231 232 // </editor-fold>//GEN-END:jdtausDependencies 233 234 //------------------------------------------------------------Dependencies-- 235 //--Properties-------------------------------------------------------------- 236 237 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausProperties 238 // This section is managed by jdtaus-container-mojo. 239 240 /** 241 * Gets the value of property <code>defaultPropertiesResourceName</code>. 242 * 243 * @return Default resource name of the classpath properties resource backing the implementation. 244 */ 245 private java.lang.String getDefaultPropertiesResourceName() 246 { 247 return (java.lang.String) ContainerFactory.getContainer(). 248 getProperty( this, "defaultPropertiesResourceName" ); 249 250 } 251 252 /** 253 * Gets the value of property <code>defaultClasspathLocation</code>. 254 * 255 * @return Default classpath location of the resources backing the implementation. 256 */ 257 private java.lang.String getDefaultClasspathLocation() 258 { 259 return (java.lang.String) ContainerFactory.getContainer(). 260 getProperty( this, "defaultClasspathLocation" ); 261 262 } 263 264 // </editor-fold>//GEN-END:jdtausProperties 265 266 //--------------------------------------------------------------Properties-- 267 //--Messages---------------------------------------------------------------- 268 269 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausMessages 270 // This section is managed by jdtaus-container-mojo. 271 272 /** 273 * Gets the text of message <code>propertiesNotFound</code>. 274 * <blockquote><pre>Properties Ressource ''{0}'' nicht gefunden - keine Bereitstellung von Klassenpfad-Bankleitzahlen-Dateien.</pre></blockquote> 275 * <blockquote><pre>Properties resource ''{0}'' not found - not providing classpath bankcode files.</pre></blockquote> 276 * 277 * @param locale The locale of the message instance to return. 278 * @param location format parameter. 279 * 280 * @return the text of message <code>propertiesNotFound</code>. 281 */ 282 private String getPropertiesNotFoundMessage( final Locale locale, 283 final java.lang.String location ) 284 { 285 return ContainerFactory.getContainer(). 286 getMessage( this, "propertiesNotFound", locale, 287 new Object[] 288 { 289 location 290 }); 291 292 } 293 294 // </editor-fold>//GEN-END:jdtausMessages 295 296 //----------------------------------------------------------------Messages-- 297 }