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 2020/03/08 22:57:21 UTC
[logging-log4j2] 04/04: Remove BeanInstance class
This is an automated email from the ASF dual-hosted git repository.
mattsicker pushed a commit to branch mean-bean-machine
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 3aeec758eada8d6471bb1d48d72f56da2c9c3c02
Author: Matt Sicker <bo...@gmail.com>
AuthorDate: Sun Mar 8 17:56:12 2020 -0500
Remove BeanInstance class
Signed-off-by: Matt Sicker <bo...@gmail.com>
---
.../plugins/defaults/bean/DefaultBeanInstance.java | 50 -------------------
.../bean/DefaultInitializationContext.java | 35 ++++++++++---
.../plugins/defaults/bean/DefaultScopeContext.java | 26 +++++-----
.../plugins/defaults/bean/LazyBeanInstance.java | 57 ----------------------
.../logging/log4j/plugins/util/LazyValue.java | 28 ++++++++---
.../apache/logging/log4j/plugins/util/Value.java | 5 +-
.../logging/log4j/plugins/util/WeakLazyValue.java | 8 +++
7 files changed, 77 insertions(+), 132 deletions(-)
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanInstance.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanInstance.java
deleted file mode 100644
index 2f5a5d3..0000000
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultBeanInstance.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.plugins.defaults.bean;
-
-import org.apache.logging.log4j.plugins.spi.bean.Bean;
-import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
-
-import java.util.Objects;
-
-class DefaultBeanInstance<T> implements BeanInstance<T> {
- private final Bean<T> bean;
- private final T instance;
- private final InitializationContext<T> context;
-
- DefaultBeanInstance(final Bean<T> bean, final T instance, final InitializationContext<T> context) {
- this.bean = Objects.requireNonNull(bean);
- this.instance = Objects.requireNonNull(instance);
- this.context = Objects.requireNonNull(context);
- }
-
- @Override
- public Bean<T> getBean() {
- return bean;
- }
-
- @Override
- public T getInstance() {
- return instance;
- }
-
- @Override
- public void close() {
- bean.destroy(instance, context);
- }
-}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
index 9e00a66..962c61c 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultInitializationContext.java
@@ -20,6 +20,7 @@ package org.apache.logging.log4j.plugins.defaults.bean;
import org.apache.logging.log4j.plugins.spi.bean.Bean;
import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.plugins.util.Value;
import java.util.List;
import java.util.Map;
@@ -31,8 +32,8 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
private final Bean<T> bean;
private Map<Bean<?>, Object> incompleteInstances;
- private final List<BeanInstance<?>> dependentInstances = new CopyOnWriteArrayList<>();
- private final List<BeanInstance<?>> parentDependentInstances;
+ private final List<DependentInstance<?>> dependentInstances = new CopyOnWriteArrayList<>();
+ private final List<DependentInstance<?>> parentDependentInstances;
private final InitializationContext<?> parentContext;
public DefaultInitializationContext(final Bean<T> bean) {
@@ -44,7 +45,7 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
}
private DefaultInitializationContext(final Bean<T> bean, final Map<Bean<?>, Object> incompleteInstances,
- final List<BeanInstance<?>> parentDependentInstances,
+ final List<DependentInstance<?>> parentDependentInstances,
final InitializationContext<?> parentContext) {
this.bean = bean;
@@ -71,7 +72,7 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
@Override
public void addDependentInstance(final T dependentInstance) {
- parentDependentInstances.add(new DefaultBeanInstance<>(bean, dependentInstance, this));
+ parentDependentInstances.add(new DependentInstance<>(bean, this, dependentInstance));
}
@Override
@@ -101,11 +102,33 @@ public class DefaultInitializationContext<T> implements InitializationContext<T>
@Override
public void close() {
- for (final BeanInstance<?> dependentInstance : dependentInstances) {
- if (dependentInstance.getBean().equals(bean)) {
+ for (final DependentInstance<?> dependentInstance : dependentInstances) {
+ if (dependentInstance.bean.equals(bean)) {
dependentInstance.close();
}
}
}
+ private static class DependentInstance<T> implements Value<T> {
+ private final Bean<T> bean;
+ private final InitializationContext<T> context;
+ private final T instance;
+
+ private DependentInstance(final Bean<T> bean, final InitializationContext<T> context, final T instance) {
+ this.bean = bean;
+ this.context = context;
+ this.instance = instance;
+ }
+
+ @Override
+ public T get() {
+ return instance;
+ }
+
+ @Override
+ public void close() {
+ bean.destroy(instance, context);
+ }
+ }
+
}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultScopeContext.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultScopeContext.java
index e0a5965..42e46b0 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultScopeContext.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/DefaultScopeContext.java
@@ -20,7 +20,9 @@ package org.apache.logging.log4j.plugins.defaults.bean;
import org.apache.logging.log4j.plugins.spi.bean.Bean;
import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
import org.apache.logging.log4j.plugins.spi.bean.ScopeContext;
+import org.apache.logging.log4j.plugins.util.LazyValue;
import org.apache.logging.log4j.plugins.util.TypeUtil;
+import org.apache.logging.log4j.plugins.util.Value;
import java.lang.annotation.Annotation;
import java.util.Map;
@@ -29,7 +31,7 @@ import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
public class DefaultScopeContext implements ScopeContext {
- private final Map<Bean<?>, BeanInstance<?>> cache = new ConcurrentHashMap<>();
+ private final Map<Bean<?>, Value<?>> beanValues = new ConcurrentHashMap<>();
private final Class<? extends Annotation> scopeType;
public DefaultScopeContext(final Class<? extends Annotation> scopeType) {
@@ -43,28 +45,28 @@ public class DefaultScopeContext implements ScopeContext {
@Override
public <T> T getOrCreate(final Bean<T> bean, final InitializationContext<T> context) {
- final BeanInstance<T> beanInstance =
- TypeUtil.cast(cache.computeIfAbsent(bean, ignored -> new LazyBeanInstance<>(bean, context)));
- return beanInstance.getInstance();
+ final Value<T> value = TypeUtil.cast(beanValues.computeIfAbsent(bean,
+ ignored -> LazyValue.forScope(() -> bean.create(context), instance -> bean.destroy(instance, context))));
+ return value.get();
}
@Override
public <T> Optional<T> getIfExists(final Bean<T> bean) {
- final BeanInstance<T> beanInstance = TypeUtil.cast(cache.get(bean));
- return beanInstance == null ? Optional.empty() : Optional.of(beanInstance.getInstance());
+ return Optional.ofNullable(beanValues.get(bean))
+ .map(Value::get)
+ .map(TypeUtil::cast);
}
@Override
public void destroy(final Bean<?> bean) {
- final BeanInstance<?> beanInstance = cache.get(bean);
- if (beanInstance != null) {
- beanInstance.close();
- cache.remove(bean, beanInstance);
- }
+ beanValues.computeIfPresent(bean, (ignored, value) -> {
+ value.close();
+ return null;
+ });
}
@Override
public void close() {
- cache.keySet().forEach(this::destroy);
+ beanValues.keySet().forEach(this::destroy);
}
}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/LazyBeanInstance.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/LazyBeanInstance.java
deleted file mode 100644
index 970fef9..0000000
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/defaults/bean/LazyBeanInstance.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.plugins.defaults.bean;
-
-import org.apache.logging.log4j.plugins.spi.bean.Bean;
-import org.apache.logging.log4j.plugins.spi.bean.InitializationContext;
-
-import java.util.Objects;
-
-class LazyBeanInstance<T> implements BeanInstance<T> {
- private final Bean<T> bean;
- private final InitializationContext<T> context;
- private volatile T instance;
-
- LazyBeanInstance(final Bean<T> bean, final InitializationContext<T> context) {
- this.bean = Objects.requireNonNull(bean);
- this.context = Objects.requireNonNull(context);
- }
-
- @Override
- public Bean<T> getBean() {
- return bean;
- }
-
- @Override
- public T getInstance() {
- if (instance == null) {
- synchronized (this) {
- if (instance == null) {
- instance = bean.create(context);
- }
- }
- }
- return instance;
- }
-
- @Override
- public void close() {
- bean.destroy(instance, context);
- instance = null;
- }
-}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/LazyValue.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/LazyValue.java
index 385997f..abaa550 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/LazyValue.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/LazyValue.java
@@ -17,19 +17,27 @@
package org.apache.logging.log4j.plugins.util;
+import java.util.function.Consumer;
import java.util.function.Supplier;
public class LazyValue<T> implements Value<T> {
- public static <T> LazyValue<T> forSupplier(final Supplier<T> valueSupplier) {
- return new LazyValue<>(valueSupplier);
+ public static <T> LazyValue<T> forSupplier(final Supplier<T> constructor) {
+ return new LazyValue<>(constructor, value -> {
+ });
}
- private final Supplier<T> valueSupplier;
+ public static <T> LazyValue<T> forScope(final Supplier<T> constructor, final Consumer<T> destructor) {
+ return new LazyValue<>(constructor, destructor);
+ }
+
+ private final Supplier<T> constructor;
+ private final Consumer<T> destructor;
private volatile T value;
- private LazyValue(final Supplier<T> valueSupplier) {
- this.valueSupplier = valueSupplier;
+ private LazyValue(final Supplier<T> constructor, final Consumer<T> destructor) {
+ this.constructor = constructor;
+ this.destructor = destructor;
}
@Override
@@ -39,10 +47,18 @@ public class LazyValue<T> implements Value<T> {
synchronized (this) {
value = this.value;
if (value == null) {
- this.value = value = valueSupplier.get();
+ this.value = value = constructor.get();
}
}
}
return value;
}
+
+ @Override
+ public void close() {
+ if (value != null) {
+ destructor.accept(value);
+ value = null;
+ }
+ }
}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Value.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Value.java
index b59b66d..5b01df6 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Value.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/Value.java
@@ -17,6 +17,9 @@
package org.apache.logging.log4j.plugins.util;
-public interface Value<T> {
+public interface Value<T> extends AutoCloseable {
T get();
+
+ @Override
+ void close();
}
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/WeakLazyValue.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/WeakLazyValue.java
index b90a3a7..8886ba1 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/WeakLazyValue.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/WeakLazyValue.java
@@ -47,4 +47,12 @@ public class WeakLazyValue<T> implements Value<T> {
}
return value;
}
+
+ @Override
+ public void close() {
+ if (reference != null) {
+ reference.clear();
+ reference = null;
+ }
+ }
}