Updated Branches: refs/heads/master 951a3b6c0 -> 4a3da4053
DELTASPIKE-432 client-window adapter for jsf 2.2 (first draft) Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/4a3da405 Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/4a3da405 Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/4a3da405 Branch: refs/heads/master Commit: 4a3da405381406e2b3236e86a77efa92aac1d983 Parents: 951a3b6 Author: gpetracek <[email protected]> Authored: Fri Nov 1 19:42:53 2013 +0100 Committer: gpetracek <[email protected]> Committed: Fri Nov 1 20:15:23 2013 +0100 ---------------------------------------------------------------------- .../jsf/api/config/JsfModuleConfig.java | 18 ++ .../spi/scope/window/ClientWindowConfig.java | 5 + .../scope/window/DefaultClientWindowConfig.java | 23 +++ .../DeltaSpikeLifecycleFactoryWrapper.java | 22 +++ .../request/DeltaSpikeLifecycleWrapper.java | 11 ++ .../JsfClientWindowAwareLifecycleWrapper.java | 165 +++++++++++++++++++ .../impl/scope/window/ClientWindowAdapter.java | 69 ++++++++ .../impl/scope/window/DefaultClientWindow.java | 19 ++- deltaspike/modules/jsf/pom.xml | 3 + deltaspike/parent/pom.xml | 1 + 10 files changed, 330 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/api/config/JsfModuleConfig.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/api/config/JsfModuleConfig.java b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/api/config/JsfModuleConfig.java index b5b84b8..ee2c0a6 100644 --- a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/api/config/JsfModuleConfig.java +++ b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/api/config/JsfModuleConfig.java @@ -19,8 +19,10 @@ package org.apache.deltaspike.jsf.api.config; import org.apache.deltaspike.core.api.config.DeltaSpikeConfig; +import org.apache.deltaspike.core.util.ClassUtils; import javax.enterprise.context.ApplicationScoped; +import javax.faces.context.FacesContext; /** * Config for all JSF specific configurations. @@ -28,6 +30,9 @@ import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class JsfModuleConfig implements DeltaSpikeConfig { + public static final String CLIENT_WINDOW_CONFIG_KEY = "javax.faces.CLIENT_WINDOW_MODE"; + public static final String CLIENT_WINDOW_CLASS_NAME = "javax.faces.lifecycle.ClientWindow"; + private static final long serialVersionUID = -487295181899986237L; protected JsfModuleConfig() @@ -81,4 +86,17 @@ public class JsfModuleConfig implements DeltaSpikeConfig { return true; } + + public boolean isDelegatedWindowHandlingEnabled() + { + if (ClassUtils.tryToLoadClassForName(CLIENT_WINDOW_CLASS_NAME) == null) + { + return false; + } + + String configuredWindowHandling = FacesContext.getCurrentInstance().getExternalContext() + .getInitParameter(CLIENT_WINDOW_CONFIG_KEY); + + return !(configuredWindowHandling == null || "none".equalsIgnoreCase(configuredWindowHandling.trim())); + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java index dd3c5db..2828bd4 100644 --- a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java +++ b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/ClientWindowConfig.java @@ -49,6 +49,11 @@ public interface ClientWindowConfig LAZY, /** + * Delegates to the default window-handling of JSF 2.2+ (if configured) + */ + DELEGATED, + + /** * If you set this mode, you also need to provide an own {@link ClientWindow} implementation. */ CUSTOM http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java index a3bcf22..b2cb37d 100644 --- a/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java +++ b/deltaspike/modules/jsf/api/src/main/java/org/apache/deltaspike/jsf/spi/scope/window/DefaultClientWindowConfig.java @@ -18,6 +18,7 @@ */ package org.apache.deltaspike.jsf.spi.scope.window; +import javax.annotation.PostConstruct; import javax.enterprise.context.SessionScoped; import javax.faces.context.FacesContext; import javax.inject.Inject; @@ -30,6 +31,7 @@ import java.util.Map; import org.apache.deltaspike.core.api.projectstage.ProjectStage; import org.apache.deltaspike.core.util.ClassUtils; import org.apache.deltaspike.core.util.ExceptionUtils; +import org.apache.deltaspike.jsf.api.config.JsfModuleConfig; /** * <p>Default implementation of {@link ClientWindowConfig}. @@ -46,6 +48,8 @@ public class DefaultClientWindowConfig implements ClientWindowConfig, Serializab */ public static final String COOKIE_NAME_NOSCRIPT_ENABLED = "deltaspikeNoScriptEnabled"; + private static final long serialVersionUID = -708423418378550210L; + /** * The location of the default windowhandler resource */ @@ -65,8 +69,18 @@ public class DefaultClientWindowConfig implements ClientWindowConfig, Serializab private String clientWindowtml; @Inject + private JsfModuleConfig jsfModuleConfig; + + @Inject private ProjectStage projectStage; + private boolean useDelegatedWindowHandling; + + @PostConstruct + protected void init() + { + this.useDelegatedWindowHandling = this.jsfModuleConfig.isDelegatedWindowHandlingEnabled(); + } @Override public boolean isJavaScriptEnabled() @@ -117,6 +131,10 @@ public class DefaultClientWindowConfig implements ClientWindowConfig, Serializab { if (!isJavaScriptEnabled()) { + if (this.useDelegatedWindowHandling) + { + return ClientWindowRenderMode.DELEGATED; + } return ClientWindowRenderMode.NONE; } @@ -132,6 +150,11 @@ public class DefaultClientWindowConfig implements ClientWindowConfig, Serializab return ClientWindowRenderMode.NONE; } + if (this.useDelegatedWindowHandling) + { + return ClientWindowRenderMode.DELEGATED; + } + return ClientWindowRenderMode.CLIENTWINDOW; } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java index a62483d..e415ba2 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java @@ -21,6 +21,9 @@ package org.apache.deltaspike.jsf.impl.listener.request; import org.apache.deltaspike.core.spi.activation.Deactivatable; import org.apache.deltaspike.core.util.ClassDeactivationUtils; +import org.apache.deltaspike.core.util.ClassUtils; +import org.apache.deltaspike.core.util.ExceptionUtils; +import org.apache.deltaspike.jsf.api.config.JsfModuleConfig; import javax.faces.lifecycle.Lifecycle; import javax.faces.lifecycle.LifecycleFactory; @@ -32,6 +35,8 @@ public class DeltaSpikeLifecycleFactoryWrapper extends LifecycleFactory implemen private final boolean deactivated; + private final boolean jsfVersionWithClientWindowDetected; + /** * Constructor for wrapping the given {@link LifecycleFactory} * @@ -41,6 +46,8 @@ public class DeltaSpikeLifecycleFactoryWrapper extends LifecycleFactory implemen { this.wrapped = wrapped; this.deactivated = !ClassDeactivationUtils.isActivated(getClass()); + this.jsfVersionWithClientWindowDetected = + ClassUtils.tryToLoadClassForName(JsfModuleConfig.CLIENT_WINDOW_CLASS_NAME) != null; } @Override @@ -58,6 +65,21 @@ public class DeltaSpikeLifecycleFactoryWrapper extends LifecycleFactory implemen { return result; } + + if (this.jsfVersionWithClientWindowDetected) + { + Class<? extends Lifecycle> lifecycleWrapperClass = ClassUtils.tryToLoadClassForName( + "org.apache.deltaspike.jsf.impl.listener.request.JsfClientWindowAwareLifecycleWrapper"); + try + { + return lifecycleWrapperClass.getConstructor(new Class[] { Lifecycle.class }) + .newInstance(new DeltaSpikeLifecycleWrapper(result)); + } + catch (Exception e) + { + throw ExceptionUtils.throwAsRuntimeException(e); + } + } return new DeltaSpikeLifecycleWrapper(result); } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java index c9a0420..44ee9db 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java @@ -43,6 +43,11 @@ class DeltaSpikeLifecycleWrapper extends Lifecycle this.wrapped = wrapped; } + Lifecycle getWrapped() + { + return wrapped; + } + @Override public void addPhaseListener(PhaseListener phaseListener) { @@ -58,6 +63,12 @@ class DeltaSpikeLifecycleWrapper extends Lifecycle @Override public void execute(FacesContext facesContext) { + //can happen due to the window-handling of deltaspike + if (facesContext.getResponseComplete()) + { + return; + } + lazyInit(); //TODO broadcastApplicationStartupBroadcaster(); http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/JsfClientWindowAwareLifecycleWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/JsfClientWindowAwareLifecycleWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/JsfClientWindowAwareLifecycleWrapper.java new file mode 100644 index 0000000..12a41ef --- /dev/null +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/JsfClientWindowAwareLifecycleWrapper.java @@ -0,0 +1,165 @@ +/* + * 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.jsf.impl.listener.request; + +import org.apache.deltaspike.core.api.provider.BeanProvider; +import org.apache.deltaspike.core.util.ClassDeactivationUtils; +import org.apache.deltaspike.core.util.ExceptionUtils; +import org.apache.deltaspike.jsf.api.config.JsfModuleConfig; +import org.apache.deltaspike.jsf.impl.scope.window.ClientWindowAdapter; +import org.apache.deltaspike.jsf.spi.scope.window.ClientWindow; + +import javax.faces.context.FacesContext; +import javax.faces.lifecycle.Lifecycle; +import javax.faces.lifecycle.LifecycleWrapper; +import java.lang.reflect.Field; + +@SuppressWarnings("UnusedDeclaration") +public class JsfClientWindowAwareLifecycleWrapper extends LifecycleWrapper +{ + private final Lifecycle wrapped; + + private volatile Boolean initialized; + private boolean delegateWindowHandling; + + public JsfClientWindowAwareLifecycleWrapper(Lifecycle wrapped) + { + this.wrapped = wrapped; + } + + public Lifecycle getWrapped() + { + return wrapped; + } + + @Override + public void attachWindow(FacesContext facesContext) + { + if (this.initialized == null) + { + lazyInit(); + } + + if (this.delegateWindowHandling) + { + try + { + //the first wrapper is always DeltaSpikeLifecycleWrapper which can't extend from LifecycleWrapper + Lifecycle externalWrapper = ((DeltaSpikeLifecycleWrapper)this.wrapped).getWrapped(); + delegateAttachWindow(facesContext, externalWrapper); + } + catch (Exception e) + { + try + { + attachWindowOnUnwrappedInstance(facesContext, this.wrapped); + } + catch (Exception e1) + { + throw ExceptionUtils.throwAsRuntimeException(e); + } + } + } + else + { + ClientWindow clientWindow = BeanProvider.getContextualReference(ClientWindow.class); + //trigger init - might lead to a redirect -> response-complete + String windowId = clientWindow.getWindowId(facesContext); + + if (!facesContext.getResponseComplete() && !"default".equals(windowId)) + { + facesContext.getExternalContext().setClientWindow(new ClientWindowAdapter(clientWindow)); + } + } + } + + private void attachWindowOnUnwrappedInstance(FacesContext facesContext, Lifecycle wrapped) throws Exception + { + Lifecycle wrappedLifecycle = null; + + if (wrapped instanceof LifecycleWrapper) + { + wrappedLifecycle = ((LifecycleWrapper)wrapped).getWrapped(); + } + + //needed to support some libs which don't use LifecycleWrapper, because it's a jsf 2.2+ api + if (wrappedLifecycle == null) + { + for (Field field : wrapped.getClass().getDeclaredFields()) + { + if (Lifecycle.class.isAssignableFrom(field.getType())) + { + if (!field.isAccessible()) + { + field.setAccessible(true); + } + wrappedLifecycle = (Lifecycle)field.get(wrapped); + break; + } + } + } + + if (wrappedLifecycle != null) + { + try + { + delegateAttachWindow(facesContext, wrappedLifecycle); + } + catch (Exception e) + { + attachWindowOnUnwrappedInstance(facesContext, wrappedLifecycle); + } + } + } + + private static void delegateAttachWindow(FacesContext facesContext, Lifecycle lifecycle) throws Exception + { + //if there is an external wrapper (e.g. in case of other libs), we have to check + //the version of javax.faces.lifecycle.Lifecycle (>= or < v2.2) + //without the check and an old lib (in the classpath) #attachWindow would get ignored without exception + if (lifecycle instanceof LifecycleWrapper /*autom. provides #attachWindow*/ || + lifecycle.getClass().getDeclaredMethod("attachWindow", FacesContext.class) != null) + { + lifecycle.attachWindow(facesContext); + } + } + + private void lazyInit() + { + if (this.initialized == null) + { + init(); + } + } + + private synchronized void init() + { + // switch into paranoia mode + if (initialized == null) + { + if (ClassDeactivationUtils.isActivated(BeforeAfterJsfRequestBroadcaster.class)) + { + delegateWindowHandling = + BeanProvider.getContextualReference(JsfModuleConfig.class).isDelegatedWindowHandlingEnabled(); + } + + initialized = true; + } + } +} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/ClientWindowAdapter.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/ClientWindowAdapter.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/ClientWindowAdapter.java new file mode 100644 index 0000000..b2d3c73 --- /dev/null +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/ClientWindowAdapter.java @@ -0,0 +1,69 @@ +/* + * 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.jsf.impl.scope.window; + +import javax.faces.context.FacesContext; +import javax.faces.lifecycle.ClientWindow; +import java.util.Collections; +import java.util.Map; + +/** + * This adapter supports two use-cases: + * #1: Using the window-handling of DeltaSpike also for JSF internals like state-handling + * #2: Using the window-handling of JSF for DeltaSpike (if the corresponding JSF-config is available) + */ +public class ClientWindowAdapter extends ClientWindow +{ + private final org.apache.deltaspike.jsf.spi.scope.window.ClientWindow window; + + public ClientWindowAdapter(org.apache.deltaspike.jsf.spi.scope.window.ClientWindow window) + { + this.window = window; + } + + public static String getWindowIdFromJsf(FacesContext facesContext) + { + ClientWindow clientWindow = facesContext.getExternalContext().getClientWindow(); + + if (clientWindow != null) + { + return clientWindow.getId(); + } + return null; + } + + @Override + public void decode(FacesContext context) + { + //currently not needed by the window-handling of DeltaSpike + } + + @Override + public String getId() + { + return this.window.getWindowId(FacesContext.getCurrentInstance()); + } + + @Override + public Map<String, String> getQueryURLParameters(FacesContext context) + { + //currently not needed by the window-handling of DeltaSpike + return Collections.emptyMap(); + } +} http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/DefaultClientWindow.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/DefaultClientWindow.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/DefaultClientWindow.java index 3118502..dcc7262 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/DefaultClientWindow.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/scope/window/DefaultClientWindow.java @@ -60,14 +60,10 @@ public class DefaultClientWindow implements ClientWindow public static final String AUTOMATED_ENTRY_POINT_PARAMETER_KEY = "automatedEntryPoint"; /** - * The parameter for the windowId for GET requests - */ - public static final String DELTASPIKE_WINDOW_ID_PARAM = "windowId"; - - /** * The parameter for the windowId for POST requests */ public static final String DELTASPIKE_WINDOW_ID_POST_PARAM = "dsPostWindowId"; + public static final String JSF_WINDOW_ID_POST_PARAM = "javax.faces.ClientWindow"; private static final Logger logger = Logger.getLogger(DefaultClientWindow.class.getName()); @@ -102,12 +98,18 @@ public class DefaultClientWindow implements ClientWindow @Override public String getWindowId(FacesContext facesContext) { - if (ClientWindowRenderMode.NONE.equals(clientWindowConfig.getClientWindowRenderMode(facesContext))) + ClientWindowRenderMode clientWindowRenderMode = clientWindowConfig.getClientWindowRenderMode(facesContext); + if (ClientWindowRenderMode.NONE.equals(clientWindowRenderMode)) { // if this request should not get any window detection then we are done return DEFAULT_WINDOW_ID; } + if (ClientWindowRenderMode.DELEGATED.equals(clientWindowRenderMode)) + { + return ClientWindowAdapter.getWindowIdFromJsf(facesContext); + } + if (facesContext.isPostback()) { // for POST we read the windowId from the WindowIdHolderComponent in our ViewRoot @@ -163,6 +165,11 @@ public class DefaultClientWindow implements ClientWindow { Map<String, String> requestParams = facesContext.getExternalContext().getRequestParameterMap(); String windowId = requestParams.get(DELTASPIKE_WINDOW_ID_POST_PARAM); + + if (windowId == null) + { + windowId = requestParams.get(JSF_WINDOW_ID_POST_PARAM); + } return windowId; } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/modules/jsf/pom.xml ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/pom.xml b/deltaspike/modules/jsf/pom.xml index 214eeab..06a79b3 100644 --- a/deltaspike/modules/jsf/pom.xml +++ b/deltaspike/modules/jsf/pom.xml @@ -55,6 +55,9 @@ <dependency> <groupId>org.apache.myfaces.core</groupId> <artifactId>myfaces-api</artifactId> + <!-- just needed for compiling >optional< classes for jsf 2.2 + jsf 2.0 and 2.1 compatibility is ensured via test-cases --> + <version>${myfaces22.version}</version> <scope>provided</scope> </dependency> </dependencies> http://git-wip-us.apache.org/repos/asf/deltaspike/blob/4a3da405/deltaspike/parent/pom.xml ---------------------------------------------------------------------- diff --git a/deltaspike/parent/pom.xml b/deltaspike/parent/pom.xml index fb9c0ea..6d1a6b8 100644 --- a/deltaspike/parent/pom.xml +++ b/deltaspike/parent/pom.xml @@ -57,6 +57,7 @@ <!-- JSF-2.0 implementations--> <myfaces2.version>2.0.14</myfaces2.version> + <myfaces22.version>2.2.0-beta</myfaces22.version> <myfaces2.version.current>2.1.8</myfaces2.version.current> <mojarra2.version>2.0.3-b03</mojarra2.version>
