You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by st...@apache.org on 2012/01/22 14:52:45 UTC

git commit: DELTASPIKE-24 rework Deactivation logic

Updated Branches:
  refs/heads/master f5d1995b3 -> e3f7e3e4e


DELTASPIKE-24 rework Deactivation logic

This introduces 3 new features
a.) allow deactivation and also re-activation based on ordinals
b.) make it a 1-liner to use for external Extensions
c.) Deativatable is now a pure Marker Interface


Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/e3f7e3e4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/e3f7e3e4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/e3f7e3e4

Branch: refs/heads/master
Commit: e3f7e3e4e254401265ac5cc87fcaff5f232392f8
Parents: f5d1995
Author: Mark Struberg <st...@apache.org>
Authored: Sun Jan 22 14:21:52 2012 +0100
Committer: Mark Struberg <st...@apache.org>
Committed: Sun Jan 22 14:21:52 2012 +0100

----------------------------------------------------------------------
 .../api/activation/AbstractClassDeactivator.java   |   61 -------
 .../core/api/activation/ClassDeactivation.java     |  122 +++++++++++++++
 .../core/api/activation/ClassDeactivator.java      |   16 +-
 .../core/api/activation/Deactivatable.java         |   20 +--
 .../deltaspike/core/api/config/ConfigResolver.java |   10 +-
 .../core/impl/exclude/ExcludeExtension.java        |   14 +-
 .../core/impl/util/ClassDeactivation.java          |  113 -------------
 .../core/impl/util/ClassDeactivatorStorage.java    |   66 --------
 .../core/impl/util/DefaultClassDeactivator.java    |   51 ------
 .../test/core/impl/activation/ActivatedClass.java  |    5 +-
 .../core/impl/activation/DeactivatedClass.java     |    4 +-
 .../impl/activation/TestClassDeactivation.java     |    6 +-
 .../core/impl/activation/TestClassDeactivator.java |   19 ++-
 .../core/api/exclude/ExcludeIntegrationTest.java   |    3 +-
 .../META-INF/apache-deltaspike.properties          |    1 -
 15 files changed, 178 insertions(+), 333 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
