View Javadoc
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 }