/*
* 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.wicket.cdi;
import javax.enterprise.inject.spi.BeanManager;
import org.apache.wicket.Application;
import org.apache.wicket.request.cycle.RequestCycleListenerCollection;
import org.apache.wicket.util.lang.Args;
import org.jboss.seam.conversation.spi.SeamConversationContextFactory;
/**
* Configures CDI integration
*
* @author igor
*
*/
public class CdiConfiguration
{
private BeanManager beanManager;
private IConversationPropagation propagation = ConversationPropagation.NONBOOKMARKABLE;
private INonContextualManager nonContextualManager;
private boolean injectComponents = true;
private boolean injectApplication = true;
private boolean injectSession = true;
private boolean injectBehaviors = true;
private boolean autoConversationManagement = false;
/**
* Constructor
*
* @param beanManager
*/
public CdiConfiguration(BeanManager beanManager)
{
Args.notNull(beanManager, "beanManager");
this.beanManager = beanManager;
nonContextualManager = new NonContextualManager(beanManager);
}
/**
* Gets the configured bean manager
*
* @return bean manager or {@code null} if none
*/
public BeanManager getBeanManager()
{
return beanManager;
}
public IConversationPropagation getPropagation()
{
return propagation;
}
/**
* Checks if auto conversation management is enabled. See
* {@link #setAutoConversationManagement(boolean)} for details.
*/
public boolean isAutoConversationManagement()
{
return autoConversationManagement;
}
/**
* Toggles automatic conversation management feature.
*
* Automatic conversation management controls the lifecycle of the conversation based on
* presence of components implementing the {@link ConversationalComponent} interface. If such
* components are found in the page a conversation is marked persistent, and if they are not the
* conversation is marked transient. This greatly simplifies the management of conversation
* lifecycle.
*
* Sometimes it is necessary to manually control the application. For these cases, once a
* conversation is started {@link AutoConversation} bean can be used to mark the conversation as
* manually-managed.
*
* @param enabled
*
* @return {@code this} for easy chaining
*/
public CdiConfiguration setAutoConversationManagement(boolean enabled)
{
autoConversationManagement = enabled;
return this;
}
public CdiConfiguration setPropagation(IConversationPropagation propagation)
{
this.propagation = propagation;
return this;
}
public INonContextualManager getNonContextualManager()
{
return nonContextualManager;
}
public CdiConfiguration setNonContextualManager(INonContextualManager nonContextualManager)
{
this.nonContextualManager = nonContextualManager;
return this;
}
public boolean isInjectComponents()
{
return injectComponents;
}
public CdiConfiguration setInjectComponents(boolean injectComponents)
{
this.injectComponents = injectComponents;
return this;
}
public boolean isInjectApplication()
{
return injectApplication;
}
public CdiConfiguration setInjectApplication(boolean injectApplication)
{
this.injectApplication = injectApplication;
return this;
}
public boolean isInjectSession()
{
return injectSession;
}
public CdiConfiguration setInjectSession(boolean injectSession)
{
this.injectSession = injectSession;
return this;
}
public boolean isInjectBehaviors()
{
return injectBehaviors;
}
public CdiConfiguration setInjectBehaviors(boolean injectBehaviors)
{
this.injectBehaviors = injectBehaviors;
return this;
}
/**
* Configures the specified application
*
* @param application
* @return The CdiContainer
*/
public CdiContainer configure(Application application)
{
if (beanManager == null)
{
throw new IllegalStateException(
"Configuration does not have a BeanManager instance configured");
}
CdiContainer container = new CdiContainer(beanManager, nonContextualManager);
container.bind(application);
RequestCycleListenerCollection listeners = new RequestCycleListenerCollection();
application.getRequestCycleListeners().add(listeners);
// enable conversation propagation
if (getPropagation() != ConversationPropagation.NONE)
{
listeners.add(new ConversationPropagator(application, container, getPropagation(),
autoConversationManagement));
application.getComponentPreOnBeforeRenderListeners().add(
new ConversationExpiryChecker(container));
SeamConversationContextFactory.setDisableNoopInstance(true);
}
// enable detach event
listeners.add(new DetachEventEmitter(container));
// inject application instance
if (isInjectApplication())
{
container.getNonContextualManager().postConstruct(application);
}
// enable injection of various framework components
if (isInjectSession())
{
application.getSessionListeners().add(new SessionInjector(container));
}
if (isInjectComponents())
{
application.getComponentInstantiationListeners().add(new ComponentInjector(container));
}
if (isInjectBehaviors())
{
application.getBehaviorInstantiationListeners().add(new BehaviorInjector(container));
}
// enable cleanup
application.getApplicationListeners().add(
new CdiShutdownCleaner(beanManager, isInjectApplication()));
return container;
}
}