You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ta...@apache.org on 2017/09/01 07:40:06 UTC
svn commit: r1806895 - in /myfaces/core/branches/2.3.x/impl/src/main:
java/org/apache/myfaces/cdi/faces/
java/org/apache/myfaces/cdi/viewtransient/ resources/META-INF/services/
Author: tandraschko
Date: Fri Sep 1 07:40:06 2017
New Revision: 1806895
URL: http://svn.apache.org/viewvc?rev=1806895&view=rev
Log:
MYFACES-4146 restored viewTrasientScoped
Added:
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeBeanHolder.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeContextExtension.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeObjectProducer.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScoped.java
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopedContextImpl.java
Modified:
myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/faces/FacesScopeObjectProducer.java
myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
Modified: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/faces/FacesScopeObjectProducer.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/faces/FacesScopeObjectProducer.java?rev=1806895&r1=1806894&r2=1806895&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/faces/FacesScopeObjectProducer.java (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/faces/FacesScopeObjectProducer.java Fri Sep 1 07:40:06 2017
@@ -29,7 +29,6 @@ import javax.faces.annotation.RequestMap
import javax.faces.annotation.RequestParameterMap;
import javax.faces.annotation.RequestParameterValuesMap;
import javax.faces.annotation.SessionMap;
-import javax.faces.annotation.ViewMap;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.ExternalContext;
@@ -138,15 +137,6 @@ public class FacesScopeObjectProducer
{
return FacesContext.getCurrentInstance().getViewRoot();
}
-
- @Produces
- @Named("viewScope")
- @ViewMap
- @FacesScoped
- public Map<String, Object> getViewMap()
- {
- return FacesContext.getCurrentInstance().getViewRoot().getViewMap();
- }
@Produces
@Named("session")
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeBeanHolder.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeBeanHolder.java?rev=1806895&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeBeanHolder.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeBeanHolder.java Fri Sep 1 07:40:06 2017
@@ -0,0 +1,127 @@
+/*
+ * 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.myfaces.cdi.viewtransient;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.faces.context.FacesContext;
+import org.apache.myfaces.cdi.util.ContextualInstanceInfo;
+import org.apache.myfaces.cdi.util.ContextualStorage;
+
+
+/**
+ * Stateless class to deal with ViewTransientScope. This scope depends on the current FacesContext.
+ */
+public class ViewTransientScopeBeanHolder
+{
+
+ public static final String VIEW_TRANSIENT_SCOPE_MAP = "oam.VIEW_TRANSIENT_SCOPE_MAP";
+
+ public static final String VIEW_TRANSIENT_SCOPE_MAP_INFO = "oam.VIEW_TRANSIENT_SCOPE_MAP_INFO";
+
+ public ViewTransientScopeBeanHolder()
+ {
+ }
+
+ public void init()
+ {
+ }
+
+ public static ContextualStorage getContextualStorage(BeanManager beanManager, FacesContext facesContext)
+ {
+ ContextualStorage contextualStorage = (ContextualStorage)
+ facesContext.getViewRoot().getTransientStateHelper().getTransient(VIEW_TRANSIENT_SCOPE_MAP);
+ if (contextualStorage == null)
+ {
+ contextualStorage = new ContextualStorage(beanManager, false, false);
+ facesContext.getViewRoot().getTransientStateHelper()
+ .putTransient(VIEW_TRANSIENT_SCOPE_MAP, contextualStorage);
+ }
+
+ return contextualStorage;
+ }
+
+ public ContextualStorage getContextualStorageNoCreate(BeanManager beanManager, FacesContext facesContext)
+ {
+ return (ContextualStorage) facesContext.getViewRoot()
+ .getTransientStateHelper().getTransient(VIEW_TRANSIENT_SCOPE_MAP);
+ }
+
+ public Map<Object, Object> getFacesScopeMap(
+ BeanManager beanManager, FacesContext facesContext, boolean create)
+ {
+ Map<Object, Object> map = null;
+ if (create)
+ {
+ ContextualStorage contextualStorage = getContextualStorage(
+ beanManager, facesContext);
+ ContextualInstanceInfo info = contextualStorage.getStorage().get(VIEW_TRANSIENT_SCOPE_MAP_INFO);
+ if (info == null)
+ {
+ info = new ContextualInstanceInfo<Object>();
+ contextualStorage.getStorage().put(VIEW_TRANSIENT_SCOPE_MAP_INFO, info);
+ }
+ map = (Map<Object, Object>) info.getContextualInstance();
+ if (map == null)
+ {
+ map = new HashMap<Object,Object>();
+ info.setContextualInstance(map);
+ }
+ }
+ else
+ {
+ ContextualStorage contextualStorage = getContextualStorageNoCreate(
+ beanManager, facesContext);
+ if (contextualStorage != null)
+ {
+ ContextualInstanceInfo info = contextualStorage.getStorage().get(VIEW_TRANSIENT_SCOPE_MAP_INFO);
+ if (info != null)
+ {
+ map = (Map<Object, Object>) info.getContextualInstance();
+ }
+ }
+ }
+ return map;
+ }
+
+ /**
+ *
+ * This method will replace the storageMap and with
+ * a new empty one.
+ *
+ * @param facesContext
+ * @return the old storageMap.
+ */
+ public ContextualStorage forceNewStorage(FacesContext facesContext)
+ {
+ return (ContextualStorage) facesContext.getViewRoot()
+ .getTransientStateHelper().putTransient(VIEW_TRANSIENT_SCOPE_MAP, null);
+ }
+
+ public void destroyBeans(FacesContext facesContext)
+ {
+ ContextualStorage oldWindowContextStorages = forceNewStorage(facesContext);
+ if (oldWindowContextStorages != null)
+ {
+ ViewTransientScopedContextImpl.destroyAllActive(oldWindowContextStorages);
+ }
+ }
+
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeContextExtension.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeContextExtension.java?rev=1806895&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeContextExtension.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeContextExtension.java Fri Sep 1 07:40:06 2017
@@ -0,0 +1,52 @@
+/*
+ * 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.myfaces.cdi.viewtransient;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.spi.AfterBeanDiscovery;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Extension;
+
+/**
+ * Handle ViewScope related features.
+ */
+public class ViewTransientScopeContextExtension implements Extension
+{
+ private ViewTransientScopedContextImpl facesScopeContext;
+
+ void beforeBeanDiscovery(
+ @Observes final BeforeBeanDiscovery event, BeanManager beanManager)
+ {
+ event.addScope(ViewTransientScoped.class, true, false);
+
+ AnnotatedType<ViewTransientScopeObjectProducer> viewTransientScopeObjectProducer =
+ beanManager.createAnnotatedType(ViewTransientScopeObjectProducer.class);
+ event.addAnnotatedType(viewTransientScopeObjectProducer);
+ }
+
+ void afterBeanDiscovery(@Observes AfterBeanDiscovery afterBeanDiscovery, BeanManager beanManager)
+ {
+ facesScopeContext = new ViewTransientScopedContextImpl(beanManager);
+ afterBeanDiscovery.addContext(facesScopeContext);
+
+ // afterBeanDiscovery.addBean(new DynamicComponentProducer());
+ }
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeObjectProducer.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeObjectProducer.java?rev=1806895&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeObjectProducer.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopeObjectProducer.java Fri Sep 1 07:40:06 2017
@@ -0,0 +1,45 @@
+/*
+ * 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.myfaces.cdi.viewtransient;
+
+import java.util.Map;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.faces.annotation.ViewMap;
+import javax.faces.context.FacesContext;
+import javax.inject.Named;
+
+/**
+ * This class produces all objects that are bound or related to FacesContext
+ */
+@ApplicationScoped
+public class ViewTransientScopeObjectProducer
+{
+
+ @Produces
+ @Named("viewScope")
+ @ViewMap
+ @ViewTransientScoped
+ public Map<String, Object> getViewMap()
+ {
+ return FacesContext.getCurrentInstance().getViewRoot().getViewMap();
+ }
+
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScoped.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScoped.java?rev=1806895&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScoped.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScoped.java Fri Sep 1 07:40:06 2017
@@ -0,0 +1,40 @@
+/*
+ * 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.myfaces.cdi.viewtransient;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.enterprise.context.NormalScope;
+
+/**
+ *
+ */
+@NormalScope
+@Inherited
+@Documented
+@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+@Retention(value= RetentionPolicy.RUNTIME)
+public @interface ViewTransientScoped
+{
+
+}
Added: myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopedContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopedContextImpl.java?rev=1806895&view=auto
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopedContextImpl.java (added)
+++ myfaces/core/branches/2.3.x/impl/src/main/java/org/apache/myfaces/cdi/viewtransient/ViewTransientScopedContextImpl.java Fri Sep 1 07:40:06 2017
@@ -0,0 +1,223 @@
+/*
+ * 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.myfaces.cdi.viewtransient;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import javax.enterprise.context.ContextNotActiveException;
+import javax.enterprise.context.spi.Context;
+import javax.enterprise.context.spi.Contextual;
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Typed;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.PassivationCapable;
+import javax.faces.context.FacesContext;
+import org.apache.myfaces.cdi.util.ContextualInstanceInfo;
+import org.apache.myfaces.cdi.util.ContextualStorage;
+
+/**
+ * Minimal implementation of FacesScope.
+ */
+@Typed()
+public class ViewTransientScopedContextImpl implements Context
+{
+
+ private BeanManager beanManager;
+
+ public ViewTransientScopedContextImpl(BeanManager beanManager)
+ {
+ this.beanManager = beanManager;
+ }
+
+ protected ViewTransientScopeBeanHolder getViewTransientScopeBeanHolder()
+ {
+ return getViewTransientScopeBeanHolder(FacesContext.getCurrentInstance());
+ }
+
+ protected ViewTransientScopeBeanHolder getViewTransientScopeBeanHolder(FacesContext facesContext)
+ {
+ return new ViewTransientScopeBeanHolder();
+ }
+
+ /**
+ * An implementation has to return the underlying storage which
+ * contains the items held in the Context.
+ * @param createIfNotExist whether a ContextualStorage shall get created if it doesn't yet exist.
+ * @return the underlying storage
+ */
+ protected ContextualStorage getContextualStorage(boolean createIfNotExist, FacesContext facesContext)
+ {
+ if (facesContext == null)
+ {
+ throw new ContextNotActiveException("FacesScopedContextImpl: no current active facesContext");
+ }
+
+ if (createIfNotExist)
+ {
+ return getViewTransientScopeBeanHolder(facesContext).getContextualStorage(beanManager, facesContext);
+ }
+ else
+ {
+ return getViewTransientScopeBeanHolder(facesContext).getContextualStorageNoCreate(
+ beanManager, facesContext);
+ }
+ }
+
+ public Class<? extends Annotation> getScope()
+ {
+ return ViewTransientScoped.class;
+ }
+
+ public boolean isActive()
+ {
+ return isActive(FacesContext.getCurrentInstance());
+ }
+
+ public boolean isActive(FacesContext facesContext)
+ {
+ if (facesContext == null)
+ {
+ return false;
+ }
+ else if (facesContext.getViewRoot() == null)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public <T> T get(Contextual<T> bean)
+ {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+
+ checkActive(facesContext);
+
+ if (facesContext != null)
+ {
+ ContextualStorage storage = getContextualStorage(false, facesContext);
+ if (storage != null)
+ {
+ Map<Object, ContextualInstanceInfo<?>> contextMap = storage.getStorage();
+ ContextualInstanceInfo<?> contextualInstanceInfo = contextMap.get(storage.getBeanKey(bean));
+
+ if (contextualInstanceInfo != null)
+ {
+ return (T) contextualInstanceInfo.getContextualInstance();
+ }
+ }
+ }
+ else
+ {
+ throw new IllegalStateException("FacesContext cannot be found when resolving bean " +bean.toString());
+ }
+ return null;
+ }
+
+ public <T> T get(Contextual<T> bean, CreationalContext<T> creationalContext)
+ {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+
+ checkActive(facesContext);
+
+ if (!(bean instanceof PassivationCapable))
+ {
+ throw new IllegalStateException(bean.toString() +
+ " doesn't implement " + PassivationCapable.class.getName());
+ }
+
+ ContextualStorage storage = getContextualStorage(true, facesContext);
+
+ Map<Object, ContextualInstanceInfo<?>> contextMap = storage.getStorage();
+ ContextualInstanceInfo<?> contextualInstanceInfo = contextMap.get(storage.getBeanKey(bean));
+
+ if (contextualInstanceInfo != null)
+ {
+ @SuppressWarnings("unchecked")
+ final T instance = (T) contextualInstanceInfo.getContextualInstance();
+
+ if (instance != null)
+ {
+ return instance;
+ }
+ }
+
+ return storage.createContextualInstance(bean, creationalContext);
+ }
+
+ /**
+ * Destroy the Contextual Instance of the given Bean.
+ * @param bean dictates which bean shall get cleaned up
+ * @return <code>true</code> if the bean was destroyed, <code>false</code> if there was no such bean.
+ */
+ public boolean destroy(Contextual bean)
+ {
+ FacesContext facesContext = FacesContext.getCurrentInstance();
+ ContextualStorage storage = getContextualStorage(false, facesContext);
+ if (storage == null)
+ {
+ return false;
+ }
+ ContextualInstanceInfo<?> contextualInstanceInfo = storage.getStorage().get(storage.getBeanKey(bean));
+
+ if (contextualInstanceInfo == null)
+ {
+ return false;
+ }
+
+ bean.destroy(contextualInstanceInfo.getContextualInstance(), contextualInstanceInfo.getCreationalContext());
+ return true;
+ }
+
+ /**
+ * Destroys all the Contextual Instances in the specified ContextualStorage.
+ * This is a static method to allow various holder objects to cleanup
+ * properly in @PreDestroy.
+ */
+ public static void destroyAllActive(ContextualStorage storage)
+ {
+ Map<Object, ContextualInstanceInfo<?>> contextMap = storage.getStorage();
+ for (Map.Entry<Object, ContextualInstanceInfo<?>> entry : contextMap.entrySet())
+ {
+ if (!ViewTransientScopeBeanHolder.VIEW_TRANSIENT_SCOPE_MAP_INFO.equals(entry.getKey()))
+ {
+ Contextual bean = storage.getBean(entry.getKey());
+
+ ContextualInstanceInfo<?> contextualInstanceInfo = entry.getValue();
+ bean.destroy(contextualInstanceInfo.getContextualInstance(),
+ contextualInstanceInfo.getCreationalContext());
+ }
+ }
+ }
+
+ /**
+ * Make sure that the Context is really active.
+ * @throws ContextNotActiveException if there is no active
+ * Context for the current Thread.
+ */
+ protected void checkActive(FacesContext facesContext)
+ {
+ if (!isActive(facesContext))
+ {
+ throw new ContextNotActiveException("CDI context with scope annotation @"
+ + getScope().getName() + " is not active with respect to the current thread");
+ }
+ }
+
+}
Modified: myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension?rev=1806895&r1=1806894&r2=1806895&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension (original)
+++ myfaces/core/branches/2.3.x/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension Fri Sep 1 07:40:06 2017
@@ -5,6 +5,7 @@ org.apache.myfaces.cdi.dependent.Depende
org.apache.myfaces.config.annotation.CdiAnnotationProviderExtension
org.apache.myfaces.push.cdi.PushContextCDIExtension
org.apache.myfaces.cdi.faces.FacesScopeContextExtension
+org.apache.myfaces.cdi.viewtransient.ViewTransientScopeContextExtension
org.apache.myfaces.cdi.bean.ManagedPropertyExtension
org.apache.myfaces.cdi.converter.FacesConverterExtension
org.apache.myfaces.cdi.validator.FacesValidatorExtension