/*******************************************************************************
* 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.Map;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.extension.AbstractDefinitionContextExtension;
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.CDISeamSolderConstants;
import org.jboss.tools.cdi.seam.solder.core.Version;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class GenericBeanDefinitionContext extends AbstractDefinitionContextExtension {
Map<String, GenericConfiguration> genericConfiguartions = new HashMap<String, GenericConfiguration>();
Version version;
public GenericBeanDefinitionContext(Version version) {
this.version = version;
}
public Version getVersion() {
return version;
}
protected AbstractDefinitionContextExtension copy(boolean clean) {
GenericBeanDefinitionContext copy = new GenericBeanDefinitionContext(version);
copy.root = root;
if(!clean) {
copy.genericConfiguartions.putAll(genericConfiguartions);
//
}
return copy;
}
@Override
protected void doApplyWorkingCopy() {
genericConfiguartions = ((GenericBeanDefinitionContext)workingCopy).genericConfiguartions;
for (GenericConfiguration c: genericConfiguartions.values()) {
if(c.getGenericTypeDefinition() == null) {
for (TypeDefinition d: c.getGenericBeans()) {
//Do last minute correction. This is a wrong generic bean, let it be a usual bean to be validated.
d.unveto();
}
}
}
//
}
@Override
public void clean() {
genericConfiguartions.clear();
//
}
@Override
public void clean(IPath path) {
for (GenericConfiguration c: genericConfiguartions.values()) {
c.clear(path);
}
}
@Override
public void clean(String typeName) {
genericConfiguartions.remove(typeName);
for (GenericConfiguration c: genericConfiguartions.values()) {
c.clear(typeName);
}
//
}
@Override
public void computeAnnotationKind(AnnotationDefinition annotation) {
if(annotation.isAnnotationPresent(version.getGenericTypeAnnotationTypeName())) {
annotation.setExtendedKind(CDISeamSolderConstants.GENERIC_ANNOTATION_KIND);
String qn = annotation.getType().getFullyQualifiedName();
GenericConfiguration c = getGenericConfiguration(qn);
c.setGenericTypeDefinition(annotation, this);
if(!annotation.getType().isBinary()) {
IPath newPath = annotation.getType().getResource().getFullPath();
Set<IPath> ps = c.getInvolvedTypes();
for (IPath p: ps) {
getRootContext().addDependency(p, newPath);
getRootContext().addDependency(newPath, p);
}
ps.add(newPath);
}
}
}
public boolean isGenericTypeAnnotation(IType type) {
return (genericConfiguartions.containsKey(type.getFullyQualifiedName()));
}
public Map<String, GenericConfiguration> getGenericConfigurations() {
return genericConfiguartions;
}
public GenericConfiguration getGenericConfiguration(String typeName) {
GenericConfiguration result = genericConfiguartions.get(typeName);
if(result == null) {
result = new GenericConfiguration(typeName);
genericConfiguartions.put(typeName, result);
}
return result;
}
public boolean isGenericBean(String typeName) {
for (GenericConfiguration c: genericConfiguartions.values()) {
Set<TypeDefinition> bs = c.getGenericBeans();
for (TypeDefinition d: bs) {
if(typeName.equals(d.getType().getFullyQualifiedName())) {
return true;
}
}
}
return false;
}
}