/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.service.instance.validation.internal;
import java.util.concurrent.CopyOnWriteArraySet;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import eu.esdihumboldt.hale.common.instance.extension.validation.report.InstanceValidationReport;
import eu.esdihumboldt.hale.common.instance.model.DataSet;
import eu.esdihumboldt.hale.common.instance.model.InstanceCollection;
import eu.esdihumboldt.hale.common.instancevalidator.InstanceValidator;
import eu.esdihumboldt.hale.ui.HaleUI;
import eu.esdihumboldt.hale.ui.service.instance.InstanceService;
import eu.esdihumboldt.hale.ui.service.instance.InstanceServiceAdapter;
import eu.esdihumboldt.hale.ui.service.instance.InstanceServiceListener;
import eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationListener;
import eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationService;
import eu.esdihumboldt.hale.ui.service.report.ReportService;
/**
* Service that listens to the instance service and validates instances.
*
* @author Kai Schwierczek
*/
public class InstanceValidationServiceImpl extends InstanceServiceAdapter
implements InstanceValidationService {
private final InstanceService instanceService;
private final ReportService reportService;
private InstanceValidationJob validationJob;
private boolean liveValidation = true; // TODO store somewhere? project?
private final CopyOnWriteArraySet<InstanceValidationListener> listeners = new CopyOnWriteArraySet<InstanceValidationListener>();
/**
* Creates the instance validation service.
*
* @param instanceService the instance service to use
* @param reportService the report service to use
*/
public InstanceValidationServiceImpl(InstanceService instanceService,
ReportService reportService) {
this.instanceService = instanceService;
this.reportService = reportService;
instanceService.addListener(this);
}
/**
* @see InstanceServiceListener#datasetChanged(DataSet)
*/
@Override
public void datasetChanged(DataSet type) {
// validate transformed instances
if (type == DataSet.TRANSFORMED && liveValidation) {
final InstanceCollection instances = instanceService.getInstances(DataSet.TRANSFORMED);
if (instances.isEmpty())
return;
validationJob = new InstanceValidationJob(instances);
validationJob.schedule();
validationJob.addJobChangeListener(new JobChangeAdapter() {
@Override
public void done(IJobChangeEvent event) {
validationJob = null;
}
});
}
}
/**
* @see InstanceServiceAdapter#datasetAboutToChange(DataSet)
*/
@Override
public void datasetAboutToChange(DataSet type) {
if (type == DataSet.TRANSFORMED) {
if (validationJob != null)
validationJob.cancel();
}
}
/**
* A Job that runs the instance validation.
*
* @author Kai Schwierczek
*/
private class InstanceValidationJob extends Job {
private InstanceCollection instances;
private final InstanceValidator validator;
/**
* Default constructor.
*
* @param instances the instances to validate
*/
public InstanceValidationJob(InstanceCollection instances) {
super("Instance validation");
this.instances = instances;
this.validator = InstanceValidator.createDefaultValidator(HaleUI.getServiceProvider());
}
/**
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
protected IStatus run(IProgressMonitor monitor) {
InstanceValidationReport report = validator.validateInstances(instances, monitor);
if (!monitor.isCanceled()) {
reportService.addReport(report);
for (InstanceValidationListener listener : listeners) {
listener.instancesValidated(report);
}
}
else {
return Status.CANCEL_STATUS;
}
instances = null;
monitor.done();
return Status.OK_STATUS;
}
}
/**
* @see eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationService#addListener(eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationListener)
*/
@Override
public void addListener(InstanceValidationListener listener) {
listeners.add(listener);
}
/**
* @see eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationService#removeListener(eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationListener)
*/
@Override
public void removeListener(InstanceValidationListener listener) {
listeners.remove(listener);
}
/**
* @see eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationService#isValidationEnabled()
*/
@Override
public boolean isValidationEnabled() {
return liveValidation;
}
/**
* @see eu.esdihumboldt.hale.ui.service.instance.validation.InstanceValidationService#setValidationEnabled(boolean)
*/
@Override
public void setValidationEnabled(boolean enable) {
if (!enable) {
if (validationJob != null)
validationJob.cancel();
}
liveValidation = enable;
}
}