| package org.apache.commons.jcs3.utils.props; |
| |
| import java.io.IOException; |
| |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| import java.io.InputStream; |
| import java.util.Properties; |
| |
| /** |
| * I modified this class to work with .ccf files in particular. I also removed |
| * the resource bundle functionality. |
| * <p> |
| * A simple class for loading java.util.Properties backed by .ccf files deployed |
| * as classpath resources. See individual methods for details. |
| * <p> |
| * The original source is from: |
| * <p> |
| * @author (C) <a |
| * href="http://www.javaworld.com/columns/jw-qna-index.shtml">Vlad |
| * Roubtsov </a>, 2003 |
| */ |
| public abstract class PropertyLoader |
| { |
| /** throw an error if we can load the file */ |
| private static final boolean THROW_ON_LOAD_FAILURE = true; |
| |
| /** File suffix. */ |
| private static final String SUFFIX = ".ccf"; |
| |
| /** property suffix */ |
| private static final String SUFFIX_PROPERTIES = ".properties"; |
| |
| /** |
| * Looks up a resource named 'name' in the classpath. The resource must map |
| * to a file with .ccf extention. The name is assumed to be absolute and can |
| * use either "/" or "." for package segment separation with an optional |
| * leading "/" and optional ".ccf" suffix. |
| * <p> |
| * The suffix ".ccf" will be appended if it is not set. This can also handle |
| * .properties files |
| * <p> |
| * Thus, the following names refer to the same resource: |
| * |
| * <pre> |
| * |
| * some.pkg.Resource |
| * some.pkg.Resource.ccf |
| * some/pkg/Resource |
| * some/pkg/Resource.ccf |
| * /some/pkg/Resource |
| * /some/pkg/Resource.ccf |
| * </pre> |
| * |
| * @param name |
| * classpath resource name [may not be null] |
| * @param loader |
| * classloader through which to load the resource [null is |
| * equivalent to the application loader] |
| * @return resource converted to java.util.properties [may be null if the |
| * resource was not found and THROW_ON_LOAD_FAILURE is false] |
| * @throws IllegalArgumentException |
| * if the resource was not found and THROW_ON_LOAD_FAILURE is |
| * true |
| */ |
| public static Properties loadProperties( final String name, final ClassLoader loader ) |
| { |
| boolean isCCFSuffix = true; |
| |
| if ( name == null ) |
| { |
| throw new IllegalArgumentException( "null input: name" ); |
| } |
| |
| final ClassLoader classLoader = ( loader == null ) ? ClassLoader.getSystemClassLoader() : loader; |
| |
| String fileName = name.startsWith( "/" ) ? name.substring( 1 ) : name; |
| |
| if ( fileName.endsWith( SUFFIX ) ) |
| { |
| fileName = fileName.substring( 0, fileName.length() - SUFFIX.length() ); |
| } |
| |
| if ( fileName.endsWith( SUFFIX_PROPERTIES ) ) |
| { |
| fileName = fileName.substring( 0, fileName.length() - SUFFIX_PROPERTIES.length() ); |
| isCCFSuffix = false; |
| } |
| |
| fileName = fileName.replace( '.', '/' ); |
| |
| if ( !fileName.endsWith( SUFFIX ) && isCCFSuffix ) |
| { |
| fileName = fileName.concat( SUFFIX ); |
| } |
| else if ( !fileName.endsWith( SUFFIX_PROPERTIES ) && !isCCFSuffix ) |
| { |
| fileName = fileName.concat( SUFFIX_PROPERTIES ); |
| } |
| |
| Properties result = null; |
| |
| try (InputStream in = classLoader.getResourceAsStream( fileName )) |
| { |
| result = new Properties(); |
| result.load( in ); // can throw IOException |
| } |
| catch ( final IOException e ) |
| { |
| result = null; |
| } |
| |
| if ( THROW_ON_LOAD_FAILURE && result == null ) |
| { |
| throw new IllegalArgumentException( "could not load [" + fileName + "]" + " as " + "a classloader resource" ); |
| } |
| |
| return result; |
| } |
| |
| /** |
| * A convenience overload of {@link #loadProperties(String, ClassLoader)} |
| * that uses the current thread's context classloader. A better strategy |
| * would be to use techniques shown in |
| * http://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.html |
| * <p> |
| * @param name |
| * @return Properties |
| */ |
| public static Properties loadProperties( final String name ) |
| { |
| return loadProperties( name, Thread.currentThread().getContextClassLoader() ); |
| } |
| |
| /** |
| * Can't use this one. |
| */ |
| private PropertyLoader() |
| { |
| } // this class is not extentible |
| |
| } |