Index: lucene/analysis/phonetic/src/test/org/apache/lucene/analysis/phonetic/TestPhoneticFilterFactory.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/analysis/phonetic/src/test/org/apache/lucene/analysis/phonetic/TestPhoneticFilterFactory.java (revision 1372446) +++ lucene/analysis/phonetic/src/test/org/apache/lucene/analysis/phonetic/TestPhoneticFilterFactory.java (revision ) @@ -17,6 +17,7 @@ * limitations under the License. */ +import java.io.IOException; import java.io.StringReader; import java.util.HashMap; import java.util.Map; @@ -27,6 +28,7 @@ import org.apache.lucene.analysis.MockTokenizer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.Tokenizer; +import org.apache.lucene.analysis.util.ClasspathResourceLoader; import org.apache.lucene.util.LuceneTestCase.Slow; @@ -41,48 +43,54 @@ /** * Case: default */ - public void testFactory() - { + public void testFactory() throws IOException { Map args = new HashMap(); PhoneticFilterFactory ff = new PhoneticFilterFactory(); args.put( PhoneticFilterFactory.ENCODER, "Metaphone" ); ff.init( args ); + ff.inform(new ClasspathResourceLoader(ff.getClass())); assertTrue( ff.getEncoder() instanceof Metaphone ); assertTrue( ff.inject ); // default args.put( PhoneticFilterFactory.INJECT, "false" ); ff.init( args ); + ff.inform(new ClasspathResourceLoader(ff.getClass())); assertFalse( ff.inject ); args.put( PhoneticFilterFactory.MAX_CODE_LENGTH, "2"); - ff.init( args ); + ff.init(args); + ff.inform(new ClasspathResourceLoader(ff.getClass())); - assertEquals(2,((Metaphone) ff.getEncoder()).getMaxCodeLen()); + assertEquals(2, ((Metaphone) ff.getEncoder()).getMaxCodeLen()); } /** * Case: Failures and Exceptions */ - public void testFactoryCaseFailure() - { + public void testFactoryCaseFailure() throws IOException { Map args = new HashMap(); PhoneticFilterFactory ff = new PhoneticFilterFactory(); + ClasspathResourceLoader loader = new ClasspathResourceLoader(ff.getClass()); + try { ff.init( args ); + ff.inform( loader ); fail( "missing encoder parameter" ); } catch( Exception ex ) {} args.put( PhoneticFilterFactory.ENCODER, "XXX" ); try { ff.init( args ); + ff.inform( loader ); fail( "unknown encoder parameter" ); } catch( Exception ex ) {} args.put( PhoneticFilterFactory.ENCODER, "org.apache.commons.codec.language.NonExistence" ); try { ff.init( args ); + ff.inform( loader ); fail( "unknown encoder parameter" ); } catch( Exception ex ) {} @@ -91,14 +99,15 @@ /** * Case: Reflection */ - public void testFactoryCaseReflection() - { + public void testFactoryCaseReflection() throws IOException { Map args = new HashMap(); PhoneticFilterFactory ff = new PhoneticFilterFactory(); + ClasspathResourceLoader loader = new ClasspathResourceLoader(ff.getClass()); args.put( PhoneticFilterFactory.ENCODER, "org.apache.commons.codec.language.Metaphone" ); ff.init( args ); + ff.inform( loader ); assertTrue( ff.getEncoder() instanceof Metaphone ); assertTrue( ff.inject ); // default @@ -106,12 +115,14 @@ // so this effectively tests reflection without package name args.put( PhoneticFilterFactory.ENCODER, "Caverphone2" ); ff.init( args ); + ff.inform( loader ); assertTrue( ff.getEncoder() instanceof Caverphone2 ); assertTrue( ff.inject ); // default // cross check with registry args.put( PhoneticFilterFactory.ENCODER, "Caverphone" ); ff.init( args ); + ff.inform( loader ); assertTrue( ff.getEncoder() instanceof Caverphone2 ); assertTrue( ff.inject ); // default } @@ -158,6 +169,7 @@ args.put("inject", inject); PhoneticFilterFactory factory = new PhoneticFilterFactory(); factory.init(args); + factory.inform(new ClasspathResourceLoader(factory.getClass())); TokenStream stream = factory.create(tokenizer); assertTokenStreamContents(stream, expected); } Index: lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java (revision 1372446) +++ lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballPorterFilterFactory.java (revision ) @@ -46,35 +46,28 @@ public static final String PROTECTED_TOKENS = "protected"; private String language = "English"; - private Class stemClass; + private Class stemClass; + private CharArraySet protectedWords = null; - + @Override public void inform(ResourceLoader loader) throws IOException { + String cfgLanguage = args.get("language"); + if (cfgLanguage != null) + language = cfgLanguage; + + String className = "org.tartarus.snowball.ext." + language + "Stemmer"; + stemClass = loader.newInstance(className, SnowballProgram.class).getClass(); + String wordFiles = args.get(PROTECTED_TOKENS); if (wordFiles != null) { protectedWords = getWordSet(loader, wordFiles, false); } } - private CharArraySet protectedWords = null; - - @Override - public void init(Map args) { - super.init(args); - final String cfgLanguage = args.get("language"); - if(cfgLanguage!=null) language = cfgLanguage; - - try { - stemClass = Class.forName("org.tartarus.snowball.ext." + language + "Stemmer"); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Can't find class for stemmer language " + language, e); - } - } - public TokenFilter create(TokenStream input) { SnowballProgram program; try { - program = (SnowballProgram)stemClass.newInstance(); + program = stemClass.newInstance(); } catch (Exception e) { throw new RuntimeException("Error instantiating stemmer for language " + language + "from class " + stemClass, e); } Index: lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestFactories.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestFactories.java (revision 1372446) +++ lucene/analysis/common/src/test/org/apache/lucene/analysis/core/TestFactories.java (revision ) @@ -27,6 +27,7 @@ import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.util.AbstractAnalysisFactory; import org.apache.lucene.analysis.util.CharFilterFactory; +import org.apache.lucene.analysis.util.ClasspathResourceLoader; import org.apache.lucene.analysis.util.MultiTermAwareComponent; import org.apache.lucene.analysis.util.ResourceLoaderAware; import org.apache.lucene.analysis.util.StringMockResourceLoader; @@ -114,11 +115,15 @@ } /** tries to initialize a factory with no arguments */ - private boolean initialize(AbstractAnalysisFactory factory) { + private boolean initialize(AbstractAnalysisFactory factory) throws IOException { boolean success = false; try { factory.setLuceneMatchVersion(TEST_VERSION_CURRENT); factory.init(Collections.emptyMap()); + if (factory instanceof ResourceLoaderAware) { + ResourceLoaderAware resourceLoaderAware = (ResourceLoaderAware) factory; + resourceLoaderAware.inform(new ClasspathResourceLoader(factory.getClass())); + } success = true; } catch (IllegalArgumentException ignored) { // its ok if we dont provide the right parameters to throw this Index: lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java (revision 1372446) +++ lucene/analysis/phonetic/src/java/org/apache/lucene/analysis/phonetic/PhoneticFilterFactory.java (revision ) @@ -17,6 +17,7 @@ * limitations under the License. */ +import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; @@ -26,7 +27,8 @@ import org.apache.commons.codec.Encoder; import org.apache.commons.codec.language.*; import org.apache.lucene.analysis.TokenStream; -import org.apache.lucene.analysis.phonetic.PhoneticFilter; +import org.apache.lucene.analysis.util.ResourceLoader; +import org.apache.lucene.analysis.util.ResourceLoaderAware; import org.apache.lucene.analysis.util.TokenFilterFactory; /** @@ -57,6 +59,7 @@ * @see PhoneticFilter */ public class PhoneticFilterFactory extends TokenFilterFactory + implements ResourceLoaderAware { public static final String ENCODER = "encoder"; public static final String INJECT = "inject"; // boolean @@ -75,18 +78,17 @@ registry.put("ColognePhonetic".toUpperCase(Locale.ROOT), ColognePhonetic.class); } - protected boolean inject = true; - protected String name = null; - protected Class clazz = null; - protected Method setMaxCodeLenMethod = null; - protected Integer maxCodeLength = null; + protected boolean inject = true; //protected for access from test + private String name = null; + private Class clazz = null; + private Method setMaxCodeLenMethod = null; + private Integer maxCodeLength = null; @Override - public void init(Map args) { - super.init( args ); + public void inform(ResourceLoader loader) throws IOException { inject = getBoolean(INJECT, true); - + String name = args.get( ENCODER ); if( name == null ) { throw new IllegalArgumentException("Missing required parameter: " + ENCODER @@ -94,7 +96,7 @@ } clazz = registry.get(name.toUpperCase(Locale.ROOT)); if( clazz == null ) { - clazz = resolveEncoder(name); + clazz = resolveEncoder(name, loader); } String v = args.get(MAX_CODE_LENGTH); @@ -110,17 +112,15 @@ getEncoder();//trigger initialization for potential problems to be thrown now } - private Class resolveEncoder(String name) { + private Class resolveEncoder(String name, ResourceLoader loader) { String lookupName = name; if (name.indexOf('.') == -1) { lookupName = PACKAGE_CONTAINING_ENCODERS + name; } try { - return Class.forName(lookupName).asSubclass(Encoder.class); - } catch (ClassNotFoundException cnfe) { - throw new IllegalArgumentException("Unknown encoder: " + name + " must be full class name or one of " + registry.keySet(), cnfe); - } catch (ClassCastException e) { - throw new IllegalArgumentException("Not an encoder: " + name + " must be full class name or one of " + registry.keySet(), e); + return loader.newInstance(lookupName, Encoder.class).getClass(); + } catch (RuntimeException e) { + throw new IllegalArgumentException("Error loading encoder '" + name + "': must be full class name or one of " + registry.keySet(), e); } } Index: lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java (revision 1372446) +++ lucene/analysis/common/src/java/org/apache/lucene/analysis/snowball/SnowballFilter.java (revision ) @@ -44,7 +44,7 @@ private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); private final KeywordAttribute keywordAttr = addAttribute(KeywordAttribute.class); - + public SnowballFilter(TokenStream input, SnowballProgram stemmer) { super(input); this.stemmer = stemmer; @@ -62,7 +62,9 @@ */ public SnowballFilter(TokenStream in, String name) { super(in); + //Class.forName is frowned upon in place of the ResourceLoader but in this case, + // the factory will use the other constructor so that the program is already loaded. - try { + try { Class stemClass = Class.forName("org.tartarus.snowball.ext." + name + "Stemmer").asSubclass(SnowballProgram.class); stemmer = stemClass.newInstance();