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;
+        }
+    }
 }