/*
* 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.api.config;
import java.lang.annotation.Annotation;
import org.apache.deltaspike.core.api.config.DeltaSpikeConfig;
import org.apache.deltaspike.core.util.ClassUtils;
import org.apache.deltaspike.jsf.spi.scope.window.ClientWindowConfig;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Default;
import javax.faces.context.FacesContext;
/**
* Config for all JSF specific configurations.
*/
@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;
private volatile Boolean initialized;
private boolean delegatedWindowHandlingEnabled;
private boolean jsf22Available;
protected JsfModuleConfig()
{
}
/**
* If the initial redirect is enabled, a redirect will be performed for adding the current window-id to the url.
*
* @return true for activating it, false otherwise
*/
public boolean isInitialRedirectEnabled()
{
return true;
}
/**
* Per default all faces-messages are preserved for the next rendering process
* @return true if the messages should be preserved automatically, false otherwise
*/
public boolean isAlwaysKeepMessages()
{
return true;
}
/**
* Per default the current view gets replaced with the error-view (in case of a security-violation).
* For using a redirect it's needed to return true and using Page.NavigationMode.REDIRECT for @View of the
* error-view-config.
* @return true if the navigation-handler should be used in case of a security-violation, false otherwise
*/
public boolean isAlwaysUseNavigationHandlerOnSecurityViolation()
{
return false;
}
/**
* Per default converters get wrapped to restore them properly during a postback (significant without overhead).
* @return true if converters should be handled as std. CDI beans, false otherwise
*/
public boolean isContainerManagedConvertersEnabled()
{
return true;
}
/**
* Per default validators get wrapped to restore them properly during a postback (significant without overhead).
* @return true if validators should be handled as std. CDI beans, false otherwise
*/
public boolean isContainerManagedValidatorsEnabled()
{
return true;
}
/**
* If #initialStateMarked (of the component) returns false, a fallback to full state-saving is possible.
* Therefore it's required to save additional meta-data even with partial state-saving.
* @return false to restrict additional meta-data required for a possible fallback, true otherwise
*/
public boolean isFullStateSavingFallbackEnabled()
{
return true;
}
/**
* If the window-handling of JSF 2.2+ is enabled,
* {@link org.apache.deltaspike.jsf.spi.scope.window.ClientWindowConfig.ClientWindowRenderMode#DELEGATED}
* will be returned. In all other cases <code>null</code> gets returned as application wide default value.
* That leads to a default-handling per session (which includes logic for handling bots,...)
* @return application-default for the window-mode
*/
public ClientWindowConfig.ClientWindowRenderMode getDefaultWindowMode()
{
lazyInit();
if (this.delegatedWindowHandlingEnabled)
{
return ClientWindowConfig.ClientWindowRenderMode.DELEGATED;
}
return null;
}
/**
* Defines the {@link javax.enterprise.Qualifier} which will be used to fire the
* {@link org.apache.deltaspike.core.api.exception.control.event.ExceptionToCatchEvent}
* for unhandled JSF exceptions.
*
* @return the {@link javax.enterprise.Qualifier}.
*/
public Class<? extends Annotation> getExceptionQualifier()
{
return Default.class;
}
public boolean isAllowPostRequestWithoutDoubleSubmitPrevention()
{
return true;
}
public boolean isJsf22Available()
{
lazyInit();
return this.jsf22Available;
}
private void lazyInit()
{
if (this.initialized == null)
{
init();
}
}
protected synchronized void init()
{
if (this.initialized == null)
{
this.jsf22Available = ClassUtils.tryToLoadClassForName(CLIENT_WINDOW_CLASS_NAME) != null;
if (!this.jsf22Available)
{
this.delegatedWindowHandlingEnabled = false;
}
else
{
FacesContext facesContext = FacesContext.getCurrentInstance();
// can happen in case of a very simple test-setup without a mocked jsf container
if (facesContext == null)
{
this.delegatedWindowHandlingEnabled = false;
}
else
{
String initParam = facesContext.getExternalContext().getInitParameter(CLIENT_WINDOW_CONFIG_KEY);
this.delegatedWindowHandlingEnabled =
!(initParam == null || "none".equalsIgnoreCase(initParam.trim()));
}
}
this.initialized = true;
}
}
}