View Javadoc

1   /*
2    * Copyright 2008-2013 smartics, Kronseder & Reiner GmbH
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package de.smartics.util.test.io;
17  
18  import java.io.BufferedInputStream;
19  import java.io.File;
20  import java.io.FileReader;
21  import java.io.IOException;
22  import java.io.InputStream;
23  import java.io.Reader;
24  import java.net.URL;
25  import java.util.Properties;
26  
27  import org.apache.commons.io.IOUtils;
28  
29  /**
30   * Utilities to make unit tests with files easier.
31   *
32   * @author <a href="mailto:robert.reiner@smartics.de">Robert Reiner</a>
33   * @version $Revision:591 $
34   */
35  public final class FileTestUtils
36  {
37    // ********************************* Fields *********************************
38  
39    // --- constants ------------------------------------------------------------
40  
41    // --- members --------------------------------------------------------------
42  
43    // ****************************** Initializer *******************************
44  
45    // ****************************** Constructors ******************************
46  
47    /**
48     * Utility class pattern.
49     */
50    private FileTestUtils()
51    {
52    }
53  
54    // ****************************** Inner Classes *****************************
55  
56    // ********************************* Methods ********************************
57  
58    // --- init -----------------------------------------------------------------
59  
60    // --- get&set --------------------------------------------------------------
61  
62    // --- business -------------------------------------------------------------
63  
64    /**
65     * Returns the specified file from the class path.
66     *
67     * @param resourceName name of the resource (file or directory) in the class
68     *          path.
69     * @return the file representation of the resource or <code>null</code> if the
70     *         resource does not exist, is not accessible via the
71     *         <code>file:/</code> protocol or due to missing privileges.
72     */
73    public static File getFileFromResource(final String resourceName)
74    {
75      final ClassLoader classLoader = FileTestUtils.class.getClassLoader(); // NOPMD
76      return getFileFromResource(classLoader, resourceName);
77    }
78  
79    /**
80     * Returns the specified file from the specified class loader.
81     *
82     * @param classLoader the class loader to load the resource from.
83     * @param resourceName name of the resource (file or directory) in the class
84     *          path.
85     * @return the file representation of the resource or <code>null</code> if the
86     *         resource does not exist, is not accessible via the
87     *         <code>file:/</code> protocol or due to missing privileges.
88     */
89    public static File getFileFromResource(final ClassLoader classLoader,
90        final String resourceName)
91    {
92      final URL url = classLoader.getResource(resourceName);
93      final File file = getFileFrom(url);
94      return file;
95    }
96  
97    /**
98     * Returns the specified file from the class loader associated with the given
99     * type.
100    *
101    * @param type the type to refer to the class loader to load the resource
102    *          from. The resource is relative to this type.
103    * @param resourceName name of the resource (file or directory) in the class
104    *          path.
105    * @return the file representation of the resource or <code>null</code> if the
106    *         resource does not exist, is not accessible via the
107    *         <code>file:/</code> protocol or due to missing privileges.
108    */
109   public static File getFileFromResource(final Class<?> type,
110       final String resourceName)
111   {
112     return getFileFromResource(type.getClassLoader(), resourceName);
113   }
114 
115   /**
116    * Returns the specified file from a resource relative to the given type.
117    *
118    * @param type the type to refer to the class loader to load the resource
119    *          from. The resource is relative to this type.
120    * @param relativeResourceName name of the resource (file or directory) in the
121    *          class path, relative to the passed in <code>type</code>.
122    * @return the file representation of the resource or <code>null</code> if the
123    *         resource does not exist, is not accessible via the
124    *         <code>file:/</code> protocol or due to missing privileges.
125    */
126   public static File getFileFromRelativeResource(final Class<?> type,
127       final String relativeResourceName)
128   {
129     final URL url = type.getResource(relativeResourceName);
130     final File file = getFileFrom(url);
131     return file;
132   }
133 
134   private static File getFileFrom(final URL url)
135   {
136     if (url != null)
137     {
138       final String resourceAsString = url.toExternalForm();
139 
140       if (resourceAsString.startsWith("file:/"))
141       {
142         final int startIndex = isWindows() ? 6 : 5;
143         final String fileName = resourceAsString.substring(startIndex);
144         final File file = new File(fileName);
145         return file;
146       }
147     }
148     return null;
149   }
150 
151   private static boolean isWindows()
152   {
153     return File.separatorChar == '\\';
154   }
155 
156   /**
157    * Returns a properties object backed by the specified file from a resource
158    * relative to the given type with the simple name of the resource with an
159    * ending <code>.properties</code> .
160    *
161    * @param clazz the type to refer to the class loader to load the resource
162    *          from. The resource is relative to this type and has its simple
163    *          name.
164    * @return the properties object containing the properties or empty if the
165    *         resource does not exist or is empty.
166    */
167   public static Properties getPropertiesFromRelativePropertiesFileForClass(
168       final Class<?> clazz)
169   {
170 
171     final InputStream is =
172         clazz.getResourceAsStream(clazz.getSimpleName().concat(".properties"));
173     final BufferedInputStream buffer = new BufferedInputStream(is);
174     final Properties props = new Properties();
175     try
176     {
177       props.load(buffer);
178     }
179     catch (final IOException ioe)
180     {
181       // Do nohing
182     }
183     finally
184     {
185       IOUtils.closeQuietly(buffer);
186     }
187     return props;
188   }
189   // --- object basics --------------------------------------------------------
190 
191 }