You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2014/10/01 00:27:57 UTC

[6/6] git commit: Remove generic parameter from PluginBuilder.

Remove generic parameter from PluginBuilder.

  - Turns out that this type is not always consistent thanks to plugin maps and plugin collections.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/9ff72ee9
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/9ff72ee9
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/9ff72ee9

Branch: refs/heads/master
Commit: 9ff72ee975de31436e53d01af868cf53ce93244f
Parents: 787c9ec
Author: Matt Sicker <ma...@apache.org>
Authored: Tue Sep 30 17:27:34 2014 -0500
Committer: Matt Sicker <ma...@apache.org>
Committed: Tue Sep 30 17:27:34 2014 -0500

----------------------------------------------------------------------
 .../core/config/AbstractConfiguration.java      | 37 +++++++++-----------
 .../core/config/plugins/util/PluginBuilder.java | 37 ++++++++++----------
 .../validators/RequiredValidatorTest.java       |  4 +--
 3 files changed, 36 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ff72ee9/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index c0c5201..c63290e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -24,6 +24,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -305,11 +306,10 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
         if (advertiserNode != null)
         {
             final String name = advertiserNode.getName();
-            @SuppressWarnings("unchecked")
-            final PluginType<Advertiser> type = (PluginType<Advertiser>) pluginManager.getPluginType(name);
+            final PluginType<?> type = pluginManager.getPluginType(name);
             if (type != null)
             {
-                final Class<Advertiser> clazz = type.getPluginClass();
+                final Class<? extends Advertiser> clazz = type.getPluginClass().asSubclass(Advertiser.class);
                 try {
                     advertiser = clazz.newInstance();
                     advertisement = advertiser.advertise(advertiserNode.getAttributes());
@@ -740,19 +740,17 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
     * @param type the type of plugin to create.
     * @param node the corresponding configuration node for this plugin to create.
     * @param event the LogEvent that spurred the creation of this plugin
-    * @param <T> the plugin object type.
     * @return the created plugin object or {@code null} if there was an error setting it up.
     * @see org.apache.logging.log4j.core.config.plugins.util.PluginBuilder
     * @see org.apache.logging.log4j.core.config.plugins.visitors.PluginVisitor
     * @see org.apache.logging.log4j.core.config.plugins.convert.TypeConverter
     */
-   @SuppressWarnings("unchecked")
-   private <T> Object createPluginObject(final PluginType<T> type, final Node node, final LogEvent event) {
-        final Class<T> clazz = type.getPluginClass();
+    private Object createPluginObject(final PluginType<?> type, final Node node, final LogEvent event) {
+        final Class<?> clazz = type.getPluginClass();
 
         if (Map.class.isAssignableFrom(clazz)) {
             try {
-                return createPluginMap(node, clazz.asSubclass(Map.class));
+                return createPluginMap(node);
             } catch (final Exception e) {
                 LOGGER.warn("Unable to create Map for {} of class {}", type.getElementName(), clazz, e);
             }
@@ -760,36 +758,33 @@ public abstract class AbstractConfiguration extends AbstractFilterable implement
 
         if (Collection.class.isAssignableFrom(clazz)) {
             try {
-                return createPluginCollection(node, clazz.asSubclass(Collection.class));
+                return createPluginCollection(node);
             } catch (final Exception e) {
                 LOGGER.warn("Unable to create List for {} of class {}", type.getElementName(), clazz, e);
             }
         }
 
-        return new PluginBuilder<T>(type)
+        return new PluginBuilder(type)
                 .withConfiguration(this)
                 .withConfigurationNode(node)
                 .forLogEvent(event)
                 .build();
     }
 
-    private static <T extends Map<String, E>, E> Object createPluginMap(final Node node, final Class<T> clazz)
-        throws InstantiationException, IllegalAccessException {
-        final Map<String, E> map = clazz.newInstance();
+    private static Map<String, ?> createPluginMap(final Node node) {
+        final Map<String, Object> map = new LinkedHashMap<String, Object>();
         for (final Node child : node.getChildren()) {
-            @SuppressWarnings("unchecked")
-            final E object = (E) child.getObject();
+            final Object object = child.getObject();
             map.put(child.getName(), object);
         }
         return map;
     }
 
-    private static <T extends Collection<E>, E> Object createPluginCollection(final Node node, final Class<T> clazz)
-        throws InstantiationException, IllegalAccessException {
-        final Collection<E> list = clazz.newInstance();
-        for (final Node child : node.getChildren()) {
-            @SuppressWarnings("unchecked")
-            final E object = (E) child.getObject();
+    private static Collection<?> createPluginCollection(final Node node) {
+        final List<Node> children = node.getChildren();
+        final Collection<Object> list = new ArrayList<Object>(children.size());
+        for (final Node child : children) {
+            final Object object = child.getObject();
             list.add(object);
         }
         return list;

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ff72ee9/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
index c87a7c8..43b34fe 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/PluginBuilder.java
@@ -42,20 +42,19 @@ 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.core.util.ReflectionUtil;
+import org.apache.logging.log4j.core.util.TypeUtil;
 import org.apache.logging.log4j.status.StatusLogger;
 
 /**
  * Builder class to instantiate and configure a Plugin object using a PluginFactory method or PluginBuilderFactory
  * builder class.
- *
- * @param <T> type of Plugin class.
  */
-public class PluginBuilder<T> implements Builder<T> {
+public class PluginBuilder implements Builder<Object> {
 
     private static final Logger LOGGER = StatusLogger.getLogger();
 
-    private final PluginType<T> pluginType;
-    private final Class<T> clazz;
+    private final PluginType<?> pluginType;
+    private final Class<?> clazz;
 
     private Configuration configuration;
     private Node node;
@@ -66,7 +65,7 @@ public class PluginBuilder<T> implements Builder<T> {
      *
      * @param pluginType type of plugin to configure
      */
-    public PluginBuilder(final PluginType<T> pluginType) {
+    public PluginBuilder(final PluginType<?> pluginType) {
         this.pluginType = pluginType;
         this.clazz = pluginType.getPluginClass();
     }
@@ -77,7 +76,7 @@ public class PluginBuilder<T> implements Builder<T> {
      * @param configuration the configuration to use.
      * @return {@code this}
      */
-    public PluginBuilder<T> withConfiguration(final Configuration configuration) {
+    public PluginBuilder withConfiguration(final Configuration configuration) {
         this.configuration = configuration;
         return this;
     }
@@ -88,7 +87,7 @@ public class PluginBuilder<T> implements Builder<T> {
      * @param node the plugin configuration node to use.
      * @return {@code this}
      */
-    public PluginBuilder<T> withConfigurationNode(final Node node) {
+    public PluginBuilder withConfigurationNode(final Node node) {
         this.node = node;
         return this;
     }
@@ -99,7 +98,7 @@ public class PluginBuilder<T> implements Builder<T> {
      * @param event the event to use for extra information.
      * @return {@code this}
      */
-    public PluginBuilder<T> forLogEvent(final LogEvent event) {
+    public PluginBuilder forLogEvent(final LogEvent event) {
         this.event = event;
         return this;
     }
@@ -110,16 +109,16 @@ public class PluginBuilder<T> implements Builder<T> {
      * @return the plugin object or {@code null} if there was a problem creating it.
      */
     @Override
-    public T build() {
+    public Object build() {
         verify();
         // first try to use a builder class if one is available
         try {
             LOGGER.debug("Building Plugin[name={}, class={}]. Searching for builder factory method...", pluginType.getElementName(),
                     pluginType.getPluginClass().getName());
-            final Builder<T> builder = createBuilder(this.clazz);
+            final Builder<?> builder = createBuilder(this.clazz);
             if (builder != null) {
                 injectFields(builder);
-                final T result = builder.build();
+                final Object result = builder.build();
                 LOGGER.debug("Built Plugin[name={}] OK from builder factory method.", pluginType.getElementName());
                 return result;
             }
@@ -133,8 +132,7 @@ public class PluginBuilder<T> implements Builder<T> {
                     pluginType.getElementName(), pluginType.getPluginClass().getName());
             final Method factory = findFactoryMethod(this.clazz);
             final Object[] params = generateParameters(factory);
-            @SuppressWarnings("unchecked")
-            final T plugin = (T) factory.invoke(null, params);
+            final Object plugin = factory.invoke(null, params);
             LOGGER.debug("Built Plugin[name={}] OK from factory method.", pluginType.getElementName());
             return plugin;
         } catch (final Exception e) {
@@ -149,14 +147,15 @@ public class PluginBuilder<T> implements Builder<T> {
         Assert.requireNonNull(this.node, "No Node object was set.");
     }
 
-    private static <T> Builder<T> createBuilder(final Class<T> clazz)
+    private static Builder<?> createBuilder(final Class<?> clazz)
         throws InvocationTargetException, IllegalAccessException {
         for (final Method method : clazz.getDeclaredMethods()) {
             if (method.isAnnotationPresent(PluginBuilderFactory.class) &&
-                Modifier.isStatic(method.getModifiers())) {
+                Modifier.isStatic(method.getModifiers()) &&
+                TypeUtil.isAssignable(Builder.class, method.getGenericReturnType())) {
                 ReflectionUtil.makeAccessible(method);
                 @SuppressWarnings("unchecked")
-                final Builder<T> builder = (Builder<T>) method.invoke(null);
+                final Builder<?> builder = (Builder<?>) method.invoke(null);
                 LOGGER.debug("Found builder factory method [{}]: {}.", method.getName(), method);
                 return builder;
             }
@@ -166,7 +165,7 @@ public class PluginBuilder<T> implements Builder<T> {
         return null;
     }
 
-    private void injectFields(final Builder<T> builder) throws IllegalAccessException {
+    private void injectFields(final Builder<?> builder) throws IllegalAccessException {
         final Field[] fields = builder.getClass().getDeclaredFields();
         AccessibleObject.setAccessible(fields, true);
         final StringBuilder log = new StringBuilder();
@@ -215,7 +214,7 @@ public class PluginBuilder<T> implements Builder<T> {
         verifyNodeChildrenUsed();
     }
 
-    private static <T> Method findFactoryMethod(final Class<T> clazz) {
+    private static Method findFactoryMethod(final Class<?> clazz) {
         for (final Method method : clazz.getDeclaredMethods()) {
             if (method.isAnnotationPresent(PluginFactory.class) &&
                 Modifier.isStatic(method.getModifiers())) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/9ff72ee9/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
index a135d0a..fbb7660 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/config/plugins/validation/validators/RequiredValidatorTest.java
@@ -43,7 +43,7 @@ public class RequiredValidatorTest {
 
     @Test
     public void testNullDefaultValue() throws Exception {
-        final ValidatingPlugin validatingPlugin = new PluginBuilder<ValidatingPlugin>(plugin)
+        final ValidatingPlugin validatingPlugin = (ValidatingPlugin) new PluginBuilder(plugin)
             .withConfiguration(new NullConfiguration())
             .withConfigurationNode(node)
             .build();
@@ -53,7 +53,7 @@ public class RequiredValidatorTest {
     @Test
     public void testNonNullValue() throws Exception {
         node.getAttributes().put("name", "foo");
-        final ValidatingPlugin validatingPlugin = new PluginBuilder<ValidatingPlugin>(plugin)
+        final ValidatingPlugin validatingPlugin = (ValidatingPlugin) new PluginBuilder(plugin)
             .withConfiguration(new NullConfiguration())
             .withConfigurationNode(node)
             .build();