001 /* $Id: FinderFromResource.java 992060 2010-09-02 19:09:47Z simonetripodi $ 002 * 003 * Licensed to the Apache Software Foundation (ASF) under one or more 004 * contributor license agreements. See the NOTICE file distributed with 005 * this work for additional information regarding copyright ownership. 006 * The ASF licenses this file to You under the Apache License, Version 2.0 007 * (the "License"); you may not use this file except in compliance with 008 * the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 package org.apache.commons.digester.plugins.strategies; 019 020 import java.util.Properties; 021 import java.io.InputStream; 022 023 import org.apache.commons.digester.Digester; 024 import org.apache.commons.digester.plugins.RuleFinder; 025 import org.apache.commons.digester.plugins.RuleLoader; 026 import org.apache.commons.digester.plugins.PluginException; 027 028 /** 029 * A rule-finding algorithm which expects the user to specify a resource 030 * name (ie a file in the classpath). The file is expected to contain Digester 031 * rules in xmlrules format. 032 * 033 * @since 1.6 034 */ 035 036 public class FinderFromResource extends RuleFinder { 037 /** 038 * Name of xml attribute on the plugin declaration which is used 039 * to configure rule-loading for that declaration. 040 */ 041 public static String DFLT_RESOURCE_ATTR = "resource"; 042 043 /** See {@link #findLoader}. */ 044 private String resourceAttr; 045 046 /** Constructor. */ 047 public FinderFromResource() { 048 this(DFLT_RESOURCE_ATTR); 049 } 050 051 /** See {@link #findLoader}. */ 052 public FinderFromResource(String resourceAttr) { 053 this.resourceAttr = resourceAttr; 054 } 055 056 /** 057 * If there exists a property with the name matching constructor param 058 * resourceAttr, then load that file, run it through the xmlrules 059 * module and return an object encapsulating those rules. 060 * <p> 061 * If there is no matching property provided, then just return null. 062 * <p> 063 * The returned object (when non-null) will add the selected rules to 064 * the digester whenever its addRules method is invoked. 065 */ 066 @Override 067 public RuleLoader findLoader(Digester d, Class<?> pluginClass, Properties p) 068 throws PluginException { 069 070 String resourceName = p.getProperty(resourceAttr); 071 if (resourceName == null) { 072 // nope, user hasn't requested dynamic rules to be loaded 073 // from a specific file. 074 return null; 075 } 076 077 InputStream is = 078 pluginClass.getClassLoader().getResourceAsStream( 079 resourceName); 080 081 if (is == null) { 082 throw new PluginException( 083 "Resource " + resourceName + " not found."); 084 } 085 086 return loadRules(d, pluginClass, is, resourceName); 087 } 088 089 /** 090 * Open the specified resource file (ie a file in the classpath, 091 * including being within a jar in the classpath), run it through 092 * the xmlrules module and return an object encapsulating those rules. 093 * 094 * @param d is the digester into which rules will eventually be loaded. 095 * @param pluginClass is the class whose xml params the rules are parsing. 096 * @param is is where the xmlrules will be read from, and must be non-null. 097 * @param resourceName is a string describing the source of the xmlrules, 098 * for use in generating error messages. 099 */ 100 public static RuleLoader loadRules(Digester d, Class<?> pluginClass, 101 InputStream is, String resourceName) 102 throws PluginException { 103 104 try { 105 RuleLoader loader = new LoaderFromStream(is); 106 return loader; 107 } catch(Exception e) { 108 throw new PluginException( 109 "Unable to load xmlrules from resource [" + 110 resourceName + "]", e); 111 } finally { 112 try { 113 is.close(); 114 } catch(java.io.IOException ioe) { 115 throw new PluginException( 116 "Unable to close stream for resource [" + 117 resourceName + "]", ioe); 118 } 119 } 120 } 121 } 122