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 }