/*******************************************************************************
* Copyright (c) 2009 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.common.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.jboss.tools.common.CommonPlugin;
/**
* @author Alexey Kazakov
*/
public class ValidationContext implements IValidationContextManager {
private Set<ValidationResourceRegister> validationResourceRegisters;
private Map<IValidator, IValidatingProjectTree> projectTree = new HashMap<IValidator, IValidatingProjectTree>();
static List<IConfigurationElement> ALL_VALIDATORS;
protected List<IValidator> validators = new ArrayList<IValidator>();
private Map<IValidator, Set<IProject>> validatedProjects = new HashMap<IValidator, Set<IProject>>();
public ValidationContext(IProject project) {
init(project);
}
synchronized static void inintConfigurationElements() {
if(ALL_VALIDATORS == null) {
// Load all the validators
ALL_VALIDATORS = new ArrayList<IConfigurationElement>();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint = registry.getExtensionPoint(IValidator.EXTENSION_POINT_ID);
if (extensionPoint != null) {
IExtension[] extensions = extensionPoint.getExtensions();
for (int i=0; i<extensions.length; i++) {
IExtension extension = extensions[i];
IConfigurationElement[] elements = extension.getConfigurationElements();
for(int j=0; j<elements.length; j++) {
ALL_VALIDATORS.add(elements[j]);
}
}
}
}
}
public static void loadValidatorByProblemType(String problemType){
inintConfigurationElements();
for (IConfigurationElement element : ALL_VALIDATORS) {
String pt = element.getAttribute("problemType"); //$NON-NLS-1$
if(problemType.equals(pt)){
createValidator(element, problemType);
}
}
}
private static IValidator createValidator(IConfigurationElement element, String problemType){
try {
IValidator validator = (IValidator)element.createExecutableExtension("class"); //$NON-NLS-1$
validator.setProblemType(problemType);
validator.registerPreferenceInfo();
return validator;
} catch (CoreException e) {
CommonPlugin.getDefault().logError(e);
}
return null;
}
protected List<IValidator> getAllValidators(IProject project) {
projectTree.clear();
validators.clear();
validationResourceRegisters = null;
inintConfigurationElements();
List<IValidator> dependentValidators = new ArrayList<IValidator>();
List<IValidator> allValidators = new ArrayList<IValidator>();
for (IConfigurationElement element : ALL_VALIDATORS) {
String problemType = element.getAttribute("problemType");
if(problemType != null){
IValidator validator = createValidator(element, problemType);
if(validator != null){
String dependent = element.getAttribute("dependent"); //$NON-NLS-1$
if(Boolean.parseBoolean(dependent)) {
dependentValidators.add(validator);
} else {
allValidators.add(validator);
}
}
}else{
CommonPlugin.getDefault().logError("problemType is not found for validator class: "+
element.getAttribute("class")+
" and validator id: "+
element.getAttribute("id")+
", problemType must be set as a attribute of element validator in org.jboss.tools.common.validation.validator extension point");
}
}
// We should add all the dependent validators (e.g. EL validator) to the very end of the list.
allValidators.addAll(dependentValidators);
return allValidators;
}
public void init(IProject project) {
List<IValidator> allValidators = getAllValidators(project);
// Init context for given project.
for (IValidator validator : allValidators) {
if(shouldValidate(validator, project)) {
IValidatingProjectTree prTree = validator.getValidatingProjects(project);
if(prTree!=null) {
validators.add(validator);
projectTree.put(validator, prTree);
}
}
}
}
protected boolean shouldValidate(IValidator validator, IProject project) {
return validator.shouldValidate(project);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#isObsolete()
*/
public boolean isObsolete() {
if(validationResourceRegisters!=null) {
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
if(register.isObsolete()) {
return true;
}
}
}
return false;
}
private Set<ValidationResourceRegister> getValidationResourceRegisters() {
if(validationResourceRegisters==null) {
validationResourceRegisters = new HashSet<ValidationResourceRegister>();
if(!projectTree.isEmpty()) {
validationResourceRegisters = new HashSet<ValidationResourceRegister>();
// Initialize the register
for (IValidatingProjectTree tree : projectTree.values()) {
if(!tree.getBrunches().isEmpty()) {
for (IValidatingProjectSet brunch : tree.getBrunches().values()) {
IProjectValidationContext context = brunch.getRootContext();
ValidationResourceRegister register = context.getValidationResourceRegister();
if(register==null) {
register = new ValidationResourceRegister();
context.setValidationResourceRegister(register);
}
validationResourceRegisters.add(register);
}
}
}
}
}
return validationResourceRegisters;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.common.validation.IValidationContextManager#setValidationResourceRegisters(java.util.Set)
*/
public void setValidationResourceRegisters(
Set<ValidationResourceRegister> validationResourceRegisters) {
this.validationResourceRegisters = validationResourceRegisters;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#getValidators()
*/
public List<IValidator> getValidators() {
return validators;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#clearRegisteredFiles()
*/
public void clearRegisteredFiles() {
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
register.clear();
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#getRemovedFiles()
*/
public Set<IFile> getRemovedFiles() {
Set<IFile> removed = new HashSet<IFile>();
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
removed.addAll(register.getRemovedFiles());
}
return removed;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#addRemovedFile(org.eclipse.core.resources.IFile)
*/
public void addRemovedFile(IFile file) {
for (IValidatingProjectTree tree : projectTree.values()) {
tree.addProject(file.getProject());
}
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
register.addRemovedFile(file);
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#getRegisteredFiles()
*/
public Set<IFile> getRegisteredFiles() {
Set<IFile> registered = new HashSet<IFile>();
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
registered.addAll(register.getRegisteredFiles());
}
return registered;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContext#registerFile(org.eclipse.core.resources.IFile)
*/
public void registerFile(IFile file) {
Set<ValidationResourceRegister> registers = getValidationResourceRegisters();
for (ValidationResourceRegister register : registers) {
register.registerFile(file);
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#getValidatingProjectTree(org.jboss.tools.jst.web.kb.validation.IValidator)
*/
public IValidatingProjectTree getValidatingProjectTree(IValidator validator) {
return projectTree.get(validator);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#addProject(org.eclipse.core.resources.IProject)
*/
public void addProject(IProject project) {
for (IValidator validator : validators) {
projectTree.get(validator).addProject(project);
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#getRootProjects()
*/
public Set<IProject> getRootProjects() {
Set<IProject> roots = new HashSet<IProject>();
for (IValidatingProjectTree tree : projectTree.values()) {
for (IValidatingProjectSet brunch : tree.getBrunches().values()) {
roots.add(brunch.getRootProject());
}
}
return roots;
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#clearAllResourceLinks()
*/
public void clearAllResourceLinks(Set<IProject> rootProjects) {
Collection<IValidatingProjectTree> trees = projectTree.values();
for (IProject rootProject : rootProjects) {
for (IValidatingProjectTree tree : trees) {
IValidatingProjectSet brunch = tree.getBrunches().get(rootProject);
if(brunch!=null) {
brunch.getRootContext().clearAll();
}
}
}
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#addValidatedProject(org.jboss.tools.jst.web.kb.validation.IValidator, org.eclipse.core.resources.IProject)
*/
public void addValidatedProject(IValidator validator, IProject project) {
Set<IProject> projects = validatedProjects.get(validator);
if(projects==null) {
projects = new HashSet<IProject>();
validatedProjects.put(validator, projects);
}
projects.add(project);
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#clearValidatedProjectsList()
*/
public void clearValidatedProjectsList() {
validatedProjects.clear();
}
/*
* (non-Javadoc)
* @see org.jboss.tools.jst.web.kb.validation.IValidationContextManager#projectHasBeenValidated(org.jboss.tools.jst.web.kb.validation.IValidator, org.eclipse.core.resources.IProject)
*/
public boolean projectHasBeenValidated(IValidator validator, IProject project) {
Set<IProject> projects = validatedProjects.get(validator);
return projects==null?false:projects.contains(project);
}
}