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();