View Javadoc
1   /*
2    *  jDTAUS Banking RI CurrencyDirectory
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.currencydir;
22  
23  import java.io.IOException;
24  import java.net.URL;
25  import java.util.Collection;
26  import java.util.Enumeration;
27  import java.util.LinkedList;
28  import org.jdtaus.core.container.ContainerFactory;
29  import org.jdtaus.core.container.PropertyException;
30  
31  /**
32   * Default {@code JaxpCurrenciesProvider} implementation.
33   * <p>This implementation provides resources by searching the classpath. Property {@code resourceName} holds the name of
34   * the resources to search and defaults to {@code META-INF/jdtaus/currencies.xml}.</p>
35   *
36   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
37   * @version $JDTAUS: DefaultJaxpCurrenciesProvider.java 8661 2012-09-27 11:29:58Z schulte $
38   *
39   * @see JaxpCurrencyDirectory
40   */
41  public class DefaultJaxpCurrenciesProvider implements JaxpCurrenciesProvider
42  {
43  
44      /** Class loader searched for resources. */
45      private ClassLoader classLoader;
46  
47      /** Name of the classpath resource to search. */
48      private String resourceName;
49  
50      /**
51       * Creates a new {@code ClasspathCurrenciesProvider} instance taking the name of the classpath resources to search.
52       *
53       * @param resourceName Name of the classpath resources to search.
54       */
55      public DefaultJaxpCurrenciesProvider( final String resourceName )
56      {
57          this( resourceName, null );
58      }
59  
60      /**
61       * Creates a new {@code ClasspathCurrenciesProvider} instance taking the class loader to search for resources.
62       *
63       * @param classLoader the class loader to search for resources.
64       */
65      public DefaultJaxpCurrenciesProvider( final ClassLoader classLoader )
66      {
67          this( null, classLoader );
68      }
69  
70      /**
71       * Creates a new {@code ClasspathCurrenciesProvider} instance taking the name of the classpath resources to search
72       * and the class loader to search for resources.
73       *
74       * @param resourceName Name of the classpath resources to search.
75       * @param classLoader The class loader to search for resources.
76       */
77      public DefaultJaxpCurrenciesProvider( final String resourceName, final ClassLoader classLoader )
78      {
79          this.resourceName = resourceName;
80          this.classLoader = classLoader;
81      }
82  
83      /**
84       * Gets the name of the classpath resource to search.
85       *
86       * @return The name of the classpath resource to search.
87       */
88      public String getResourceName()
89      {
90          if ( this.resourceName == null )
91          {
92              this.resourceName = this.getDefaultResourceName();
93          }
94  
95          return this.resourceName;
96      }
97  
98      /**
99       * Gets the class loader searched for resources.
100      * <p>This method returns either the current thread's context class loader or this classes class loader, if the
101      * current thread has no context class loader set. A custom class loader can be specified by using one of
102      * the constructors taking a class loader.</p>
103      *
104      * @return The class loader to search for resources.
105      */
106     public ClassLoader getClassLoader()
107     {
108         if ( this.classLoader == null )
109         {
110             if ( Thread.currentThread().getContextClassLoader() != null )
111             {
112                 return Thread.currentThread().getContextClassLoader();
113             }
114 
115             this.classLoader = this.getClass().getClassLoader();
116             if ( this.classLoader == null )
117             {
118                 this.classLoader = ClassLoader.getSystemClassLoader();
119             }
120         }
121 
122         return this.classLoader;
123     }
124 
125     public URL[] getResources() throws IOException
126     {
127         this.assertValidProperties();
128         final Collection col = new LinkedList();
129         final Enumeration en = this.getClassLoader().getResources( this.getResourceName() );
130 
131         while ( en.hasMoreElements() )
132         {
133             col.add( en.nextElement() );
134         }
135 
136         return (URL[]) col.toArray( new URL[ col.size() ] );
137     }
138 
139     /**
140      * Checks configured properties.
141      *
142      * @throws PropertyException if properties hold invalid values.
143      */
144     private void assertValidProperties()
145     {
146         if ( this.getResourceName() == null || this.getResourceName().length() <= 0 )
147         {
148             throw new PropertyException( "resourceName", this.getResourceName() );
149         }
150     }
151 
152     //--Constructors------------------------------------------------------------
153 
154 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausConstructors
155     // This section is managed by jdtaus-container-mojo.
156 
157     /** Standard implementation constructor <code>org.jdtaus.banking.ri.currencydir.DefaultJaxpCurrenciesProvider</code>. */
158     public DefaultJaxpCurrenciesProvider()
159     {
160         super();
161     }
162 
163 // </editor-fold>//GEN-END:jdtausConstructors
164 
165     //------------------------------------------------------------Constructors--
166     //--Properties--------------------------------------------------------------
167 
168 // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:jdtausProperties
169     // This section is managed by jdtaus-container-mojo.
170 
171     /**
172      * Gets the value of property <code>defaultResourceName</code>.
173      *
174      * @return Default name of the resources to provide.
175      */
176     private java.lang.String getDefaultResourceName()
177     {
178         return (java.lang.String) ContainerFactory.getContainer().
179             getProperty( this, "defaultResourceName" );
180 
181     }
182 
183 // </editor-fold>//GEN-END:jdtausProperties
184 
185     //--------------------------------------------------------------Properties--
186 }