/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributor:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.cdi.internal.core.impl;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.IBuiltInBean;
import org.jboss.tools.cdi.core.IScope;
import org.jboss.tools.cdi.core.WeldConstants;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
import org.jboss.tools.common.java.impl.AnnotationLiteral;
/**
* 3.6. Additional built-in beans.
* A Java EE or embeddable EJB container must provide the following built-in beans, all of which
* have qualifier @Default, scope @ Dependent, and have no bean EL name:
* UserTransaction, Principal, VlidationFactory, Validator, BeanManager.
*
* 6.7.5. The Conversation interface
* The container provides a built-in bean with bean type Conversation, scope @RequestScoped, and qualifier @Default,
* named javax.enterprise.context.conversation.
*
* @author Viacheslav Kabanovich
*
*/
public class BuiltInBeanFactory {
public static final Set<String> BUILT_IN = new HashSet<String>();
static final Map<String, BuiltInBeanInfo> BUILT_IN_INFO = new HashMap<String, BuiltInBeanInfo>();
static {
BUILT_IN.add(CDIConstants.USER_TRANSACTION_TYPE_NAME);
BUILT_IN.add(CDIConstants.PRINCIPAL_TYPE_NAME);
BUILT_IN.add(CDIConstants.VALIDATION_FACTORY_TYPE_NAME);
BUILT_IN.add(CDIConstants.VALIDATOR_TYPE_NAME);
BUILT_IN.add(CDIConstants.BEAN_MANAGER_TYPE_NAME);
BUILT_IN.add(CDIConstants.CONVERSATION_TYPE_NAME);
BUILT_IN.add(CDIConstants.INJECTIONPOINT_TYPE_NAME);
BUILT_IN.add(CDIConstants.HTTP_SESSION_TYPE_NAME);
BUILT_IN.add(CDIConstants.HTTP_SERVLET_REQUEST_TYPE_NAME);
BUILT_IN.add(CDIConstants.JMS_CONTEXT_TYPE_NAME);
BUILT_IN.add(WeldConstants.DEPENDENT_CONTEXT_TYPE);
addInfo(WeldConstants.SINGLETON_CONTEXT_TYPE,
CDIConstants.SINGLETON_SCOPED_ANNOTATION_TYPE_NAME,
null);
addInfo(WeldConstants.APPLICATION_CONTEXT_TYPE,
CDIConstants.APPLICATION_SCOPED_ANNOTATION_TYPE_NAME,
null);
addInfo(WeldConstants.REQUEST_CONTEXT_TYPE,
CDIConstants.REQUEST_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.UNBOUND_QUALIFIER_TYPE).defaultQualifier = false;
addInfo(WeldConstants.BOUND_REQUEST_CONTEXT_TYPE,
CDIConstants.REQUEST_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.BOUND_QUALIFIER_TYPE);
addInfo(WeldConstants.HTTP_REQUEST_CONTEXT_TYPE,
CDIConstants.REQUEST_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.HTTP_QUALIFIER_TYPE);
addInfo(WeldConstants.EJB_REQUEST_CONTEXT_TYPE,
CDIConstants.REQUEST_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.EJB_QUALIFIER_TYPE);
addInfo(WeldConstants.BOUND_SESSION_CONTEXT_TYPE,
CDIConstants.SESSION_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.BOUND_QUALIFIER_TYPE);
addInfo(WeldConstants.HTTP_SESSION_CONTEXT_TYPE,
CDIConstants.SESSION_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.HTTP_QUALIFIER_TYPE);
addInfo(WeldConstants.BOUND_CONVERSATION_CONTEXT_TYPE,
CDIConstants.CONVERSATION_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.BOUND_QUALIFIER_TYPE);
addInfo(WeldConstants.HTTP_CONVERSATION_CONTEXT_TYPE,
CDIConstants.CONVERSATION_SCOPED_ANNOTATION_TYPE_NAME,
WeldConstants.HTTP_QUALIFIER_TYPE);
}
static BuiltInBeanInfo addInfo(String type, String scopeName, String qualifierName) {
BUILT_IN.add(type);
BuiltInBeanInfo info = new BuiltInBeanInfo(scopeName, qualifierName);
BUILT_IN_INFO.put(type, info);
return info;
}
public static boolean isBuiltIn(IType type) {
return type != null && BUILT_IN.contains(type.getFullyQualifiedName());
}
public static ClassBean newClassBean(CDIProject project, TypeDefinition def) {
ClassBean result = null;
String typeName = def.getType().getFullyQualifiedName();
if(typeName.equals(CDIConstants.CONVERSATION_TYPE_NAME)) {
result = new ConversationBuiltInBean();
} else {
BuiltInBean b = new BuiltInBean();
BuiltInBeanInfo info = BUILT_IN_INFO.get(typeName);
if(info != null) {
if(info.scopeName != null) {
b.scopeName = info.scopeName;
}
if(info.qualifierName != null) {
addAnnotation(project, def, info.qualifierName);
if(info.defaultQualifier) {
addAnnotation(project, def, CDIConstants.DEFAULT_QUALIFIER_TYPE_NAME);
}
}
}
result = b;
}
result.setParent(project);
result.setDefinition(def);
return result;
}
private static void addAnnotation(CDIProject project, TypeDefinition def, String typeName) {
if(def.getAnnotation(typeName) == null) {
IType t = project.getNature().getType(typeName);
if(t != null) {
AnnotationLiteral l = new AnnotationLiteral(project.getResource(), 0, 0, null, 0, t);
def.addAnnotation(l, project.getNature().getDefinitions());
}
}
}
}
class ConversationBuiltInBean extends ClassBean implements IBuiltInBean {
ConversationBuiltInBean() {
}
public String getName() {
return "javax.enterprise.context.conversation";
}
public IScope getScope() {
return getCDIProject().getScope(CDIConstants.REQUEST_SCOPED_ANNOTATION_TYPE_NAME);
}
}
class BuiltInBean extends ClassBean implements IBuiltInBean {
String scopeName = CDIConstants.DEPENDENT_ANNOTATION_TYPE_NAME;
public BuiltInBean() {
}
public IScope getScope() {
return getCDIProject().getScope(scopeName);
}
public String getName() {
return null;
}
}
class BuiltInBeanInfo {
String scopeName;
String qualifierName;
boolean defaultQualifier = true;
BuiltInBeanInfo(String scopeName, String qualifierName) {
this.scopeName = scopeName;
this.qualifierName = qualifierName;
}
public String getScopeName() {
return scopeName;
}
public String getQualifierName() {
return qualifierName;
}
}