deleted file mode 100644
index f3755ad..0000000
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
+++ /dev/null
@@ -1,61 +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.deltaspike.core.api.activation;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Base implementation which allows an easier class-deactivator implementation
- */
-public abstract class AbstractClassDeactivator implements ClassDeactivator
-{
-    // HashSet due to Serializable warning in checkstyle rules
-    private HashSet<Class> deactivatedClasses = null;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public final synchronized Set<Class> getDeactivatedClasses()
-    {
-        if (this.deactivatedClasses == null)
-        {
-            this.deactivatedClasses = new HashSet<Class>();
-            deactivateClasses();
-        }
-        return this.deactivatedClasses;
-    }
-
-    /**
-     * Can be used by sub-classes to add deactivated classes easily.
-     *
-     * @param deactivatedClass class to deactivate
-     */
-    protected final void addDeactivatedClass(Class deactivatedClass)
-    {
-        this.deactivatedClasses.add(deactivatedClass);
-    }
-
-    /**
-     * An implementation has to add classes which shouldn't be used by DeltaSpike.
-     * (use {@link #addDeactivatedClass(Class)} for adding classes)
-     */
-    protected abstract void deactivateClasses();
-}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
new file mode 100644
index 0000000..6a31ad9
--- /dev/null
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
@@ -0,0 +1,122 @@
+/*
+ * 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.deltaspike.core.api.activation;
+
+import org.apache.deltaspike.core.api.config.ConfigResolver;
+import org.apache.deltaspike.core.api.util.ClassUtils;
+
+import javax.enterprise.inject.Typed;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.logging.Logger;
+
+/**
+ * Helper methods for {@link ClassDeactivator}
+ */
+@Typed()
+public final class ClassDeactivation
+{
+    private static final Logger LOG = Logger.getLogger(ClassDeactivation.class.getName());
+
+    /**
+     * This Map holds the ClassLoader as first level to make it possible to have different configurations per 
+     * WebApplication in an EAR or other Multi-ClassLoader scenario.
+     * 
+     * The Map then contains a List of {@link ClassDeactivator}s in order of their configured ordinal.
+     */
+    private static Map<ClassLoader, List<ClassDeactivator>> classDeactivatorMap
+        = new ConcurrentHashMap<ClassLoader, List<ClassDeactivator>>();
+
+    private ClassDeactivation()
+    {
+        // private ct to prevent utility class from instantiation.
+    }
+
+    /**
+     * Evaluates if the given {@link Deactivatable} is active.
+     *
+     * @param deactivatableClazz {@link Deactivatable} under test.
+     * @return <code>true</code> if it is active, <code>false</code> otherwise
+     */
+    public static synchronized boolean isActivated(Class<? extends Deactivatable> deactivatableClazz)
+    {
+        List<ClassDeactivator> classDeactivators = getClassDeactivators();
+
+        Boolean isActivated = Boolean.TRUE; // by default a class is always activated.
+
+        for (ClassDeactivator classDeactivator : classDeactivators)
+        {
+            Boolean isLocallyActivated = classDeactivator.isActivated(deactivatableClazz);
+            if (isLocallyActivated != null)
+            {
+                isActivated = isLocallyActivated;
+            }
+        }
+        
+        if (!isActivated) 
+        {
+            LOG.info("Deactivating class " + deactivatableClazz);
+        }
+
+        return isActivated;
+    }
+
+
+    /**
+     * @return the List of configured @{link ClassDeactivator}s for the current context ClassLoader.
+     */
+    private static List<ClassDeactivator> getClassDeactivators()
+    {
+        List<ClassDeactivator> classDeactivators = classDeactivatorMap.get(ClassUtils.getClassLoader(null));
+        if (classDeactivators == null)
+        {
+            classDeactivators = getConfiguredClassDeactivator();
+        }
+
+        return classDeactivators;
+    }
+
+    private static List<ClassDeactivator> getConfiguredClassDeactivator()
+    {
+        List<String> classDeactivatorClassNames = ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
+
+        List<ClassDeactivator> classDeactivators = new ArrayList<ClassDeactivator>();
+
+        for (String classDeactivatorClassName : classDeactivatorClassNames)
+        {
+            LOG.fine("processing ClassDeactivator: " + classDeactivatorClassName);
+
+            try
+            {
+                ClassDeactivator currentClassDeactivator =
+                        (ClassDeactivator) ClassUtils.instantiateClassForName(classDeactivatorClassName);
+                classDeactivators.add(currentClassDeactivator);
+            }
+            catch (Exception e)
+            {
+                LOG.warning(classDeactivatorClassName + " can't be instantiated");
+                throw new RuntimeException(e);
+            }
+        }
+
+        return classDeactivators;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
index 1506539..89e4a6f 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
@@ -19,26 +19,28 @@
 package org.apache.deltaspike.core.api.activation;
 
 import java.io.Serializable;
-import java.util.Set;
 
 /**
- * <p>A class-deactivator allows to specify deactivated classes which can't be deactivated via std. CDI mechanisms.</p>
+ * <p>A class-deactivator allows to specify deactivated classes which can't be deactivated via std. CDI mechanisms.
+ * This might be the case for CDI Extensions because CDI mechanisms are not available at startup time.</p>
  * 
  * <p>A class-deactivator will be resolved from the environment via the default resolvers or via a custom resolver which
  * allows to use any type of configuration-format. See {@link org.apache.deltaspike.core.api.config.ConfigResolver}
  * for more information about how to configure it. The configuration key is
  * <code>org.apache.deltaspike.core.api.activation.ClassDeactivator</code></p>
  * 
- * <p>Furthermore, {@link AbstractClassDeactivator} is a convenience class which
- * allows an easier implementation. All classes which implement {@link Deactivatable} in-/directly, can be deactivated
- * with this mechanism. For all other classes/beans, you can use the veto mechanism provided by CDI.</p>
+ * <p>All DlassDeactivators will get picked up in order of their ordinal and might explicitely activate or 
+ * deactivate {@link Deactivatable} classes. Returning a <code>null</code> value means that the ClassDeactivator
+ * doesn't care about the very Deactivatable class.</p>
+ * 
  */
 public interface ClassDeactivator extends Serializable
 {
     /**
      * Provides classes which should be deactivated.
      *
-     * @return classes which should be deactivated
+     * @return {@link Boolean#FALSE} if class should get activated, {@link Boolean#FALSE} if class must be available
+     *         and <code>null</code> to let it as is (defined by default or other 
      */
-    Set<Class> getDeactivatedClasses();
+    Boolean isActivated(Class<? extends Deactivatable> deactivatableClazz);
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
index 42bb6c7..a0785e3 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
@@ -19,20 +19,18 @@
 package org.apache.deltaspike.core.api.activation;
 
 /**
- * Interface to allow easier detection of deactivatable classes.
- * These classes are activated by default (e.g. via CDI config).
+ * <p>Interface to allow easier detection of deactivatable classes.</p>
+ *
+ * <p>These classes are activated by default and can be disabled on demand (e.g. via CDI config).
  * Since CDI, JSF,... currently don't allow to deactivate default implementations,
- * DeltaSpike has to introduce a proprietary mechanism.
+ * DeltaSpike has to introduce a proprietary mechanism.</p>
+ *
+ * <p>This is e.g. used to disable CDI Extensions in DeltaSpike and might get
+ * used for other Extension libraries as well.</p>
  *
- * This is e.g. used to disable CDI Extensions in DeltaSpike and might get
- * used for other Extension libraries as well.
+ * <p><b>Note:</b> It is suggested that the implementations
+ * use the {@link ClassDeactivation} for implementing the lookup</p>
  */
 public interface Deactivatable
 {
-    /**
-     * Returns if the current instance is active or not.
-     *
-     * @return true if the current instance is active, false otherwise
-     */
-    boolean isActivated();
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
index fa83da9..6c71add 100644
--- a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
+++ b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
@@ -84,9 +84,13 @@ public final class ConfigResolver
     }
 
     /**
-     * Resolve all values for the given key, from all registered ConfigSources.
-     * @param key
-     * @return List with all found property values, sorted in order of their ordinal.
+     * Resolve all values for the given key, from all registered ConfigSources ordered by their
+     * ordinal value in ascending ways. If more {@link ConfigSource}s have the same ordinal, their
+     * order is undefined.
+     *
+     * @param key under which configuration is stored
+     * @return List with all found property values, sorted in ascending order of their ordinal.
+     * @see org.apache.deltaspike.core.spi.config.ConfigSource#getOrdinal()
      */
     public static List<String> getAllPropertyValues(String key)
     {

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
index ad73a81..c86ac94 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
@@ -18,6 +18,7 @@
  */
 package org.apache.deltaspike.core.impl.exclude;
 
+import org.apache.deltaspike.core.api.activation.ClassDeactivation;
 import org.apache.deltaspike.core.api.activation.Deactivatable;
 import org.apache.deltaspike.core.api.exclude.Exclude;
 import org.apache.deltaspike.core.api.interpreter.ExpressionInterpreter;
@@ -25,7 +26,6 @@ import org.apache.deltaspike.core.api.projectstage.ProjectStage;
 import org.apache.deltaspike.core.api.util.ClassUtils;
 import org.apache.deltaspike.core.impl.interpreter.PropertyExpressionInterpreter;
 import org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer;
-import org.apache.deltaspike.core.impl.util.ClassDeactivation;
 
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.spi.AfterDeploymentValidation;
@@ -44,6 +44,8 @@ public class ExcludeExtension implements Extension, Deactivatable
 {
     private static final Logger LOG = Logger.getLogger(ExcludeExtension.class.getName());
 
+    private Boolean isActivated = null;
+
     /**
      * triggers initialization in any case
      * @param afterDeploymentValidation observed event
@@ -197,12 +199,12 @@ public class ExcludeExtension implements Extension, Deactivatable
                 processAnnotatedType.getAnnotatedType().getJavaClass());
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public boolean isActivated()
     {
-        return ClassDeactivation.isClassActivated(getClass());
+        if (isActivated == null)
+        {
+            isActivated = ClassDeactivation.isActivated(getClass());
+        }
+        return isActivated;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
deleted file mode 100644
index ef06193..0000000
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
+++ /dev/null
@@ -1,113 +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.deltaspike.core.impl.util;
-
-import org.apache.deltaspike.core.api.activation.ClassDeactivator;
-import org.apache.deltaspike.core.api.config.ConfigResolver;
-import org.apache.deltaspike.core.api.util.ClassUtils;
-
-import javax.enterprise.inject.Typed;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.logging.Logger;
-
-/**
- * Helper methods for {@link ClassDeactivator}
- */
-@Typed()
-public final class ClassDeactivation
-{
-    private static final Logger LOG = Logger.getLogger(ClassDeactivation.class.getName());
-
-    private ClassDeactivation()
-    {
-    }
-
-    /**
-     * Evaluates if the given class is active
-     *
-     * @param targetClass current class
-     * @return true if it is active, false otherwise
-     */
-    public static boolean isClassActivated(Class targetClass)
-    {
-        ClassDeactivator classDeactivator = ClassDeactivatorStorage.getClassDeactivator();
-
-        if (classDeactivator == null)
-        {
-            classDeactivator = resolveAndCacheClassDeactivator();
-        }
-
-        boolean classDeactivated = classDeactivator.getDeactivatedClasses().contains(targetClass);
-
-        return !classDeactivated;
-    }
-
-    /**
-     * Allows to provide a custom {@link ClassDeactivator}
-     *
-     * @param classDeactivator class-deactivator which should be used
-     */
-    public static void setClassDeactivator(ClassDeactivator classDeactivator)
-    {
-        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
-    }
-
-    private static ClassDeactivator resolveAndCacheClassDeactivator()
-    {
-        ClassDeactivator classDeactivator = getConfiguredClassDeactivator();
-
-        // display deactivated classes here once
-        // NOTE that isClassActivated() will be called many times for the same class
-        for (Class<?> deactivatedClass : classDeactivator.getDeactivatedClasses())
-        {
-            LOG.info("deactivate: " + deactivatedClass);
-        }
-
-        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
-        return classDeactivator;
-    }
-
-    private static ClassDeactivator getConfiguredClassDeactivator()
-    {
-        List<String> classDeactivatorClassNames = ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
-        Set<Class> deactivatedClasses = new HashSet<Class>();
-
-        ClassDeactivator currentClassDeactivator;
-        for (String classDeactivatorClassName : classDeactivatorClassNames)
-        {
-            LOG.info(classDeactivatorClassName + " gets processed");
-
-            currentClassDeactivator =
-                    ClassUtils.tryToInstantiateClassForName(classDeactivatorClassName, ClassDeactivator.class);
-
-            if (currentClassDeactivator != null)
-            {
-                deactivatedClasses.addAll(currentClassDeactivator.getDeactivatedClasses());
-            }
-            else
-            {
-                LOG.warning(classDeactivatorClassName + " can't be instantiated");
-            }
-        }
-
-        return new DefaultClassDeactivator(deactivatedClasses);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
deleted file mode 100644
index a7c2d02..0000000
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
+++ /dev/null
@@ -1,66 +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.deltaspike.core.impl.util;
-
-import org.apache.deltaspike.core.api.activation.ClassDeactivator;
-import org.apache.deltaspike.core.api.util.ClassUtils;
-
-import javax.enterprise.inject.Typed;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/**
- * Cache for {@link ClassDeactivator} implementations
- */
-@Typed()
-class ClassDeactivatorStorage
-{
-    private static Map<ClassLoader, ClassDeactivator> classDeactivatorMap
-        = new ConcurrentHashMap<ClassLoader, ClassDeactivator>();
-
-    private ClassDeactivatorStorage()
-    {
-    }
-
-    static void setClassDeactivator(ClassDeactivator classDeactivator)
-    {
-        if (classDeactivator != null)
-        {
-            classDeactivatorMap.put(getClassLoader(), classDeactivator);
-        }
-        else
-        {
-            classDeactivatorMap.remove(getClassLoader());
-        }
-    }
-
-    static ClassDeactivator getClassDeactivator()
-    {
-        if (!classDeactivatorMap.containsKey(getClassLoader()))
-        {
-            return null;
-        }
-        return classDeactivatorMap.get(getClassLoader());
-    }
-
-    private static ClassLoader getClassLoader()
-    {
-        return ClassUtils.getClassLoader(null);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
deleted file mode 100644
index b8c2831..0000000
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
+++ /dev/null
@@ -1,51 +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.deltaspike.core.impl.util;
-
-import org.apache.deltaspike.core.api.activation.ClassDeactivator;
-
-import java.util.Set;
-
-/**
- * Helper implementation which gets initialized with all configured classes which have to be deactivated
- */
-class DefaultClassDeactivator implements ClassDeactivator
-{
-    private static final long serialVersionUID = -1653478265237950470L;
-
-    private Set<Class> deactivatedClasses;
-
-    /**
-     * Required constructor which receives all configured classes which will be returned by #getDeactivatedClasses
-     * @param deactivatedClasses classes which get returned by #getDeactivatedClasses
-     */
-    public DefaultClassDeactivator(Set<Class> deactivatedClasses)
-    {
-        this.deactivatedClasses = deactivatedClasses;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<Class> getDeactivatedClasses()
-    {
-        return this.deactivatedClasses;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
index 4eb5fe7..86fcb34 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
@@ -18,9 +18,12 @@
  */
 package org.apache.deltaspike.test.core.impl.activation;
 
+import org.apache.deltaspike.core.api.activation.Deactivatable;
+
 /**
  * Class which isn't deactivated
  */
-public class ActivatedClass
+public class ActivatedClass implements Deactivatable
 {
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
index a8f1a62..8cba1c0 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
@@ -18,9 +18,11 @@
  */
 package org.apache.deltaspike.test.core.impl.activation;
 
+import org.apache.deltaspike.core.api.activation.Deactivatable;
+
 /**
  * Class which is deactivated
  */
-public class DeactivatedClass
+public class DeactivatedClass implements Deactivatable
 {
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
index f5af85d..bb4e7a1 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
@@ -18,7 +18,7 @@
  */
 package org.apache.deltaspike.test.core.impl.activation;
 
-import org.apache.deltaspike.core.impl.util.ClassDeactivation;
+import org.apache.deltaspike.core.api.activation.ClassDeactivation;
 import org.apache.deltaspike.test.core.api.provider.TestBean;
 import org.apache.deltaspike.test.core.api.temptestutil.ShrinkWrapArchiveUtil;
 import org.apache.deltaspike.test.util.FileUtils;
@@ -64,7 +64,7 @@ public class TestClassDeactivation
     @Test
     public void testActivatedClass()
     {
-        Assert.assertTrue(ClassDeactivation.isClassActivated(ActivatedClass.class));
+        Assert.assertTrue(ClassDeactivation.isActivated(ActivatedClass.class));
     }
 
     /**
@@ -73,6 +73,6 @@ public class TestClassDeactivation
     @Test
     public void testDeactivatedClass()
     {
-        Assert.assertFalse(ClassDeactivation.isClassActivated(DeactivatedClass.class));
+        Assert.assertFalse(ClassDeactivation.isActivated(DeactivatedClass.class));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
index 2d7557f..e7ec158 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
@@ -18,20 +18,23 @@
  */
 package org.apache.deltaspike.test.core.impl.activation;
 
-import org.apache.deltaspike.core.api.activation.AbstractClassDeactivator;
+
+import org.apache.deltaspike.core.api.activation.ClassDeactivator;
+import org.apache.deltaspike.core.api.activation.Deactivatable;
 
 /**
  * Test {@link org.apache.deltaspike.core.api.activation.ClassDeactivator}
- * which is needed to test {@link org.apache.deltaspike.core.impl.util.ClassDeactivation}
+ * which is needed to test {@link org.apache.deltaspike.core.api.activation.ClassDeactivation}
  */
-public class TestClassDeactivator extends AbstractClassDeactivator
+public class TestClassDeactivator implements ClassDeactivator
 {
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    protected void deactivateClasses()
+    public Boolean isActivated(Class<? extends Deactivatable> deactivatableClazz)
     {
-        addDeactivatedClass(DeactivatedClass.class);
+        if (deactivatableClazz.equals(DeactivatedClass.class))
+        {
+            return Boolean.FALSE;
+        }
+        return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
index c63a9ba..246c1a1 100644
--- a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
+++ b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
@@ -68,7 +68,8 @@ public class ExcludeIntegrationTest
                         "META-INF/beans.xml",
                         new String[]{"org.apache.deltaspike.core",
                                 "org.apache.deltaspike.integration",
-                                "org.apache.deltaspike.test.core.api.exclude"},
+                                "org.apache.deltaspike.test.core.api.exclude",
+                                "org.apache.deltaspike.test.core.impl.activation"},
                         null))
                 .addClass(IntegrationTestProjectStageProducer.class)
                 .addAsResource(FileUtils.getFileForURL(deltaSpikeConfig.toString()),

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
----------------------------------------------------------------------
diff --git a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
index 8a7e771..043eaaa 100644
--- a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
+++ b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
@@ -18,6 +18,5 @@
 deltaspike_ordinal=1001
 
 org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer=org.apache.deltaspike.integration.core.api.projectstage.IntegrationTestProjectStageProducer
-org.apache.deltaspike.core.api.activation.ClassDeactivator=org.apache.deltaspike.integration.core.impl.activation.TestClassDeactivator
 db=itDb
 


Re: git commit: DELTASPIKE-24 rework Deactivation logic

Posted by Gerhard Petracek <ge...@gmail.com>.
yes - with "ongoing discussion" i talked about your initial mail (today).
we didn't agree on it.

regards,
gerhard



2012/1/22 Mark Struberg <st...@yahoo.de>

> sorry, didn't know you are still working on that stuff. It was marked as
> done and while reviewing I spotted a few areas where I thought we can do
> this even better.
>
> LieGrue,
> strub
>
>
>
> ----- Original Message -----
> > From: Gerhard Petracek <ge...@gmail.com>
> > To: deltaspike-dev@incubator.apache.org
> > Cc:
> > Sent: Sunday, January 22, 2012 3:23 PM
> > Subject: Re: git commit: DELTASPIKE-24 rework Deactivation logic
> >
> > i know why you did it in this case - but in general: -1 for committing
> such
> > large changes in case of an ongoing discussion.
> > some hours ago i added a suggestion to [1] exactly for such cases.
> >
> > regards,
> > gerhard
> >
> > [1] http://s.apache.org/oo
> >
> >
> >
> > 2012/1/22 <st...@apache.org>
> >
> >>  Updated Branches:
> >>   refs/heads/master f5d1995b3 -> e3f7e3e4e
> >>
> >>
> >>  DELTASPIKE-24 rework Deactivation logic
> >>
> >>  This introduces 3 new features
> >>  a.) allow deactivation and also re-activation based on ordinals
> >>  b.) make it a 1-liner to use for external Extensions
> >>  c.) Deativatable is now a pure Marker Interface
> >>
> >>
> >>  Project:
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
> >>  Commit:
> >>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/e3f7e3e4
> >>  Tree:
> >>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/e3f7e3e4
> >>  Diff:
> >>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/e3f7e3e4
> >>
> >>  Branch: refs/heads/master
> >>  Commit: e3f7e3e4e254401265ac5cc87fcaff5f232392f8
> >>  Parents: f5d1995
> >>  Author: Mark Struberg <st...@apache.org>
> >>  Authored: Sun Jan 22 14:21:52 2012 +0100
> >>  Committer: Mark Struberg <st...@apache.org>
> >>  Committed: Sun Jan 22 14:21:52 2012 +0100
> >>
> >>  ----------------------------------------------------------------------
> >>   .../api/activation/AbstractClassDeactivator.java   |   61 -------
> >>   .../core/api/activation/ClassDeactivation.java     |  122
> +++++++++++++++
> >>   .../core/api/activation/ClassDeactivator.java      |   16 +-
> >>   .../core/api/activation/Deactivatable.java         |   20 +--
> >>   .../deltaspike/core/api/config/ConfigResolver.java |   10 +-
> >>   .../core/impl/exclude/ExcludeExtension.java        |   14 +-
> >>   .../core/impl/util/ClassDeactivation.java          |  113
> -------------
> >>   .../core/impl/util/ClassDeactivatorStorage.java    |   66 --------
> >>   .../core/impl/util/DefaultClassDeactivator.java    |   51 ------
> >>   .../test/core/impl/activation/ActivatedClass.java  |    5 +-
> >>   .../core/impl/activation/DeactivatedClass.java     |    4 +-
> >>   .../impl/activation/TestClassDeactivation.java     |    6 +-
> >>   .../core/impl/activation/TestClassDeactivator.java |   19 ++-
> >>   .../core/api/exclude/ExcludeIntegrationTest.java   |    3 +-
> >>   .../META-INF/apache-deltaspike.properties          |    1 -
> >>   15 files changed, 178 insertions(+), 333 deletions(-)
> >>  ----------------------------------------------------------------------
> >>
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> >>  deleted file mode 100644
> >>  index f3755ad..0000000
> >>  ---
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> >>  +++ /dev/null
> >>  @@ -1,61 +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.deltaspike.core.api.activation;
> >>  -
> >>  -import java.util.HashSet;
> >>  -import java.util.Set;
> >>  -
> >>  -/**
> >>  - * Base implementation which allows an easier class-deactivator
> >>  implementation
> >>  - */
> >>  -public abstract class AbstractClassDeactivator implements
> ClassDeactivator
> >>  -{
> >>  -    // HashSet due to Serializable warning in checkstyle rules
> >>  -    private HashSet<Class> deactivatedClasses = null;
> >>  -
> >>  -    /**
> >>  -     * {@inheritDoc}
> >>  -     */
> >>  -    @Override
> >>  -    public final synchronized Set<Class> getDeactivatedClasses()
> >>  -    {
> >>  -        if (this.deactivatedClasses == null)
> >>  -        {
> >>  -            this.deactivatedClasses = new HashSet<Class>();
> >>  -            deactivateClasses();
> >>  -        }
> >>  -        return this.deactivatedClasses;
> >>  -    }
> >>  -
> >>  -    /**
> >>  -     * Can be used by sub-classes to add deactivated classes easily.
> >>  -     *
> >>  -     * @param deactivatedClass class to deactivate
> >>  -     */
> >>  -    protected final void addDeactivatedClass(Class deactivatedClass)
> >>  -    {
> >>  -        this.deactivatedClasses.add(deactivatedClass);
> >>  -    }
> >>  -
> >>  -    /**
> >>  -     * An implementation has to add classes which shouldn't be used by
> >>  DeltaSpike.
> >>  -     * (use {@link #addDeactivatedClass(Class)} for adding classes)
> >>  -     */
> >>  -    protected abstract void deactivateClasses();
> >>  -}
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> >>  new file mode 100644
> >>  index 0000000..6a31ad9
> >>  --- /dev/null
> >>  +++
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> >>  @@ -0,0 +1,122 @@
> >>  +/*
> >>  + * 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.deltaspike.core.api.activation;
> >>  +
> >>  +import org.apache.deltaspike.core.api.config.ConfigResolver;
> >>  +import org.apache.deltaspike.core.api.util.ClassUtils;
> >>  +
> >>  +import javax.enterprise.inject.Typed;
> >>  +import java.util.ArrayList;
> >>  +import java.util.List;
> >>  +import java.util.Map;
> >>  +import java.util.concurrent.ConcurrentHashMap;
> >>  +import java.util.logging.Logger;
> >>  +
> >>  +/**
> >>  + * Helper methods for {@link ClassDeactivator}
> >>  + */
> >>  +@Typed()
> >>  +public final class ClassDeactivation
> >>  +{
> >>  +    private static final Logger LOG =
> >>  Logger.getLogger(ClassDeactivation.class.getName());
> >>  +
> >>  +    /**
> >>  +     * This Map holds the ClassLoader as first level to make it
> possible
> >>  to have different configurations per
> >>  +     * WebApplication in an EAR or other Multi-ClassLoader scenario.
> >>  +     *
> >>  +     * The Map then contains a List of {@link ClassDeactivator}s in
> order
> >>  of their configured ordinal.
> >>  +     */
> >>  +    private static Map<ClassLoader, List<ClassDeactivator>>
> >>  classDeactivatorMap
> >>  +        = new ConcurrentHashMap<ClassLoader,
> > List<ClassDeactivator>>();
> >>  +
> >>  +    private ClassDeactivation()
> >>  +    {
> >>  +        // private ct to prevent utility class from instantiation.
> >>  +    }
> >>  +
> >>  +    /**
> >>  +     * Evaluates if the given {@link Deactivatable} is active.
> >>  +     *
> >>  +     * @param deactivatableClazz {@link Deactivatable} under test.
> >>  +     * @return <code>true</code> if it is active,
> > <code>false</code>
> >>  otherwise
> >>  +     */
> >>  +    public static synchronized boolean isActivated(Class<? extends
> >>  Deactivatable> deactivatableClazz)
> >>  +    {
> >>  +        List<ClassDeactivator> classDeactivators =
> > getClassDeactivators();
> >>  +
> >>  +        Boolean isActivated = Boolean.TRUE; // by default a class is
> >>  always activated.
> >>  +
> >>  +        for (ClassDeactivator classDeactivator : classDeactivators)
> >>  +        {
> >>  +            Boolean isLocallyActivated =
> >>  classDeactivator.isActivated(deactivatableClazz);
> >>  +            if (isLocallyActivated != null)
> >>  +            {
> >>  +                isActivated = isLocallyActivated;
> >>  +            }
> >>  +        }
> >>  +
> >>  +        if (!isActivated)
> >>  +        {
> >>  +            LOG.info("Deactivating class " +
> > deactivatableClazz);
> >>  +        }
> >>  +
> >>  +        return isActivated;
> >>  +    }
> >>  +
> >>  +
> >>  +    /**
> >>  +     * @return the List of configured @{link ClassDeactivator}s for
> the
> >>  current context ClassLoader.
> >>  +     */
> >>  +    private static List<ClassDeactivator> getClassDeactivators()
> >>  +    {
> >>  +        List<ClassDeactivator> classDeactivators =
> >>  classDeactivatorMap.get(ClassUtils.getClassLoader(null));
> >>  +        if (classDeactivators == null)
> >>  +        {
> >>  +            classDeactivators = getConfiguredClassDeactivator();
> >>  +        }
> >>  +
> >>  +        return classDeactivators;
> >>  +    }
> >>  +
> >>  +    private static List<ClassDeactivator>
> > getConfiguredClassDeactivator()
> >>  +    {
> >>  +        List<String> classDeactivatorClassNames =
> >>  ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
> >>  +
> >>  +        List<ClassDeactivator> classDeactivators = new
> >>  ArrayList<ClassDeactivator>();
> >>  +
> >>  +        for (String classDeactivatorClassName :
> >>  classDeactivatorClassNames)
> >>  +        {
> >>  +            LOG.fine("processing ClassDeactivator: " +
> >>  classDeactivatorClassName);
> >>  +
> >>  +            try
> >>  +            {
> >>  +                ClassDeactivator currentClassDeactivator =
> >>  +                        (ClassDeactivator)
> >>  ClassUtils.instantiateClassForName(classDeactivatorClassName);
> >>  +                classDeactivators.add(currentClassDeactivator);
> >>  +            }
> >>  +            catch (Exception e)
> >>  +            {
> >>  +                LOG.warning(classDeactivatorClassName + " can't
> > be
> >>  instantiated");
> >>  +                throw new RuntimeException(e);
> >>  +            }
> >>  +        }
> >>  +
> >>  +        return classDeactivators;
> >>  +    }
> >>  +}
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> >>  index 1506539..89e4a6f 100644
> >>  ---
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> >>  +++
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> >>  @@ -19,26 +19,28 @@
> >>   package org.apache.deltaspike.core.api.activation;
> >>
> >>   import java.io.Serializable;
> >>  -import java.util.Set;
> >>
> >>   /**
> >>  - * <p>A class-deactivator allows to specify deactivated classes
> > which
> >>  can't be deactivated via std. CDI mechanisms.</p>
> >>  + * <p>A class-deactivator allows to specify deactivated classes
> > which
> >>  can't be deactivated via std. CDI mechanisms.
> >>  + * This might be the case for CDI Extensions because CDI mechanisms
> are
> >>  not available at startup time.</p>
> >>   *
> >>   * <p>A class-deactivator will be resolved from the environment via
> > the
> >>  default resolvers or via a custom resolver which
> >>   * allows to use any type of configuration-format. See {@link
> >>  org.apache.deltaspike.core.api.config.ConfigResolver}
> >>   * for more information about how to configure it. The configuration
> key is
> >>   *
> >>
> >
> <code>org.apache.deltaspike.core.api.activation.ClassDeactivator</code></p>
> >>   *
> >>  - * <p>Furthermore, {@link AbstractClassDeactivator} is a convenience
> >>  class which
> >>  - * allows an easier implementation. All classes which implement {@link
> >>  Deactivatable} in-/directly, can be deactivated
> >>  - * with this mechanism. For all other classes/beans, you can use the
> veto
> >>  mechanism provided by CDI.</p>
> >>  + * <p>All DlassDeactivators will get picked up in order of their
> > ordinal
> >>  and might explicitely activate or
> >>  + * deactivate {@link Deactivatable} classes. Returning a
> >>  <code>null</code> value means that the ClassDeactivator
> >>  + * doesn't care about the very Deactivatable class.</p>
> >>  + *
> >>   */
> >>   public interface ClassDeactivator extends Serializable
> >>   {
> >>      /**
> >>       * Provides classes which should be deactivated.
> >>       *
> >>  -     * @return classes which should be deactivated
> >>  +     * @return {@link Boolean#FALSE} if class should get activated,
> >>  {@link Boolean#FALSE} if class must be available
> >>  +     *         and <code>null</code> to let it as is (defined
> > by default
> >>  or other
> >>       */
> >>  -    Set<Class> getDeactivatedClasses();
> >>  +    Boolean isActivated(Class<? extends Deactivatable>
> >>  deactivatableClazz);
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> >>  index 42bb6c7..a0785e3 100644
> >>  ---
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> >>  +++
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> >>  @@ -19,20 +19,18 @@
> >>   package org.apache.deltaspike.core.api.activation;
> >>
> >>   /**
> >>  - * Interface to allow easier detection of deactivatable classes.
> >>  - * These classes are activated by default (e.g. via CDI config).
> >>  + * <p>Interface to allow easier detection of deactivatable
> > classes.</p>
> >>  + *
> >>  + * <p>These classes are activated by default and can be disabled on
> >>  demand (e.g. via CDI config).
> >>   * Since CDI, JSF,... currently don't allow to deactivate default
> >>  implementations,
> >>  - * DeltaSpike has to introduce a proprietary mechanism.
> >>  + * DeltaSpike has to introduce a proprietary mechanism.</p>
> >>  + *
> >>  + * <p>This is e.g. used to disable CDI Extensions in DeltaSpike and
> > might
> >>  get
> >>  + * used for other Extension libraries as well.</p>
> >>   *
> >>  - * This is e.g. used to disable CDI Extensions in DeltaSpike and
> might get
> >>  - * used for other Extension libraries as well.
> >>  + * <p><b>Note:</b> It is suggested that the
> > implementations
> >>  + * use the {@link ClassDeactivation} for implementing the lookup</p>
> >>   */
> >>   public interface Deactivatable
> >>   {
> >>  -    /**
> >>  -     * Returns if the current instance is active or not.
> >>  -     *
> >>  -     * @return true if the current instance is active, false otherwise
> >>  -     */
> >>  -    boolean isActivated();
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> >>  index fa83da9..6c71add 100644
> >>  ---
> >>
> >
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> >>  +++
> >>
> >
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> >>  @@ -84,9 +84,13 @@ public final class ConfigResolver
> >>      }
> >>
> >>      /**
> >>  -     * Resolve all values for the given key, from all registered
> >>  ConfigSources.
> >>  -     * @param key
> >>  -     * @return List with all found property values, sorted in order of
> >>  their ordinal.
> >>  +     * Resolve all values for the given key, from all registered
> >>  ConfigSources ordered by their
> >>  +     * ordinal value in ascending ways. If more {@link ConfigSource}s
> >>  have the same ordinal, their
> >>  +     * order is undefined.
> >>  +     *
> >>  +     * @param key under which configuration is stored
> >>  +     * @return List with all found property values, sorted in
> ascending
> >>  order of their ordinal.
> >>  +     * @see
> >>  org.apache.deltaspike.core.spi.config.ConfigSource#getOrdinal()
> >>       */
> >>      public static List<String> getAllPropertyValues(String key)
> >>      {
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> >>
> >
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> >>  index ad73a81..c86ac94 100644
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> >>  +++
> >>
> >
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> >>  @@ -18,6 +18,7 @@
> >>   */
> >>   package org.apache.deltaspike.core.impl.exclude;
> >>
> >>  +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
> >>   import org.apache.deltaspike.core.api.activation.Deactivatable;
> >>   import org.apache.deltaspike.core.api.exclude.Exclude;
> >>   import
> org.apache.deltaspike.core.api.interpreter.ExpressionInterpreter;
> >>  @@ -25,7 +26,6 @@ import
> >>  org.apache.deltaspike.core.api.projectstage.ProjectStage;
> >>   import org.apache.deltaspike.core.api.util.ClassUtils;
> >>   import
> >>
>  org.apache.deltaspike.core.impl.interpreter.PropertyExpressionInterpreter;
> >>   import
> org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer;
> >>  -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
> >>
> >>   import javax.enterprise.event.Observes;
> >>   import javax.enterprise.inject.spi.AfterDeploymentValidation;
> >>  @@ -44,6 +44,8 @@ public class ExcludeExtension implements Extension,
> >>  Deactivatable
> >>   {
> >>      private static final Logger LOG =
> >>  Logger.getLogger(ExcludeExtension.class.getName());
> >>
> >>  +    private Boolean isActivated = null;
> >>  +
> >>      /**
> >>       * triggers initialization in any case
> >>       * @param afterDeploymentValidation observed event
> >>  @@ -197,12 +199,12 @@ public class ExcludeExtension implements
> Extension,
> >>  Deactivatable
> >>
>  processAnnotatedType.getAnnotatedType().getJavaClass());
> >>      }
> >>
> >>  -    /**
> >>  -     * {@inheritDoc}
> >>  -     */
> >>  -    @Override
> >>      public boolean isActivated()
> >>      {
> >>  -        return ClassDeactivation.isClassActivated(getClass());
> >>  +        if (isActivated == null)
> >>  +        {
> >>  +            isActivated = ClassDeactivation.isActivated(getClass());
> >>  +        }
> >>  +        return isActivated;
> >>      }
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> >>
> >
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> >>  deleted file mode 100644
> >>  index ef06193..0000000
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> >>  +++ /dev/null
> >>  @@ -1,113 +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.deltaspike.core.impl.util;
> >>  -
> >>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> >>  -import org.apache.deltaspike.core.api.config.ConfigResolver;
> >>  -import org.apache.deltaspike.core.api.util.ClassUtils;
> >>  -
> >>  -import javax.enterprise.inject.Typed;
> >>  -import java.util.HashSet;
> >>  -import java.util.List;
> >>  -import java.util.Set;
> >>  -import java.util.logging.Logger;
> >>  -
> >>  -/**
> >>  - * Helper methods for {@link ClassDeactivator}
> >>  - */
> >>  -@Typed()
> >>  -public final class ClassDeactivation
> >>  -{
> >>  -    private static final Logger LOG =
> >>  Logger.getLogger(ClassDeactivation.class.getName());
> >>  -
> >>  -    private ClassDeactivation()
> >>  -    {
> >>  -    }
> >>  -
> >>  -    /**
> >>  -     * Evaluates if the given class is active
> >>  -     *
> >>  -     * @param targetClass current class
> >>  -     * @return true if it is active, false otherwise
> >>  -     */
> >>  -    public static boolean isClassActivated(Class targetClass)
> >>  -    {
> >>  -        ClassDeactivator classDeactivator =
> >>  ClassDeactivatorStorage.getClassDeactivator();
> >>  -
> >>  -        if (classDeactivator == null)
> >>  -        {
> >>  -            classDeactivator = resolveAndCacheClassDeactivator();
> >>  -        }
> >>  -
> >>  -        boolean classDeactivated =
> >>  classDeactivator.getDeactivatedClasses().contains(targetClass);
> >>  -
> >>  -        return !classDeactivated;
> >>  -    }
> >>  -
> >>  -    /**
> >>  -     * Allows to provide a custom {@link ClassDeactivator}
> >>  -     *
> >>  -     * @param classDeactivator class-deactivator which should be used
> >>  -     */
> >>  -    public static void setClassDeactivator(ClassDeactivator
> >>  classDeactivator)
> >>  -    {
> >>  -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
> >>  -    }
> >>  -
> >>  -    private static ClassDeactivator resolveAndCacheClassDeactivator()
> >>  -    {
> >>  -        ClassDeactivator classDeactivator =
> >>  getConfiguredClassDeactivator();
> >>  -
> >>  -        // display deactivated classes here once
> >>  -        // NOTE that isClassActivated() will be called many times for
> the
> >>  same class
> >>  -        for (Class<?> deactivatedClass :
> >>  classDeactivator.getDeactivatedClasses())
> >>  -        {
> >>  -            LOG.info("deactivate: " + deactivatedClass);
> >>  -        }
> >>  -
> >>  -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
> >>  -        return classDeactivator;
> >>  -    }
> >>  -
> >>  -    private static ClassDeactivator getConfiguredClassDeactivator()
> >>  -    {
> >>  -        List<String> classDeactivatorClassNames =
> >>  ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
> >>  -        Set<Class> deactivatedClasses = new HashSet<Class>();
> >>  -
> >>  -        ClassDeactivator currentClassDeactivator;
> >>  -        for (String classDeactivatorClassName :
> >>  classDeactivatorClassNames)
> >>  -        {
> >>  -            LOG.info(classDeactivatorClassName + " gets
> > processed");
> >>  -
> >>  -            currentClassDeactivator =
> >>  -
> >>   ClassUtils.tryToInstantiateClassForName(classDeactivatorClassName,
> >>  ClassDeactivator.class);
> >>  -
> >>  -            if (currentClassDeactivator != null)
> >>  -            {
> >>  -
> >>
> >
> deactivatedClasses.addAll(currentClassDeactivator.getDeactivatedClasses());
> >>  -            }
> >>  -            else
> >>  -            {
> >>  -                LOG.warning(classDeactivatorClassName + " can't
> > be
> >>  instantiated");
> >>  -            }
> >>  -        }
> >>  -
> >>  -        return new DefaultClassDeactivator(deactivatedClasses);
> >>  -    }
> >>  -}
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> >>
> >
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> >>  deleted file mode 100644
> >>  index a7c2d02..0000000
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> >>  +++ /dev/null
> >>  @@ -1,66 +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.deltaspike.core.impl.util;
> >>  -
> >>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> >>  -import org.apache.deltaspike.core.api.util.ClassUtils;
> >>  -
> >>  -import javax.enterprise.inject.Typed;
> >>  -import java.util.Map;
> >>  -import java.util.concurrent.ConcurrentHashMap;
> >>  -
> >>  -/**
> >>  - * Cache for {@link ClassDeactivator} implementations
> >>  - */
> >>  -@Typed()
> >>  -class ClassDeactivatorStorage
> >>  -{
> >>  -    private static Map<ClassLoader, ClassDeactivator>
> > classDeactivatorMap
> >>  -        = new ConcurrentHashMap<ClassLoader, ClassDeactivator>();
> >>  -
> >>  -    private ClassDeactivatorStorage()
> >>  -    {
> >>  -    }
> >>  -
> >>  -    static void setClassDeactivator(ClassDeactivator classDeactivator)
> >>  -    {
> >>  -        if (classDeactivator != null)
> >>  -        {
> >>  -            classDeactivatorMap.put(getClassLoader(),
> classDeactivator);
> >>  -        }
> >>  -        else
> >>  -        {
> >>  -            classDeactivatorMap.remove(getClassLoader());
> >>  -        }
> >>  -    }
> >>  -
> >>  -    static ClassDeactivator getClassDeactivator()
> >>  -    {
> >>  -        if (!classDeactivatorMap.containsKey(getClassLoader()))
> >>  -        {
> >>  -            return null;
> >>  -        }
> >>  -        return classDeactivatorMap.get(getClassLoader());
> >>  -    }
> >>  -
> >>  -    private static ClassLoader getClassLoader()
> >>  -    {
> >>  -        return ClassUtils.getClassLoader(null);
> >>  -    }
> >>  -}
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> >>
> >
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> >>  deleted file mode 100644
> >>  index b8c2831..0000000
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> >>  +++ /dev/null
> >>  @@ -1,51 +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.deltaspike.core.impl.util;
> >>  -
> >>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> >>  -
> >>  -import java.util.Set;
> >>  -
> >>  -/**
> >>  - * Helper implementation which gets initialized with all configured
> >>  classes which have to be deactivated
> >>  - */
> >>  -class DefaultClassDeactivator implements ClassDeactivator
> >>  -{
> >>  -    private static final long serialVersionUID =
> -1653478265237950470L;
> >>  -
> >>  -    private Set<Class> deactivatedClasses;
> >>  -
> >>  -    /**
> >>  -     * Required constructor which receives all configured classes
> which
> >>  will be returned by #getDeactivatedClasses
> >>  -     * @param deactivatedClasses classes which get returned by
> >>  #getDeactivatedClasses
> >>  -     */
> >>  -    public DefaultClassDeactivator(Set<Class> deactivatedClasses)
> >>  -    {
> >>  -        this.deactivatedClasses = deactivatedClasses;
> >>  -    }
> >>  -
> >>  -    /**
> >>  -     * {@inheritDoc}
> >>  -     */
> >>  -    @Override
> >>  -    public Set<Class> getDeactivatedClasses()
> >>  -    {
> >>  -        return this.deactivatedClasses;
> >>  -    }
> >>  -}
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> >>  index 4eb5fe7..86fcb34 100644
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> >>  +++
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> >>  @@ -18,9 +18,12 @@
> >>   */
> >>   package org.apache.deltaspike.test.core.impl.activation;
> >>
> >>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
> >>  +
> >>   /**
> >>   * Class which isn't deactivated
> >>   */
> >>  -public class ActivatedClass
> >>  +public class ActivatedClass implements Deactivatable
> >>   {
> >>  +
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> >>  index a8f1a62..8cba1c0 100644
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> >>  +++
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> >>  @@ -18,9 +18,11 @@
> >>   */
> >>   package org.apache.deltaspike.test.core.impl.activation;
> >>
> >>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
> >>  +
> >>   /**
> >>   * Class which is deactivated
> >>   */
> >>  -public class DeactivatedClass
> >>  +public class DeactivatedClass implements Deactivatable
> >>   {
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> >>  index f5af85d..bb4e7a1 100644
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> >>  +++
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> >>  @@ -18,7 +18,7 @@
> >>   */
> >>   package org.apache.deltaspike.test.core.impl.activation;
> >>
> >>  -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
> >>  +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
> >>   import org.apache.deltaspike.test.core.api.provider.TestBean;
> >>   import
> >>  org.apache.deltaspike.test.core.api.temptestutil.ShrinkWrapArchiveUtil;
> >>   import org.apache.deltaspike.test.util.FileUtils;
> >>  @@ -64,7 +64,7 @@ public class TestClassDeactivation
> >>      @Test
> >>      public void testActivatedClass()
> >>      {
> >>  -
> >>
> >
> Assert.assertTrue(ClassDeactivation.isClassActivated(ActivatedClass.class));
> >>  +
> >>
> Assert.assertTrue(ClassDeactivation.isActivated(ActivatedClass.class));
> >>      }
> >>
> >>      /**
> >>  @@ -73,6 +73,6 @@ public class TestClassDeactivation
> >>      @Test
> >>      public void testDeactivatedClass()
> >>      {
> >>  -
> >>
> >
> Assert.assertFalse(ClassDeactivation.isClassActivated(DeactivatedClass.class));
> >>  +
> >>
> Assert.assertFalse(ClassDeactivation.isActivated(DeactivatedClass.class));
> >>      }
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> >>  index 2d7557f..e7ec158 100644
> >>  ---
> >>
> >
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> >>  +++
> >>
> >
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> >>  @@ -18,20 +18,23 @@
> >>   */
> >>   package org.apache.deltaspike.test.core.impl.activation;
> >>
> >>  -import
> org.apache.deltaspike.core.api.activation.AbstractClassDeactivator;
> >>  +
> >>  +import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> >>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
> >>
> >>   /**
> >>   * Test {@link
> org.apache.deltaspike.core.api.activation.ClassDeactivator}
> >>  - * which is needed to test {@link
> >>  org.apache.deltaspike.core.impl.util.ClassDeactivation}
> >>  + * which is needed to test {@link
> >>  org.apache.deltaspike.core.api.activation.ClassDeactivation}
> >>   */
> >>  -public class TestClassDeactivator extends AbstractClassDeactivator
> >>  +public class TestClassDeactivator implements ClassDeactivator
> >>   {
> >>  -    /**
> >>  -     * {@inheritDoc}
> >>  -     */
> >>      @Override
> >>  -    protected void deactivateClasses()
> >>  +    public Boolean isActivated(Class<? extends Deactivatable>
> >>  deactivatableClazz)
> >>      {
> >>  -        addDeactivatedClass(DeactivatedClass.class);
> >>  +        if (deactivatableClazz.equals(DeactivatedClass.class))
> >>  +        {
> >>  +            return Boolean.FALSE;
> >>  +        }
> >>  +        return null;
> >>      }
> >>   }
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> >>
> >
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> >>  index c63a9ba..246c1a1 100644
> >>  ---
> >>
> >
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> >>  +++
> >>
> >
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> >>  @@ -68,7 +68,8 @@ public class ExcludeIntegrationTest
> >>                          "META-INF/beans.xml",
> >>                          new
> > String[]{"org.apache.deltaspike.core",
> >>
> > "org.apache.deltaspike.integration",
> >>  -
> >>   "org.apache.deltaspike.test.core.api.exclude"},
> >>  +
> >>   "org.apache.deltaspike.test.core.api.exclude",
> >>  +
> >>   "org.apache.deltaspike.test.core.impl.activation"},
> >>                          null))
> >>                  .addClass(IntegrationTestProjectStageProducer.class)
> >>
> >>  .addAsResource(FileUtils.getFileForURL(deltaSpikeConfig.toString()),
> >>
> >>
> >>
> >
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> >>  ----------------------------------------------------------------------
> >>  diff --git
> >>
> >
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> >>
> >
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> >>  index 8a7e771..043eaaa 100644
> >>  ---
> >>
> >
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> >>  +++
> >>
> >
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> >>  @@ -18,6 +18,5 @@
> >>   deltaspike_ordinal=1001
> >>
> >>
> >>
> >
> org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer=org.apache.deltaspike.integration.core.api.projectstage.IntegrationTestProjectStageProducer
> >>
> >>
> >
> -org.apache.deltaspike.core.api.activation.ClassDeactivator=org.apache.deltaspike.integration.core.impl.activation.TestClassDeactivator
> >>   db=itDb
> >>
> >>
> >>
> >
>

Re: git commit: DELTASPIKE-24 rework Deactivation logic

Posted by Mark Struberg <st...@yahoo.de>.
sorry, didn't know you are still working on that stuff. It was marked as done and while reviewing I spotted a few areas where I thought we can do this even better.

LieGrue,
strub



----- Original Message -----
> From: Gerhard Petracek <ge...@gmail.com>
> To: deltaspike-dev@incubator.apache.org
> Cc: 
> Sent: Sunday, January 22, 2012 3:23 PM
> Subject: Re: git commit: DELTASPIKE-24 rework Deactivation logic
> 
> i know why you did it in this case - but in general: -1 for committing such
> large changes in case of an ongoing discussion.
> some hours ago i added a suggestion to [1] exactly for such cases.
> 
> regards,
> gerhard
> 
> [1] http://s.apache.org/oo
> 
> 
> 
> 2012/1/22 <st...@apache.org>
> 
>>  Updated Branches:
>>   refs/heads/master f5d1995b3 -> e3f7e3e4e
>> 
>> 
>>  DELTASPIKE-24 rework Deactivation logic
>> 
>>  This introduces 3 new features
>>  a.) allow deactivation and also re-activation based on ordinals
>>  b.) make it a 1-liner to use for external Extensions
>>  c.) Deativatable is now a pure Marker Interface
>> 
>> 
>>  Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
>>  Commit:
>>  http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/e3f7e3e4
>>  Tree:
>>  http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/e3f7e3e4
>>  Diff:
>>  http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/e3f7e3e4
>> 
>>  Branch: refs/heads/master
>>  Commit: e3f7e3e4e254401265ac5cc87fcaff5f232392f8
>>  Parents: f5d1995
>>  Author: Mark Struberg <st...@apache.org>
>>  Authored: Sun Jan 22 14:21:52 2012 +0100
>>  Committer: Mark Struberg <st...@apache.org>
>>  Committed: Sun Jan 22 14:21:52 2012 +0100
>> 
>>  ----------------------------------------------------------------------
>>   .../api/activation/AbstractClassDeactivator.java   |   61 -------
>>   .../core/api/activation/ClassDeactivation.java     |  122 +++++++++++++++
>>   .../core/api/activation/ClassDeactivator.java      |   16 +-
>>   .../core/api/activation/Deactivatable.java         |   20 +--
>>   .../deltaspike/core/api/config/ConfigResolver.java |   10 +-
>>   .../core/impl/exclude/ExcludeExtension.java        |   14 +-
>>   .../core/impl/util/ClassDeactivation.java          |  113 -------------
>>   .../core/impl/util/ClassDeactivatorStorage.java    |   66 --------
>>   .../core/impl/util/DefaultClassDeactivator.java    |   51 ------
>>   .../test/core/impl/activation/ActivatedClass.java  |    5 +-
>>   .../core/impl/activation/DeactivatedClass.java     |    4 +-
>>   .../impl/activation/TestClassDeactivation.java     |    6 +-
>>   .../core/impl/activation/TestClassDeactivator.java |   19 ++-
>>   .../core/api/exclude/ExcludeIntegrationTest.java   |    3 +-
>>   .../META-INF/apache-deltaspike.properties          |    1 -
>>   15 files changed, 178 insertions(+), 333 deletions(-)
>>  ----------------------------------------------------------------------
>> 
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
>>  deleted file mode 100644
>>  index f3755ad..0000000
>>  ---
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
>>  +++ /dev/null
>>  @@ -1,61 +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.deltaspike.core.api.activation;
>>  -
>>  -import java.util.HashSet;
>>  -import java.util.Set;
>>  -
>>  -/**
>>  - * Base implementation which allows an easier class-deactivator
>>  implementation
>>  - */
>>  -public abstract class AbstractClassDeactivator implements ClassDeactivator
>>  -{
>>  -    // HashSet due to Serializable warning in checkstyle rules
>>  -    private HashSet<Class> deactivatedClasses = null;
>>  -
>>  -    /**
>>  -     * {@inheritDoc}
>>  -     */
>>  -    @Override
>>  -    public final synchronized Set<Class> getDeactivatedClasses()
>>  -    {
>>  -        if (this.deactivatedClasses == null)
>>  -        {
>>  -            this.deactivatedClasses = new HashSet<Class>();
>>  -            deactivateClasses();
>>  -        }
>>  -        return this.deactivatedClasses;
>>  -    }
>>  -
>>  -    /**
>>  -     * Can be used by sub-classes to add deactivated classes easily.
>>  -     *
>>  -     * @param deactivatedClass class to deactivate
>>  -     */
>>  -    protected final void addDeactivatedClass(Class deactivatedClass)
>>  -    {
>>  -        this.deactivatedClasses.add(deactivatedClass);
>>  -    }
>>  -
>>  -    /**
>>  -     * An implementation has to add classes which shouldn't be used by
>>  DeltaSpike.
>>  -     * (use {@link #addDeactivatedClass(Class)} for adding classes)
>>  -     */
>>  -    protected abstract void deactivateClasses();
>>  -}
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
>>  new file mode 100644
>>  index 0000000..6a31ad9
>>  --- /dev/null
>>  +++
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
>>  @@ -0,0 +1,122 @@
>>  +/*
>>  + * 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.deltaspike.core.api.activation;
>>  +
>>  +import org.apache.deltaspike.core.api.config.ConfigResolver;
>>  +import org.apache.deltaspike.core.api.util.ClassUtils;
>>  +
>>  +import javax.enterprise.inject.Typed;
>>  +import java.util.ArrayList;
>>  +import java.util.List;
>>  +import java.util.Map;
>>  +import java.util.concurrent.ConcurrentHashMap;
>>  +import java.util.logging.Logger;
>>  +
>>  +/**
>>  + * Helper methods for {@link ClassDeactivator}
>>  + */
>>  +@Typed()
>>  +public final class ClassDeactivation
>>  +{
>>  +    private static final Logger LOG =
>>  Logger.getLogger(ClassDeactivation.class.getName());
>>  +
>>  +    /**
>>  +     * This Map holds the ClassLoader as first level to make it possible
>>  to have different configurations per
>>  +     * WebApplication in an EAR or other Multi-ClassLoader scenario.
>>  +     *
>>  +     * The Map then contains a List of {@link ClassDeactivator}s in order
>>  of their configured ordinal.
>>  +     */
>>  +    private static Map<ClassLoader, List<ClassDeactivator>>
>>  classDeactivatorMap
>>  +        = new ConcurrentHashMap<ClassLoader, 
> List<ClassDeactivator>>();
>>  +
>>  +    private ClassDeactivation()
>>  +    {
>>  +        // private ct to prevent utility class from instantiation.
>>  +    }
>>  +
>>  +    /**
>>  +     * Evaluates if the given {@link Deactivatable} is active.
>>  +     *
>>  +     * @param deactivatableClazz {@link Deactivatable} under test.
>>  +     * @return <code>true</code> if it is active, 
> <code>false</code>
>>  otherwise
>>  +     */
>>  +    public static synchronized boolean isActivated(Class<? extends
>>  Deactivatable> deactivatableClazz)
>>  +    {
>>  +        List<ClassDeactivator> classDeactivators = 
> getClassDeactivators();
>>  +
>>  +        Boolean isActivated = Boolean.TRUE; // by default a class is
>>  always activated.
>>  +
>>  +        for (ClassDeactivator classDeactivator : classDeactivators)
>>  +        {
>>  +            Boolean isLocallyActivated =
>>  classDeactivator.isActivated(deactivatableClazz);
>>  +            if (isLocallyActivated != null)
>>  +            {
>>  +                isActivated = isLocallyActivated;
>>  +            }
>>  +        }
>>  +
>>  +        if (!isActivated)
>>  +        {
>>  +            LOG.info("Deactivating class " + 
> deactivatableClazz);
>>  +        }
>>  +
>>  +        return isActivated;
>>  +    }
>>  +
>>  +
>>  +    /**
>>  +     * @return the List of configured @{link ClassDeactivator}s for the
>>  current context ClassLoader.
>>  +     */
>>  +    private static List<ClassDeactivator> getClassDeactivators()
>>  +    {
>>  +        List<ClassDeactivator> classDeactivators =
>>  classDeactivatorMap.get(ClassUtils.getClassLoader(null));
>>  +        if (classDeactivators == null)
>>  +        {
>>  +            classDeactivators = getConfiguredClassDeactivator();
>>  +        }
>>  +
>>  +        return classDeactivators;
>>  +    }
>>  +
>>  +    private static List<ClassDeactivator> 
> getConfiguredClassDeactivator()
>>  +    {
>>  +        List<String> classDeactivatorClassNames =
>>  ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
>>  +
>>  +        List<ClassDeactivator> classDeactivators = new
>>  ArrayList<ClassDeactivator>();
>>  +
>>  +        for (String classDeactivatorClassName :
>>  classDeactivatorClassNames)
>>  +        {
>>  +            LOG.fine("processing ClassDeactivator: " +
>>  classDeactivatorClassName);
>>  +
>>  +            try
>>  +            {
>>  +                ClassDeactivator currentClassDeactivator =
>>  +                        (ClassDeactivator)
>>  ClassUtils.instantiateClassForName(classDeactivatorClassName);
>>  +                classDeactivators.add(currentClassDeactivator);
>>  +            }
>>  +            catch (Exception e)
>>  +            {
>>  +                LOG.warning(classDeactivatorClassName + " can't 
> be
>>  instantiated");
>>  +                throw new RuntimeException(e);
>>  +            }
>>  +        }
>>  +
>>  +        return classDeactivators;
>>  +    }
>>  +}
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
>>  index 1506539..89e4a6f 100644
>>  ---
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
>>  +++
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
>>  @@ -19,26 +19,28 @@
>>   package org.apache.deltaspike.core.api.activation;
>> 
>>   import java.io.Serializable;
>>  -import java.util.Set;
>> 
>>   /**
>>  - * <p>A class-deactivator allows to specify deactivated classes 
> which
>>  can't be deactivated via std. CDI mechanisms.</p>
>>  + * <p>A class-deactivator allows to specify deactivated classes 
> which
>>  can't be deactivated via std. CDI mechanisms.
>>  + * This might be the case for CDI Extensions because CDI mechanisms are
>>  not available at startup time.</p>
>>   *
>>   * <p>A class-deactivator will be resolved from the environment via 
> the
>>  default resolvers or via a custom resolver which
>>   * allows to use any type of configuration-format. See {@link
>>  org.apache.deltaspike.core.api.config.ConfigResolver}
>>   * for more information about how to configure it. The configuration key is
>>   *
>> 
> <code>org.apache.deltaspike.core.api.activation.ClassDeactivator</code></p>
>>   *
>>  - * <p>Furthermore, {@link AbstractClassDeactivator} is a convenience
>>  class which
>>  - * allows an easier implementation. All classes which implement {@link
>>  Deactivatable} in-/directly, can be deactivated
>>  - * with this mechanism. For all other classes/beans, you can use the veto
>>  mechanism provided by CDI.</p>
>>  + * <p>All DlassDeactivators will get picked up in order of their 
> ordinal
>>  and might explicitely activate or
>>  + * deactivate {@link Deactivatable} classes. Returning a
>>  <code>null</code> value means that the ClassDeactivator
>>  + * doesn't care about the very Deactivatable class.</p>
>>  + *
>>   */
>>   public interface ClassDeactivator extends Serializable
>>   {
>>      /**
>>       * Provides classes which should be deactivated.
>>       *
>>  -     * @return classes which should be deactivated
>>  +     * @return {@link Boolean#FALSE} if class should get activated,
>>  {@link Boolean#FALSE} if class must be available
>>  +     *         and <code>null</code> to let it as is (defined 
> by default
>>  or other
>>       */
>>  -    Set<Class> getDeactivatedClasses();
>>  +    Boolean isActivated(Class<? extends Deactivatable>
>>  deactivatableClazz);
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
>>  index 42bb6c7..a0785e3 100644
>>  ---
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
>>  +++
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
>>  @@ -19,20 +19,18 @@
>>   package org.apache.deltaspike.core.api.activation;
>> 
>>   /**
>>  - * Interface to allow easier detection of deactivatable classes.
>>  - * These classes are activated by default (e.g. via CDI config).
>>  + * <p>Interface to allow easier detection of deactivatable 
> classes.</p>
>>  + *
>>  + * <p>These classes are activated by default and can be disabled on
>>  demand (e.g. via CDI config).
>>   * Since CDI, JSF,... currently don't allow to deactivate default
>>  implementations,
>>  - * DeltaSpike has to introduce a proprietary mechanism.
>>  + * DeltaSpike has to introduce a proprietary mechanism.</p>
>>  + *
>>  + * <p>This is e.g. used to disable CDI Extensions in DeltaSpike and 
> might
>>  get
>>  + * used for other Extension libraries as well.</p>
>>   *
>>  - * This is e.g. used to disable CDI Extensions in DeltaSpike and might get
>>  - * used for other Extension libraries as well.
>>  + * <p><b>Note:</b> It is suggested that the 
> implementations
>>  + * use the {@link ClassDeactivation} for implementing the lookup</p>
>>   */
>>   public interface Deactivatable
>>   {
>>  -    /**
>>  -     * Returns if the current instance is active or not.
>>  -     *
>>  -     * @return true if the current instance is active, false otherwise
>>  -     */
>>  -    boolean isActivated();
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
>>  index fa83da9..6c71add 100644
>>  ---
>> 
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
>>  +++
>> 
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
>>  @@ -84,9 +84,13 @@ public final class ConfigResolver
>>      }
>> 
>>      /**
>>  -     * Resolve all values for the given key, from all registered
>>  ConfigSources.
>>  -     * @param key
>>  -     * @return List with all found property values, sorted in order of
>>  their ordinal.
>>  +     * Resolve all values for the given key, from all registered
>>  ConfigSources ordered by their
>>  +     * ordinal value in ascending ways. If more {@link ConfigSource}s
>>  have the same ordinal, their
>>  +     * order is undefined.
>>  +     *
>>  +     * @param key under which configuration is stored
>>  +     * @return List with all found property values, sorted in ascending
>>  order of their ordinal.
>>  +     * @see
>>  org.apache.deltaspike.core.spi.config.ConfigSource#getOrdinal()
>>       */
>>      public static List<String> getAllPropertyValues(String key)
>>      {
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
>> 
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
>>  index ad73a81..c86ac94 100644
>>  ---
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
>>  +++
>> 
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
>>  @@ -18,6 +18,7 @@
>>   */
>>   package org.apache.deltaspike.core.impl.exclude;
>> 
>>  +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
>>   import org.apache.deltaspike.core.api.activation.Deactivatable;
>>   import org.apache.deltaspike.core.api.exclude.Exclude;
>>   import org.apache.deltaspike.core.api.interpreter.ExpressionInterpreter;
>>  @@ -25,7 +26,6 @@ import
>>  org.apache.deltaspike.core.api.projectstage.ProjectStage;
>>   import org.apache.deltaspike.core.api.util.ClassUtils;
>>   import
>>  org.apache.deltaspike.core.impl.interpreter.PropertyExpressionInterpreter;
>>   import org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer;
>>  -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
>> 
>>   import javax.enterprise.event.Observes;
>>   import javax.enterprise.inject.spi.AfterDeploymentValidation;
>>  @@ -44,6 +44,8 @@ public class ExcludeExtension implements Extension,
>>  Deactivatable
>>   {
>>      private static final Logger LOG =
>>  Logger.getLogger(ExcludeExtension.class.getName());
>> 
>>  +    private Boolean isActivated = null;
>>  +
>>      /**
>>       * triggers initialization in any case
>>       * @param afterDeploymentValidation observed event
>>  @@ -197,12 +199,12 @@ public class ExcludeExtension implements Extension,
>>  Deactivatable
>>                  processAnnotatedType.getAnnotatedType().getJavaClass());
>>      }
>> 
>>  -    /**
>>  -     * {@inheritDoc}
>>  -     */
>>  -    @Override
>>      public boolean isActivated()
>>      {
>>  -        return ClassDeactivation.isClassActivated(getClass());
>>  +        if (isActivated == null)
>>  +        {
>>  +            isActivated = ClassDeactivation.isActivated(getClass());
>>  +        }
>>  +        return isActivated;
>>      }
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
>> 
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
>>  deleted file mode 100644
>>  index ef06193..0000000
>>  ---
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
>>  +++ /dev/null
>>  @@ -1,113 +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.deltaspike.core.impl.util;
>>  -
>>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
>>  -import org.apache.deltaspike.core.api.config.ConfigResolver;
>>  -import org.apache.deltaspike.core.api.util.ClassUtils;
>>  -
>>  -import javax.enterprise.inject.Typed;
>>  -import java.util.HashSet;
>>  -import java.util.List;
>>  -import java.util.Set;
>>  -import java.util.logging.Logger;
>>  -
>>  -/**
>>  - * Helper methods for {@link ClassDeactivator}
>>  - */
>>  -@Typed()
>>  -public final class ClassDeactivation
>>  -{
>>  -    private static final Logger LOG =
>>  Logger.getLogger(ClassDeactivation.class.getName());
>>  -
>>  -    private ClassDeactivation()
>>  -    {
>>  -    }
>>  -
>>  -    /**
>>  -     * Evaluates if the given class is active
>>  -     *
>>  -     * @param targetClass current class
>>  -     * @return true if it is active, false otherwise
>>  -     */
>>  -    public static boolean isClassActivated(Class targetClass)
>>  -    {
>>  -        ClassDeactivator classDeactivator =
>>  ClassDeactivatorStorage.getClassDeactivator();
>>  -
>>  -        if (classDeactivator == null)
>>  -        {
>>  -            classDeactivator = resolveAndCacheClassDeactivator();
>>  -        }
>>  -
>>  -        boolean classDeactivated =
>>  classDeactivator.getDeactivatedClasses().contains(targetClass);
>>  -
>>  -        return !classDeactivated;
>>  -    }
>>  -
>>  -    /**
>>  -     * Allows to provide a custom {@link ClassDeactivator}
>>  -     *
>>  -     * @param classDeactivator class-deactivator which should be used
>>  -     */
>>  -    public static void setClassDeactivator(ClassDeactivator
>>  classDeactivator)
>>  -    {
>>  -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
>>  -    }
>>  -
>>  -    private static ClassDeactivator resolveAndCacheClassDeactivator()
>>  -    {
>>  -        ClassDeactivator classDeactivator =
>>  getConfiguredClassDeactivator();
>>  -
>>  -        // display deactivated classes here once
>>  -        // NOTE that isClassActivated() will be called many times for the
>>  same class
>>  -        for (Class<?> deactivatedClass :
>>  classDeactivator.getDeactivatedClasses())
>>  -        {
>>  -            LOG.info("deactivate: " + deactivatedClass);
>>  -        }
>>  -
>>  -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
>>  -        return classDeactivator;
>>  -    }
>>  -
>>  -    private static ClassDeactivator getConfiguredClassDeactivator()
>>  -    {
>>  -        List<String> classDeactivatorClassNames =
>>  ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
>>  -        Set<Class> deactivatedClasses = new HashSet<Class>();
>>  -
>>  -        ClassDeactivator currentClassDeactivator;
>>  -        for (String classDeactivatorClassName :
>>  classDeactivatorClassNames)
>>  -        {
>>  -            LOG.info(classDeactivatorClassName + " gets 
> processed");
>>  -
>>  -            currentClassDeactivator =
>>  -
>>   ClassUtils.tryToInstantiateClassForName(classDeactivatorClassName,
>>  ClassDeactivator.class);
>>  -
>>  -            if (currentClassDeactivator != null)
>>  -            {
>>  -
>>   
> deactivatedClasses.addAll(currentClassDeactivator.getDeactivatedClasses());
>>  -            }
>>  -            else
>>  -            {
>>  -                LOG.warning(classDeactivatorClassName + " can't 
> be
>>  instantiated");
>>  -            }
>>  -        }
>>  -
>>  -        return new DefaultClassDeactivator(deactivatedClasses);
>>  -    }
>>  -}
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
>> 
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
>>  deleted file mode 100644
>>  index a7c2d02..0000000
>>  ---
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
>>  +++ /dev/null
>>  @@ -1,66 +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.deltaspike.core.impl.util;
>>  -
>>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
>>  -import org.apache.deltaspike.core.api.util.ClassUtils;
>>  -
>>  -import javax.enterprise.inject.Typed;
>>  -import java.util.Map;
>>  -import java.util.concurrent.ConcurrentHashMap;
>>  -
>>  -/**
>>  - * Cache for {@link ClassDeactivator} implementations
>>  - */
>>  -@Typed()
>>  -class ClassDeactivatorStorage
>>  -{
>>  -    private static Map<ClassLoader, ClassDeactivator> 
> classDeactivatorMap
>>  -        = new ConcurrentHashMap<ClassLoader, ClassDeactivator>();
>>  -
>>  -    private ClassDeactivatorStorage()
>>  -    {
>>  -    }
>>  -
>>  -    static void setClassDeactivator(ClassDeactivator classDeactivator)
>>  -    {
>>  -        if (classDeactivator != null)
>>  -        {
>>  -            classDeactivatorMap.put(getClassLoader(), classDeactivator);
>>  -        }
>>  -        else
>>  -        {
>>  -            classDeactivatorMap.remove(getClassLoader());
>>  -        }
>>  -    }
>>  -
>>  -    static ClassDeactivator getClassDeactivator()
>>  -    {
>>  -        if (!classDeactivatorMap.containsKey(getClassLoader()))
>>  -        {
>>  -            return null;
>>  -        }
>>  -        return classDeactivatorMap.get(getClassLoader());
>>  -    }
>>  -
>>  -    private static ClassLoader getClassLoader()
>>  -    {
>>  -        return ClassUtils.getClassLoader(null);
>>  -    }
>>  -}
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
>> 
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
>>  deleted file mode 100644
>>  index b8c2831..0000000
>>  ---
>> 
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
>>  +++ /dev/null
>>  @@ -1,51 +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.deltaspike.core.impl.util;
>>  -
>>  -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
>>  -
>>  -import java.util.Set;
>>  -
>>  -/**
>>  - * Helper implementation which gets initialized with all configured
>>  classes which have to be deactivated
>>  - */
>>  -class DefaultClassDeactivator implements ClassDeactivator
>>  -{
>>  -    private static final long serialVersionUID = -1653478265237950470L;
>>  -
>>  -    private Set<Class> deactivatedClasses;
>>  -
>>  -    /**
>>  -     * Required constructor which receives all configured classes which
>>  will be returned by #getDeactivatedClasses
>>  -     * @param deactivatedClasses classes which get returned by
>>  #getDeactivatedClasses
>>  -     */
>>  -    public DefaultClassDeactivator(Set<Class> deactivatedClasses)
>>  -    {
>>  -        this.deactivatedClasses = deactivatedClasses;
>>  -    }
>>  -
>>  -    /**
>>  -     * {@inheritDoc}
>>  -     */
>>  -    @Override
>>  -    public Set<Class> getDeactivatedClasses()
>>  -    {
>>  -        return this.deactivatedClasses;
>>  -    }
>>  -}
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
>>  index 4eb5fe7..86fcb34 100644
>>  ---
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
>>  +++
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
>>  @@ -18,9 +18,12 @@
>>   */
>>   package org.apache.deltaspike.test.core.impl.activation;
>> 
>>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
>>  +
>>   /**
>>   * Class which isn't deactivated
>>   */
>>  -public class ActivatedClass
>>  +public class ActivatedClass implements Deactivatable
>>   {
>>  +
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
>>  index a8f1a62..8cba1c0 100644
>>  ---
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
>>  +++
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
>>  @@ -18,9 +18,11 @@
>>   */
>>   package org.apache.deltaspike.test.core.impl.activation;
>> 
>>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
>>  +
>>   /**
>>   * Class which is deactivated
>>   */
>>  -public class DeactivatedClass
>>  +public class DeactivatedClass implements Deactivatable
>>   {
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
>>  index f5af85d..bb4e7a1 100644
>>  ---
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
>>  +++
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
>>  @@ -18,7 +18,7 @@
>>   */
>>   package org.apache.deltaspike.test.core.impl.activation;
>> 
>>  -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
>>  +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
>>   import org.apache.deltaspike.test.core.api.provider.TestBean;
>>   import
>>  org.apache.deltaspike.test.core.api.temptestutil.ShrinkWrapArchiveUtil;
>>   import org.apache.deltaspike.test.util.FileUtils;
>>  @@ -64,7 +64,7 @@ public class TestClassDeactivation
>>      @Test
>>      public void testActivatedClass()
>>      {
>>  -
>>   
> Assert.assertTrue(ClassDeactivation.isClassActivated(ActivatedClass.class));
>>  +
>>   Assert.assertTrue(ClassDeactivation.isActivated(ActivatedClass.class));
>>      }
>> 
>>      /**
>>  @@ -73,6 +73,6 @@ public class TestClassDeactivation
>>      @Test
>>      public void testDeactivatedClass()
>>      {
>>  -
>>   
> Assert.assertFalse(ClassDeactivation.isClassActivated(DeactivatedClass.class));
>>  +
>>   Assert.assertFalse(ClassDeactivation.isActivated(DeactivatedClass.class));
>>      }
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
>>  index 2d7557f..e7ec158 100644
>>  ---
>> 
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
>>  +++
>> 
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
>>  @@ -18,20 +18,23 @@
>>   */
>>   package org.apache.deltaspike.test.core.impl.activation;
>> 
>>  -import org.apache.deltaspike.core.api.activation.AbstractClassDeactivator;
>>  +
>>  +import org.apache.deltaspike.core.api.activation.ClassDeactivator;
>>  +import org.apache.deltaspike.core.api.activation.Deactivatable;
>> 
>>   /**
>>   * Test {@link org.apache.deltaspike.core.api.activation.ClassDeactivator}
>>  - * which is needed to test {@link
>>  org.apache.deltaspike.core.impl.util.ClassDeactivation}
>>  + * which is needed to test {@link
>>  org.apache.deltaspike.core.api.activation.ClassDeactivation}
>>   */
>>  -public class TestClassDeactivator extends AbstractClassDeactivator
>>  +public class TestClassDeactivator implements ClassDeactivator
>>   {
>>  -    /**
>>  -     * {@inheritDoc}
>>  -     */
>>      @Override
>>  -    protected void deactivateClasses()
>>  +    public Boolean isActivated(Class<? extends Deactivatable>
>>  deactivatableClazz)
>>      {
>>  -        addDeactivatedClass(DeactivatedClass.class);
>>  +        if (deactivatableClazz.equals(DeactivatedClass.class))
>>  +        {
>>  +            return Boolean.FALSE;
>>  +        }
>>  +        return null;
>>      }
>>   }
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
>> 
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
>>  index c63a9ba..246c1a1 100644
>>  ---
>> 
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
>>  +++
>> 
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
>>  @@ -68,7 +68,8 @@ public class ExcludeIntegrationTest
>>                          "META-INF/beans.xml",
>>                          new 
> String[]{"org.apache.deltaspike.core",
>>                                 
> "org.apache.deltaspike.integration",
>>  -
>>   "org.apache.deltaspike.test.core.api.exclude"},
>>  +
>>   "org.apache.deltaspike.test.core.api.exclude",
>>  +
>>   "org.apache.deltaspike.test.core.impl.activation"},
>>                          null))
>>                  .addClass(IntegrationTestProjectStageProducer.class)
>> 
>>  .addAsResource(FileUtils.getFileForURL(deltaSpikeConfig.toString()),
>> 
>> 
>> 
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
>>  ----------------------------------------------------------------------
>>  diff --git
>> 
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
>> 
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
>>  index 8a7e771..043eaaa 100644
>>  ---
>> 
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
>>  +++
>> 
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
>>  @@ -18,6 +18,5 @@
>>   deltaspike_ordinal=1001
>> 
>> 
>>   
> org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer=org.apache.deltaspike.integration.core.api.projectstage.IntegrationTestProjectStageProducer
>> 
>> 
> -org.apache.deltaspike.core.api.activation.ClassDeactivator=org.apache.deltaspike.integration.core.impl.activation.TestClassDeactivator
>>   db=itDb
>> 
>> 
>> 
> 

Re: git commit: DELTASPIKE-24 rework Deactivation logic

Posted by Gerhard Petracek <ge...@gmail.com>.
i know why you did it in this case - but in general: -1 for committing such
large changes in case of an ongoing discussion.
some hours ago i added a suggestion to [1] exactly for such cases.

regards,
gerhard

[1] http://s.apache.org/oo



2012/1/22 <st...@apache.org>

> Updated Branches:
>  refs/heads/master f5d1995b3 -> e3f7e3e4e
>
>
> DELTASPIKE-24 rework Deactivation logic
>
> This introduces 3 new features
> a.) allow deactivation and also re-activation based on ordinals
> b.) make it a 1-liner to use for external Extensions
> c.) Deativatable is now a pure Marker Interface
>
>
> Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/e3f7e3e4
> Tree:
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/e3f7e3e4
> Diff:
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/e3f7e3e4
>
> Branch: refs/heads/master
> Commit: e3f7e3e4e254401265ac5cc87fcaff5f232392f8
> Parents: f5d1995
> Author: Mark Struberg <st...@apache.org>
> Authored: Sun Jan 22 14:21:52 2012 +0100
> Committer: Mark Struberg <st...@apache.org>
> Committed: Sun Jan 22 14:21:52 2012 +0100
>
> ----------------------------------------------------------------------
>  .../api/activation/AbstractClassDeactivator.java   |   61 -------
>  .../core/api/activation/ClassDeactivation.java     |  122 +++++++++++++++
>  .../core/api/activation/ClassDeactivator.java      |   16 +-
>  .../core/api/activation/Deactivatable.java         |   20 +--
>  .../deltaspike/core/api/config/ConfigResolver.java |   10 +-
>  .../core/impl/exclude/ExcludeExtension.java        |   14 +-
>  .../core/impl/util/ClassDeactivation.java          |  113 -------------
>  .../core/impl/util/ClassDeactivatorStorage.java    |   66 --------
>  .../core/impl/util/DefaultClassDeactivator.java    |   51 ------
>  .../test/core/impl/activation/ActivatedClass.java  |    5 +-
>  .../core/impl/activation/DeactivatedClass.java     |    4 +-
>  .../impl/activation/TestClassDeactivation.java     |    6 +-
>  .../core/impl/activation/TestClassDeactivator.java |   19 ++-
>  .../core/api/exclude/ExcludeIntegrationTest.java   |    3 +-
>  .../META-INF/apache-deltaspike.properties          |    1 -
>  15 files changed, 178 insertions(+), 333 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> deleted file mode 100644
> index f3755ad..0000000
> ---
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/AbstractClassDeactivator.java
> +++ /dev/null
> @@ -1,61 +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.deltaspike.core.api.activation;
> -
> -import java.util.HashSet;
> -import java.util.Set;
> -
> -/**
> - * Base implementation which allows an easier class-deactivator
> implementation
> - */
> -public abstract class AbstractClassDeactivator implements ClassDeactivator
> -{
> -    // HashSet due to Serializable warning in checkstyle rules
> -    private HashSet<Class> deactivatedClasses = null;
> -
> -    /**
> -     * {@inheritDoc}
> -     */
> -    @Override
> -    public final synchronized Set<Class> getDeactivatedClasses()
> -    {
> -        if (this.deactivatedClasses == null)
> -        {
> -            this.deactivatedClasses = new HashSet<Class>();
> -            deactivateClasses();
> -        }
> -        return this.deactivatedClasses;
> -    }
> -
> -    /**
> -     * Can be used by sub-classes to add deactivated classes easily.
> -     *
> -     * @param deactivatedClass class to deactivate
> -     */
> -    protected final void addDeactivatedClass(Class deactivatedClass)
> -    {
> -        this.deactivatedClasses.add(deactivatedClass);
> -    }
> -
> -    /**
> -     * An implementation has to add classes which shouldn't be used by
> DeltaSpike.
> -     * (use {@link #addDeactivatedClass(Class)} for adding classes)
> -     */
> -    protected abstract void deactivateClasses();
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> new file mode 100644
> index 0000000..6a31ad9
> --- /dev/null
> +++
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivation.java
> @@ -0,0 +1,122 @@
> +/*
> + * 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.deltaspike.core.api.activation;
> +
> +import org.apache.deltaspike.core.api.config.ConfigResolver;
> +import org.apache.deltaspike.core.api.util.ClassUtils;
> +
> +import javax.enterprise.inject.Typed;
> +import java.util.ArrayList;
> +import java.util.List;
> +import java.util.Map;
> +import java.util.concurrent.ConcurrentHashMap;
> +import java.util.logging.Logger;
> +
> +/**
> + * Helper methods for {@link ClassDeactivator}
> + */
> +@Typed()
> +public final class ClassDeactivation
> +{
> +    private static final Logger LOG =
> Logger.getLogger(ClassDeactivation.class.getName());
> +
> +    /**
> +     * This Map holds the ClassLoader as first level to make it possible
> to have different configurations per
> +     * WebApplication in an EAR or other Multi-ClassLoader scenario.
> +     *
> +     * The Map then contains a List of {@link ClassDeactivator}s in order
> of their configured ordinal.
> +     */
> +    private static Map<ClassLoader, List<ClassDeactivator>>
> classDeactivatorMap
> +        = new ConcurrentHashMap<ClassLoader, List<ClassDeactivator>>();
> +
> +    private ClassDeactivation()
> +    {
> +        // private ct to prevent utility class from instantiation.
> +    }
> +
> +    /**
> +     * Evaluates if the given {@link Deactivatable} is active.
> +     *
> +     * @param deactivatableClazz {@link Deactivatable} under test.
> +     * @return <code>true</code> if it is active, <code>false</code>
> otherwise
> +     */
> +    public static synchronized boolean isActivated(Class<? extends
> Deactivatable> deactivatableClazz)
> +    {
> +        List<ClassDeactivator> classDeactivators = getClassDeactivators();
> +
> +        Boolean isActivated = Boolean.TRUE; // by default a class is
> always activated.
> +
> +        for (ClassDeactivator classDeactivator : classDeactivators)
> +        {
> +            Boolean isLocallyActivated =
> classDeactivator.isActivated(deactivatableClazz);
> +            if (isLocallyActivated != null)
> +            {
> +                isActivated = isLocallyActivated;
> +            }
> +        }
> +
> +        if (!isActivated)
> +        {
> +            LOG.info("Deactivating class " + deactivatableClazz);
> +        }
> +
> +        return isActivated;
> +    }
> +
> +
> +    /**
> +     * @return the List of configured @{link ClassDeactivator}s for the
> current context ClassLoader.
> +     */
> +    private static List<ClassDeactivator> getClassDeactivators()
> +    {
> +        List<ClassDeactivator> classDeactivators =
> classDeactivatorMap.get(ClassUtils.getClassLoader(null));
> +        if (classDeactivators == null)
> +        {
> +            classDeactivators = getConfiguredClassDeactivator();
> +        }
> +
> +        return classDeactivators;
> +    }
> +
> +    private static List<ClassDeactivator> getConfiguredClassDeactivator()
> +    {
> +        List<String> classDeactivatorClassNames =
> ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
> +
> +        List<ClassDeactivator> classDeactivators = new
> ArrayList<ClassDeactivator>();
> +
> +        for (String classDeactivatorClassName :
> classDeactivatorClassNames)
> +        {
> +            LOG.fine("processing ClassDeactivator: " +
> classDeactivatorClassName);
> +
> +            try
> +            {
> +                ClassDeactivator currentClassDeactivator =
> +                        (ClassDeactivator)
> ClassUtils.instantiateClassForName(classDeactivatorClassName);
> +                classDeactivators.add(currentClassDeactivator);
> +            }
> +            catch (Exception e)
> +            {
> +                LOG.warning(classDeactivatorClassName + " can't be
> instantiated");
> +                throw new RuntimeException(e);
> +            }
> +        }
> +
> +        return classDeactivators;
> +    }
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> index 1506539..89e4a6f 100644
> ---
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> +++
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/ClassDeactivator.java
> @@ -19,26 +19,28 @@
>  package org.apache.deltaspike.core.api.activation;
>
>  import java.io.Serializable;
> -import java.util.Set;
>
>  /**
> - * <p>A class-deactivator allows to specify deactivated classes which
> can't be deactivated via std. CDI mechanisms.</p>
> + * <p>A class-deactivator allows to specify deactivated classes which
> can't be deactivated via std. CDI mechanisms.
> + * This might be the case for CDI Extensions because CDI mechanisms are
> not available at startup time.</p>
>  *
>  * <p>A class-deactivator will be resolved from the environment via the
> default resolvers or via a custom resolver which
>  * allows to use any type of configuration-format. See {@link
> org.apache.deltaspike.core.api.config.ConfigResolver}
>  * for more information about how to configure it. The configuration key is
>  *
> <code>org.apache.deltaspike.core.api.activation.ClassDeactivator</code></p>
>  *
> - * <p>Furthermore, {@link AbstractClassDeactivator} is a convenience
> class which
> - * allows an easier implementation. All classes which implement {@link
> Deactivatable} in-/directly, can be deactivated
> - * with this mechanism. For all other classes/beans, you can use the veto
> mechanism provided by CDI.</p>
> + * <p>All DlassDeactivators will get picked up in order of their ordinal
> and might explicitely activate or
> + * deactivate {@link Deactivatable} classes. Returning a
> <code>null</code> value means that the ClassDeactivator
> + * doesn't care about the very Deactivatable class.</p>
> + *
>  */
>  public interface ClassDeactivator extends Serializable
>  {
>     /**
>      * Provides classes which should be deactivated.
>      *
> -     * @return classes which should be deactivated
> +     * @return {@link Boolean#FALSE} if class should get activated,
> {@link Boolean#FALSE} if class must be available
> +     *         and <code>null</code> to let it as is (defined by default
> or other
>      */
> -    Set<Class> getDeactivatedClasses();
> +    Boolean isActivated(Class<? extends Deactivatable>
> deactivatableClazz);
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> index 42bb6c7..a0785e3 100644
> ---
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> +++
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/activation/Deactivatable.java
> @@ -19,20 +19,18 @@
>  package org.apache.deltaspike.core.api.activation;
>
>  /**
> - * Interface to allow easier detection of deactivatable classes.
> - * These classes are activated by default (e.g. via CDI config).
> + * <p>Interface to allow easier detection of deactivatable classes.</p>
> + *
> + * <p>These classes are activated by default and can be disabled on
> demand (e.g. via CDI config).
>  * Since CDI, JSF,... currently don't allow to deactivate default
> implementations,
> - * DeltaSpike has to introduce a proprietary mechanism.
> + * DeltaSpike has to introduce a proprietary mechanism.</p>
> + *
> + * <p>This is e.g. used to disable CDI Extensions in DeltaSpike and might
> get
> + * used for other Extension libraries as well.</p>
>  *
> - * This is e.g. used to disable CDI Extensions in DeltaSpike and might get
> - * used for other Extension libraries as well.
> + * <p><b>Note:</b> It is suggested that the implementations
> + * use the {@link ClassDeactivation} for implementing the lookup</p>
>  */
>  public interface Deactivatable
>  {
> -    /**
> -     * Returns if the current instance is active or not.
> -     *
> -     * @return true if the current instance is active, false otherwise
> -     */
> -    boolean isActivated();
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> index fa83da9..6c71add 100644
> ---
> a/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> +++
> b/deltaspike/core/api/src/main/java/org/apache/deltaspike/core/api/config/ConfigResolver.java
> @@ -84,9 +84,13 @@ public final class ConfigResolver
>     }
>
>     /**
> -     * Resolve all values for the given key, from all registered
> ConfigSources.
> -     * @param key
> -     * @return List with all found property values, sorted in order of
> their ordinal.
> +     * Resolve all values for the given key, from all registered
> ConfigSources ordered by their
> +     * ordinal value in ascending ways. If more {@link ConfigSource}s
> have the same ordinal, their
> +     * order is undefined.
> +     *
> +     * @param key under which configuration is stored
> +     * @return List with all found property values, sorted in ascending
> order of their ordinal.
> +     * @see
> org.apache.deltaspike.core.spi.config.ConfigSource#getOrdinal()
>      */
>     public static List<String> getAllPropertyValues(String key)
>     {
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> index ad73a81..c86ac94 100644
> ---
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> +++
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exclude/ExcludeExtension.java
> @@ -18,6 +18,7 @@
>  */
>  package org.apache.deltaspike.core.impl.exclude;
>
> +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
>  import org.apache.deltaspike.core.api.activation.Deactivatable;
>  import org.apache.deltaspike.core.api.exclude.Exclude;
>  import org.apache.deltaspike.core.api.interpreter.ExpressionInterpreter;
> @@ -25,7 +26,6 @@ import
> org.apache.deltaspike.core.api.projectstage.ProjectStage;
>  import org.apache.deltaspike.core.api.util.ClassUtils;
>  import
> org.apache.deltaspike.core.impl.interpreter.PropertyExpressionInterpreter;
>  import org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer;
> -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
>
>  import javax.enterprise.event.Observes;
>  import javax.enterprise.inject.spi.AfterDeploymentValidation;
> @@ -44,6 +44,8 @@ public class ExcludeExtension implements Extension,
> Deactivatable
>  {
>     private static final Logger LOG =
> Logger.getLogger(ExcludeExtension.class.getName());
>
> +    private Boolean isActivated = null;
> +
>     /**
>      * triggers initialization in any case
>      * @param afterDeploymentValidation observed event
> @@ -197,12 +199,12 @@ public class ExcludeExtension implements Extension,
> Deactivatable
>                 processAnnotatedType.getAnnotatedType().getJavaClass());
>     }
>
> -    /**
> -     * {@inheritDoc}
> -     */
> -    @Override
>     public boolean isActivated()
>     {
> -        return ClassDeactivation.isClassActivated(getClass());
> +        if (isActivated == null)
> +        {
> +            isActivated = ClassDeactivation.isActivated(getClass());
> +        }
> +        return isActivated;
>     }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> deleted file mode 100644
> index ef06193..0000000
> ---
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivation.java
> +++ /dev/null
> @@ -1,113 +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.deltaspike.core.impl.util;
> -
> -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> -import org.apache.deltaspike.core.api.config.ConfigResolver;
> -import org.apache.deltaspike.core.api.util.ClassUtils;
> -
> -import javax.enterprise.inject.Typed;
> -import java.util.HashSet;
> -import java.util.List;
> -import java.util.Set;
> -import java.util.logging.Logger;
> -
> -/**
> - * Helper methods for {@link ClassDeactivator}
> - */
> -@Typed()
> -public final class ClassDeactivation
> -{
> -    private static final Logger LOG =
> Logger.getLogger(ClassDeactivation.class.getName());
> -
> -    private ClassDeactivation()
> -    {
> -    }
> -
> -    /**
> -     * Evaluates if the given class is active
> -     *
> -     * @param targetClass current class
> -     * @return true if it is active, false otherwise
> -     */
> -    public static boolean isClassActivated(Class targetClass)
> -    {
> -        ClassDeactivator classDeactivator =
> ClassDeactivatorStorage.getClassDeactivator();
> -
> -        if (classDeactivator == null)
> -        {
> -            classDeactivator = resolveAndCacheClassDeactivator();
> -        }
> -
> -        boolean classDeactivated =
> classDeactivator.getDeactivatedClasses().contains(targetClass);
> -
> -        return !classDeactivated;
> -    }
> -
> -    /**
> -     * Allows to provide a custom {@link ClassDeactivator}
> -     *
> -     * @param classDeactivator class-deactivator which should be used
> -     */
> -    public static void setClassDeactivator(ClassDeactivator
> classDeactivator)
> -    {
> -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
> -    }
> -
> -    private static ClassDeactivator resolveAndCacheClassDeactivator()
> -    {
> -        ClassDeactivator classDeactivator =
> getConfiguredClassDeactivator();
> -
> -        // display deactivated classes here once
> -        // NOTE that isClassActivated() will be called many times for the
> same class
> -        for (Class<?> deactivatedClass :
> classDeactivator.getDeactivatedClasses())
> -        {
> -            LOG.info("deactivate: " + deactivatedClass);
> -        }
> -
> -        ClassDeactivatorStorage.setClassDeactivator(classDeactivator);
> -        return classDeactivator;
> -    }
> -
> -    private static ClassDeactivator getConfiguredClassDeactivator()
> -    {
> -        List<String> classDeactivatorClassNames =
> ConfigResolver.getAllPropertyValues(ClassDeactivator.class.getName());
> -        Set<Class> deactivatedClasses = new HashSet<Class>();
> -
> -        ClassDeactivator currentClassDeactivator;
> -        for (String classDeactivatorClassName :
> classDeactivatorClassNames)
> -        {
> -            LOG.info(classDeactivatorClassName + " gets processed");
> -
> -            currentClassDeactivator =
> -
>  ClassUtils.tryToInstantiateClassForName(classDeactivatorClassName,
> ClassDeactivator.class);
> -
> -            if (currentClassDeactivator != null)
> -            {
> -
>  deactivatedClasses.addAll(currentClassDeactivator.getDeactivatedClasses());
> -            }
> -            else
> -            {
> -                LOG.warning(classDeactivatorClassName + " can't be
> instantiated");
> -            }
> -        }
> -
> -        return new DefaultClassDeactivator(deactivatedClasses);
> -    }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> deleted file mode 100644
> index a7c2d02..0000000
> ---
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/ClassDeactivatorStorage.java
> +++ /dev/null
> @@ -1,66 +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.deltaspike.core.impl.util;
> -
> -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> -import org.apache.deltaspike.core.api.util.ClassUtils;
> -
> -import javax.enterprise.inject.Typed;
> -import java.util.Map;
> -import java.util.concurrent.ConcurrentHashMap;
> -
> -/**
> - * Cache for {@link ClassDeactivator} implementations
> - */
> -@Typed()
> -class ClassDeactivatorStorage
> -{
> -    private static Map<ClassLoader, ClassDeactivator> classDeactivatorMap
> -        = new ConcurrentHashMap<ClassLoader, ClassDeactivator>();
> -
> -    private ClassDeactivatorStorage()
> -    {
> -    }
> -
> -    static void setClassDeactivator(ClassDeactivator classDeactivator)
> -    {
> -        if (classDeactivator != null)
> -        {
> -            classDeactivatorMap.put(getClassLoader(), classDeactivator);
> -        }
> -        else
> -        {
> -            classDeactivatorMap.remove(getClassLoader());
> -        }
> -    }
> -
> -    static ClassDeactivator getClassDeactivator()
> -    {
> -        if (!classDeactivatorMap.containsKey(getClassLoader()))
> -        {
> -            return null;
> -        }
> -        return classDeactivatorMap.get(getClassLoader());
> -    }
> -
> -    private static ClassLoader getClassLoader()
> -    {
> -        return ClassUtils.getClassLoader(null);
> -    }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> deleted file mode 100644
> index b8c2831..0000000
> ---
> a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/util/DefaultClassDeactivator.java
> +++ /dev/null
> @@ -1,51 +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.deltaspike.core.impl.util;
> -
> -import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> -
> -import java.util.Set;
> -
> -/**
> - * Helper implementation which gets initialized with all configured
> classes which have to be deactivated
> - */
> -class DefaultClassDeactivator implements ClassDeactivator
> -{
> -    private static final long serialVersionUID = -1653478265237950470L;
> -
> -    private Set<Class> deactivatedClasses;
> -
> -    /**
> -     * Required constructor which receives all configured classes which
> will be returned by #getDeactivatedClasses
> -     * @param deactivatedClasses classes which get returned by
> #getDeactivatedClasses
> -     */
> -    public DefaultClassDeactivator(Set<Class> deactivatedClasses)
> -    {
> -        this.deactivatedClasses = deactivatedClasses;
> -    }
> -
> -    /**
> -     * {@inheritDoc}
> -     */
> -    @Override
> -    public Set<Class> getDeactivatedClasses()
> -    {
> -        return this.deactivatedClasses;
> -    }
> -}
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> index 4eb5fe7..86fcb34 100644
> ---
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> +++
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/ActivatedClass.java
> @@ -18,9 +18,12 @@
>  */
>  package org.apache.deltaspike.test.core.impl.activation;
>
> +import org.apache.deltaspike.core.api.activation.Deactivatable;
> +
>  /**
>  * Class which isn't deactivated
>  */
> -public class ActivatedClass
> +public class ActivatedClass implements Deactivatable
>  {
> +
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> index a8f1a62..8cba1c0 100644
> ---
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> +++
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/DeactivatedClass.java
> @@ -18,9 +18,11 @@
>  */
>  package org.apache.deltaspike.test.core.impl.activation;
>
> +import org.apache.deltaspike.core.api.activation.Deactivatable;
> +
>  /**
>  * Class which is deactivated
>  */
> -public class DeactivatedClass
> +public class DeactivatedClass implements Deactivatable
>  {
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> index f5af85d..bb4e7a1 100644
> ---
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> +++
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivation.java
> @@ -18,7 +18,7 @@
>  */
>  package org.apache.deltaspike.test.core.impl.activation;
>
> -import org.apache.deltaspike.core.impl.util.ClassDeactivation;
> +import org.apache.deltaspike.core.api.activation.ClassDeactivation;
>  import org.apache.deltaspike.test.core.api.provider.TestBean;
>  import
> org.apache.deltaspike.test.core.api.temptestutil.ShrinkWrapArchiveUtil;
>  import org.apache.deltaspike.test.util.FileUtils;
> @@ -64,7 +64,7 @@ public class TestClassDeactivation
>     @Test
>     public void testActivatedClass()
>     {
> -
>  Assert.assertTrue(ClassDeactivation.isClassActivated(ActivatedClass.class));
> +
>  Assert.assertTrue(ClassDeactivation.isActivated(ActivatedClass.class));
>     }
>
>     /**
> @@ -73,6 +73,6 @@ public class TestClassDeactivation
>     @Test
>     public void testDeactivatedClass()
>     {
> -
>  Assert.assertFalse(ClassDeactivation.isClassActivated(DeactivatedClass.class));
> +
>  Assert.assertFalse(ClassDeactivation.isActivated(DeactivatedClass.class));
>     }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> index 2d7557f..e7ec158 100644
> ---
> a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> +++
> b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/activation/TestClassDeactivator.java
> @@ -18,20 +18,23 @@
>  */
>  package org.apache.deltaspike.test.core.impl.activation;
>
> -import org.apache.deltaspike.core.api.activation.AbstractClassDeactivator;
> +
> +import org.apache.deltaspike.core.api.activation.ClassDeactivator;
> +import org.apache.deltaspike.core.api.activation.Deactivatable;
>
>  /**
>  * Test {@link org.apache.deltaspike.core.api.activation.ClassDeactivator}
> - * which is needed to test {@link
> org.apache.deltaspike.core.impl.util.ClassDeactivation}
> + * which is needed to test {@link
> org.apache.deltaspike.core.api.activation.ClassDeactivation}
>  */
> -public class TestClassDeactivator extends AbstractClassDeactivator
> +public class TestClassDeactivator implements ClassDeactivator
>  {
> -    /**
> -     * {@inheritDoc}
> -     */
>     @Override
> -    protected void deactivateClasses()
> +    public Boolean isActivated(Class<? extends Deactivatable>
> deactivatableClazz)
>     {
> -        addDeactivatedClass(DeactivatedClass.class);
> +        if (deactivatableClazz.equals(DeactivatedClass.class))
> +        {
> +            return Boolean.FALSE;
> +        }
> +        return null;
>     }
>  }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> index c63a9ba..246c1a1 100644
> ---
> a/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> +++
> b/deltaspike/core/integration-test/src/test/java/org/apache/deltaspike/integration/core/api/exclude/ExcludeIntegrationTest.java
> @@ -68,7 +68,8 @@ public class ExcludeIntegrationTest
>                         "META-INF/beans.xml",
>                         new String[]{"org.apache.deltaspike.core",
>                                 "org.apache.deltaspike.integration",
> -
>  "org.apache.deltaspike.test.core.api.exclude"},
> +
>  "org.apache.deltaspike.test.core.api.exclude",
> +
>  "org.apache.deltaspike.test.core.impl.activation"},
>                         null))
>                 .addClass(IntegrationTestProjectStageProducer.class)
>
> .addAsResource(FileUtils.getFileForURL(deltaSpikeConfig.toString()),
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e3f7e3e4/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> ----------------------------------------------------------------------
> diff --git
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> index 8a7e771..043eaaa 100644
> ---
> a/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> +++
> b/deltaspike/core/integration-test/src/test/resources/META-INF/apache-deltaspike.properties
> @@ -18,6 +18,5 @@
>  deltaspike_ordinal=1001
>
>
>  org.apache.deltaspike.core.impl.projectstage.ProjectStageProducer=org.apache.deltaspike.integration.core.api.projectstage.IntegrationTestProjectStageProducer
>
> -org.apache.deltaspike.core.api.activation.ClassDeactivator=org.apache.deltaspike.integration.core.impl.activation.TestClassDeactivator
>  db=itDb
>
>
>