/*******************************************************************************
* Copyright (c) 2007 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.seam.ui.internal.project.facet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.DialogPage;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.datamodel.IDataModelListener;
import org.jboss.tools.common.ui.IValidator;
import org.jboss.tools.seam.internal.core.project.facet.SeamValidatorFactory;
/**
* Delegate class used during validation process in wizard dialog. It contains
* map from property name to IValidator instance. It is triggered by property
* change event from any registered property editor
*
* @author eskimo
*
*/
public class DataModelValidatorDelegate implements IDataModelListener {
/**
* Target IDataModel instance
*/
protected IDataModel model = null;
/**
* WizardPage instance that should be validated
*/
protected WizardPage page = null;
/**
* Map from property name to IValidator instance
*/
protected Map<String,IValidator> mapPropToValidator = new HashMap<String,IValidator>();
private List<String> validationOrder= new ArrayList<String>();
/**
*
* @param model
* @param page
*/
public DataModelValidatorDelegate(IDataModel model,WizardPage page) {
this.model = model;
this.page = page;
model.addListener(this);
}
/**
*
* @return
*/
public Map<String, String> validate() {
Map<String, String> errors = new HashMap<String,String>();
return errors;
}
/**
*
*/
public void propertyChanged(DataModelEvent event) {
Display.getDefault().syncExec(new Runnable() {
public void run() {
validateUntillError();
}
});
}
/**
*
*/
public void validateUntillError() {
IStatus message = getFirstValidationError();
if(message == null) {
page.setMessage(null);
page.setErrorMessage(null);
} else {
if(message.getSeverity()==IStatus.ERROR) {
page.setErrorMessage(message.getMessage());
} else {
page.setErrorMessage(null);
page.setMessage(message.getMessage(), DialogPage.WARNING);
}
}
page.setPageComplete(page.getErrorMessage()==null);
}
/**
*
* @return
*/
public IStatus getFirstValidationError() {
IStatus firstWarning = null;
for (String validatorName : validationOrder) {
Map<String,IStatus> errors = getValidator(validatorName).validate(
model.getProperty(validatorName),model);
IStatus message = errors.get(validatorName);
if(message!=null) {
if(message.getSeverity()==IStatus.ERROR) {
return message;
} else if(message.getSeverity()==IStatus.WARNING && firstWarning==null) {
firstWarning = message;
}
}
}
return firstWarning;
}
/**
*
* @param name
* @return
*/
public IValidator getValidator(String name) {
IValidator validator = mapPropToValidator.get(name);
return validator==null?SeamValidatorFactory.NO_ERRORS_VALIDATOR:validator;
}
/**
*
* @param name
* @param validator
*/
public void addValidatorForProperty(String name, IValidator validator) {
mapPropToValidator.put(name, validator);
validationOrder.add(name);
}
}