package org.jboss.tools.cdi.deltaspike.core;
import java.util.HashMap;
import java.util.HashSet;
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;
public class DeltaspikeSecurityDefinitionContext extends AbstractDefinitionContextExtension implements DeltaspikeConstants {
Map<String, DeltaspikeSecurityBindingConfiguration> securityBindingConfigurations = new HashMap<String, DeltaspikeSecurityBindingConfiguration>();
DeltaspikeSecurityBindingConfiguration allAuthorizerMethods = new DeltaspikeSecurityBindingConfiguration(""); //$NON-NLS-1$
@Override
protected AbstractDefinitionContextExtension copy(boolean clean) {
DeltaspikeSecurityDefinitionContext copy = new DeltaspikeSecurityDefinitionContext();
copy.root = root;
if(!clean) {
copy.securityBindingConfigurations.putAll(securityBindingConfigurations);
copy.allAuthorizerMethods = allAuthorizerMethods;
}
return copy;
}
@Override
protected void doApplyWorkingCopy() {
DeltaspikeSecurityDefinitionContext copy = (DeltaspikeSecurityDefinitionContext)workingCopy;
securityBindingConfigurations = copy.securityBindingConfigurations;
allAuthorizerMethods = copy.allAuthorizerMethods;
}
@Override
public void clean() {
securityBindingConfigurations.clear();
allAuthorizerMethods.getAuthorizerMembers().clear();
}
@Override
public void clean(IPath path) {
for (DeltaspikeSecurityBindingConfiguration c: securityBindingConfigurations.values()) {
c.clear(path);
}
allAuthorizerMethods.clear(path);
}
@Override
public void clean(String typeName) {
securityBindingConfigurations.remove(typeName);
for (DeltaspikeSecurityBindingConfiguration c: securityBindingConfigurations.values()) {
c.clear(typeName);
}
allAuthorizerMethods.clear(typeName);
}
@Override
public void computeAnnotationKind(AnnotationDefinition annotation) {
if(SECURES_ANNOTATION_TYPE_NAME.equals(annotation.getType().getFullyQualifiedName())) {
annotation.setExtendedKind(SECURES_ANNOTATION_KIND);
} else if(SECURED_ANNOTATION_TYPE_NAME.equals(annotation.getType().getFullyQualifiedName())) {
annotation.setExtendedKind(SECURES_ANNOTATION_KIND);
} else if(annotation.isAnnotationPresent(SECURITY_BINDING_ANNOTATION_TYPE_NAME)) {
annotation.setExtendedKind(SECURITY_BINDING_ANNOTATION_KIND);
String qn = annotation.getType().getFullyQualifiedName();
DeltaspikeSecurityBindingConfiguration c = getConfiguration(qn);
c.setSecurityBundingTypeDefinition(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 isSecurityBindingTypeAnnotation(IType type) {
return (securityBindingConfigurations.containsKey(type.getFullyQualifiedName()));
}
public Map<String, DeltaspikeSecurityBindingConfiguration> getConfigurations() {
return securityBindingConfigurations;
}
public DeltaspikeSecurityBindingConfiguration getConfiguration(String typeName) {
DeltaspikeSecurityBindingConfiguration result = securityBindingConfigurations.get(typeName);
if(result == null) {
result = new DeltaspikeSecurityBindingConfiguration(typeName);
securityBindingConfigurations.put(typeName, result);
}
return result;
}
public Set<DeltaspikeAuthorityMethod> getAuthorityMethods(IPath path) {
Set<DeltaspikeAuthorityMethod> result = new HashSet<DeltaspikeAuthorityMethod>();
for(DeltaspikeAuthorityMethod m: allAuthorizerMethods.getAuthorizerMembers()) {
if(path.equals(m.getPath())) {
result.add(m);
}
}
return result;
}
}