/******************************************************************************* * 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 * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.seam.solder.core.generic; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.JavaModelException; import org.jboss.tools.cdi.core.IQualifierDeclaration; import org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition; import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition; import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition; import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderCorePlugin; import org.jboss.tools.common.java.IAnnotationDeclaration; import org.jboss.tools.common.java.IParametedType; import org.jboss.tools.common.util.EclipseJavaUtil; /** * This class collects objects bound by one generic configuration: * 1) Generic configuration annotation - annotation type annotatid with GenericType annotation; * 2) Generic configuration type - type as declared by value of GenericType annotation; * 3) Generic configuration points - beans annotated with generic configuration annotation; * 4) Generic beans - beans annotated with GenericConfiguration annotation; * * @author Viacheslav Kabanovich * */ public class GenericConfiguration { /** * Generic configuration annotation type name. */ String genericTypeName; /** * Generic configuration annotation type definition. */ AnnotationDefinition genericType; /** * Generic configuration type declared by generic configuration annotation. */ IParametedType configType; /** * Generic Configuration point is a bean annotated with 'generic configuration annotation'. * This field maps definitions of such beans to their qualifiers for quick reference. */ Map<AbstractMemberDefinition, List<IQualifierDeclaration>> genericConfigurationPoints = new HashMap<AbstractMemberDefinition, List<IQualifierDeclaration>>(); /** * Generic Bean is bean class annotated with GenericConfiguration annotation. */ Set<TypeDefinition> genericBeans = new HashSet<TypeDefinition>(); Set<IPath> involvedResources = new HashSet<IPath>(); public GenericConfiguration(String genericTypeName) { this.genericTypeName = genericTypeName; } public void setGenericTypeDefinition(AnnotationDefinition genericType, GenericBeanDefinitionContext context) { this.genericType = genericType; IAnnotationDeclaration g = genericType.getAnnotation(context.getVersion().getGenericTypeAnnotationTypeName()); Object o = g.getMemberValue(null); if(o != null) { String configTypeName = EclipseJavaUtil.resolveType(genericType.getType(), o.toString()); try { configType = context.getRootContext().getProject().getTypeFactory().getParametedType(genericType.getType(), "Q" + o.toString() + ";"); } catch (JavaModelException e) { CDISeamSolderCorePlugin.getDefault().logError(e); } } } public void clear(IPath path) { involvedResources.remove(path); } public void clear(String typeName) { Iterator<AbstractMemberDefinition> it = genericConfigurationPoints.keySet().iterator(); while(it.hasNext()) { if(typeName.equals(it.next().getTypeDefinition().getQualifiedName())) { it.remove(); } } Iterator<TypeDefinition> it2 = genericBeans.iterator(); while(it2.hasNext()) { if(typeName.equals(it2.next().getTypeDefinition().getQualifiedName())) { it2.remove(); } } } /** * Returns map of definition to qualifiers for generic configuration points. * * @return map of definition to qualifiers for generic configuration points */ public Map<AbstractMemberDefinition, List<IQualifierDeclaration>> getGenericConfigurationPoints() { return genericConfigurationPoints; } public String getGenericTypeName() { return genericTypeName; } public AnnotationDefinition getGenericTypeDefinition() { return genericType; } public IParametedType getConfigType() { return configType; } /** * Returns set of generic beans. * * @return set of generic beans */ public Set<TypeDefinition> getGenericBeans() { return genericBeans; } public Set<IPath> getInvolvedTypes() { return involvedResources; } }