That was if we were loading a class via a FQCN. When you have the class object itself, there's nothing to worry about as the class is already loaded!
On 27 May 2014 18:33, Remko Popma <remko.po...@gmail.com> wrote: > Really? What about the OSGi classloader issue you mentioned? > > Sent from my iPhone > > On 2014/05/28, at 7:34, Matt Sicker <boa...@gmail.com> wrote: > > Will do :) > > > On 27 May 2014 15:27, Gary Gregory <garydgreg...@gmail.com> wrote: > >> I'll leave it to you to fix that up then ;-) >> >> Gary >> >> >> On Tue, May 27, 2014 at 4:19 PM, Matt Sicker <boa...@gmail.com> wrote: >> >>> Oh wow, I can't believe I missed that. It would work better to just use >>> the class instead anyhow! >>> >>> >>> On 27 May 2014 13:15, Gary Gregory <garydgreg...@gmail.com> wrote: >>> >>>> Sure, @Test (expected=SomeException.class) >>>> >>>> Gary >>>> >>>> >>>> -------- Original message -------- >>>> From: Matt Sicker >>>> Date:05/27/2014 13:03 (GMT-05:00) >>>> To: Log4J Developers List >>>> Subject: Re: svn commit: r1597790 - in >>>> /logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins: >>>> ./ util/ visitors/ >>>> >>>> You can put a class in an annotation? >>>> >>>> >>>> On 27 May 2014 10:49, Remko Popma <remko.po...@gmail.com> wrote: >>>> >>>>> You may want to document that you use String FQCNs on purpose even >>>>> though annotations let you use Classes, to make it OSGi-friendly. >>>>> Otherwise >>>>> the next person may refactor this... >>>>> >>>>> >>>>> On Tue, May 27, 2014 at 10:57 PM, <mattsic...@apache.org> wrote: >>>>> >>>>>> Author: mattsicker >>>>>> Date: Tue May 27 13:57:31 2014 >>>>>> New Revision: 1597790 >>>>>> >>>>>> URL: http://svn.apache.org/r1597790 >>>>>> Log: >>>>>> Switch from a registry-based strategy to a meta-annotation-based >>>>>> strategy for associating visitors to annotations. >>>>>> >>>>>> - More easily extensible as there is no registry or special file to >>>>>> maintain. >>>>>> - Still maintains OSGi compatibility with correct ClassLoader usage. >>>>>> - Updated PluginVisitor(Builder|s) accordingly to use new algorithm. >>>>>> >>>>>> Added: >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java >>>>>> (with props) >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java >>>>>> - copied, changed from r1597667, >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java >>>>>> Removed: >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java >>>>>> Modified: >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java >>>>>> >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/package-info.java >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginAttribute.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -32,6 +32,7 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target({ElementType.PARAMETER, ElementType.FIELD}) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginAttributeVisitor") >>>>>> public @interface PluginAttribute { >>>>>> >>>>>> // TODO: could we allow a blank value and infer the attribute >>>>>> name through reflection? >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginConfiguration.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -29,5 +29,6 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target({ElementType.PARAMETER, ElementType.FIELD}) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginConfigurationVisitor") >>>>>> public @interface PluginConfiguration { >>>>>> } >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginElement.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -28,6 +28,7 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target({ElementType.PARAMETER, ElementType.FIELD}) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginElementVisitor") >>>>>> public @interface PluginElement { >>>>>> >>>>>> /** >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginNode.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -28,5 +28,6 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target({ElementType.PARAMETER, ElementType.FIELD}) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginNodeVisitor") >>>>>> public @interface PluginNode { >>>>>> } >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginValue.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -31,6 +31,7 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target(ElementType.PARAMETER) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.PluginValueVisitor") >>>>>> public @interface PluginValue { >>>>>> >>>>>> String value(); >>>>>> >>>>>> Added: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java?rev=1597790&view=auto >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java >>>>>> (added) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -0,0 +1,40 @@ >>>>>> +/* >>>>>> + * 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. >>>>>> + */ >>>>>> + >>>>>> +package org.apache.logging.log4j.core.config.plugins; >>>>>> + >>>>>> +import java.lang.annotation.Documented; >>>>>> +import java.lang.annotation.ElementType; >>>>>> +import java.lang.annotation.Retention; >>>>>> +import java.lang.annotation.RetentionPolicy; >>>>>> +import java.lang.annotation.Target; >>>>>> + >>>>>> +/** >>>>>> + * Meta-annotation to denote the class name to use that implements >>>>>> + * {@link >>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} for >>>>>> the annotated annotation. >>>>>> + */ >>>>>> +@Documented >>>>>> +@Retention(RetentionPolicy.RUNTIME) >>>>>> +@Target(ElementType.ANNOTATION_TYPE) >>>>>> +public @interface PluginVisitorStrategy { >>>>>> + >>>>>> + /** >>>>>> + * The class name to use that implements {@link >>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor} >>>>>> + * for the given annotation. >>>>>> + */ >>>>>> + String value(); >>>>>> +} >>>>>> >>>>>> Propchange: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/PluginVisitorStrategy.java >>>>>> >>>>>> ------------------------------------------------------------------------------ >>>>>> svn:eol-style = native >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/SensitivePluginAttribute.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -34,6 +34,7 @@ import java.lang.annotation.Target; >>>>>> @Documented >>>>>> @Retention(RetentionPolicy.RUNTIME) >>>>>> @Target(ElementType.PARAMETER) >>>>>> >>>>>> +@PluginVisitorStrategy("org.apache.logging.log4j.core.config.plugins.visitors.SensitivePluginAttributeVisitor") >>>>>> public @interface SensitivePluginAttribute { >>>>>> String value(); >>>>>> >>>>>> >>>>>> Modified: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java?rev=1597790&r1=1597789&r2=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -34,7 +34,7 @@ import org.apache.logging.log4j.core.con >>>>>> import >>>>>> org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory; >>>>>> import org.apache.logging.log4j.core.config.plugins.PluginFactory; >>>>>> import >>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor; >>>>>> -import >>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitorRegistry; >>>>>> +import >>>>>> org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitors; >>>>>> import org.apache.logging.log4j.core.util.Assert; >>>>>> import org.apache.logging.log4j.core.util.Builder; >>>>>> import org.apache.logging.log4j.status.StatusLogger; >>>>>> @@ -164,7 +164,7 @@ public class PluginBuilder<T> implements >>>>>> continue; // already processed >>>>>> } >>>>>> final PluginVisitor<? extends Annotation> visitor = >>>>>> - >>>>>> PluginVisitorRegistry.findVisitor(a.annotationType()); >>>>>> + PluginVisitors.findVisitor(a.annotationType()); >>>>>> if (visitor != null) { >>>>>> final Object value = visitor.setAliases(aliases) >>>>>> .setAnnotation(a) >>>>>> @@ -200,7 +200,7 @@ public class PluginBuilder<T> implements >>>>>> if (a instanceof PluginAliases) { >>>>>> continue; // already processed >>>>>> } >>>>>> - final PluginVisitor<? extends Annotation> visitor = >>>>>> PluginVisitorRegistry.findVisitor( >>>>>> + final PluginVisitor<? extends Annotation> visitor = >>>>>> PluginVisitors.findVisitor( >>>>>> a.annotationType()); >>>>>> if (visitor != null) { >>>>>> args[i] = visitor.setAliases(aliases) >>>>>> >>>>>> Copied: >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java >>>>>> (from r1597667, >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java) >>>>>> URL: >>>>>> http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java?p2=logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java&p1=logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java&r1=1597667&r2=1597790&rev=1597790&view=diff >>>>>> >>>>>> ============================================================================== >>>>>> --- >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitorRegistry.java >>>>>> (original) >>>>>> +++ >>>>>> logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/visitors/PluginVisitors.java >>>>>> Tue May 27 13:57:31 2014 >>>>>> @@ -18,58 +18,24 @@ >>>>>> package org.apache.logging.log4j.core.config.plugins.visitors; >>>>>> >>>>>> import java.lang.annotation.Annotation; >>>>>> -import java.util.Map; >>>>>> -import java.util.concurrent.ConcurrentHashMap; >>>>>> >>>>>> import org.apache.logging.log4j.Logger; >>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; >>>>>> -import >>>>>> org.apache.logging.log4j.core.config.plugins.PluginConfiguration; >>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginElement; >>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginNode; >>>>>> -import org.apache.logging.log4j.core.config.plugins.PluginValue; >>>>>> -import >>>>>> org.apache.logging.log4j.core.config.plugins.SensitivePluginAttribute; >>>>>> +import >>>>>> org.apache.logging.log4j.core.config.plugins.PluginVisitorStrategy; >>>>>> import org.apache.logging.log4j.status.StatusLogger; >>>>>> >>>>>> /** >>>>>> - * Registry for associating Plugin annotations with PluginVisitor >>>>>> implementations. >>>>>> + * Utility class to locate an appropriate PluginVisitor >>>>>> implementation for an annotation. >>>>>> */ >>>>>> -public final class PluginVisitorRegistry { >>>>>> +public final class PluginVisitors { >>>>>> >>>>>> private static final Logger LOGGER = StatusLogger.getLogger(); >>>>>> >>>>>> - // map of annotation classes to their corresponding >>>>>> PluginVisitor classes >>>>>> - // generics are fun! >>>>>> - private static final Map<Class<? extends Annotation>, Class<? >>>>>> extends PluginVisitor<? extends Annotation>>> REGISTRY; >>>>>> - >>>>>> - static { >>>>>> - // register the default PluginVisitor classes >>>>>> - // TODO: this could probably be combined with the usual >>>>>> plugin architecture instead >>>>>> - REGISTRY = new ConcurrentHashMap<Class<? extends >>>>>> Annotation>, Class<? extends PluginVisitor<? extends Annotation>>>(); >>>>>> - registerVisitor(PluginAttribute.class, >>>>>> PluginAttributeVisitor.class); >>>>>> - registerVisitor(SensitivePluginAttribute.class, >>>>>> SensitivePluginAttributeVisitor.class); >>>>>> - registerVisitor(PluginConfiguration.class, >>>>>> PluginConfigurationVisitor.class); >>>>>> - registerVisitor(PluginNode.class, PluginNodeVisitor.class); >>>>>> - � >>>>> >>>>> >>> >>> >>> -- >>> Matt Sicker <boa...@gmail.com> >>> >> >> >> >> -- >> E-Mail: garydgreg...@gmail.com | ggreg...@apache.org >> Java Persistence with Hibernate, Second >> Edition<http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> > > > > -- > Matt Sicker <boa...@gmail.com> > > -- Matt Sicker <boa...@gmail.com>