/******************************************************************************* * Copyright (c) 2008 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.smooks.configuration.actions; import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.util.Diagnostic; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator; import org.jboss.tools.smooks.configuration.validate.SmooksMarkerHelper; import org.jboss.tools.smooks.configuration.validate.SmooksModelValidator; /** * @author Dart (dpeng@redhat.com) * */ public class ValidateSmooksAction extends Action { private Resource resource = null; private EditingDomain editingDomain; private SmooksModelValidator validator = null; private SmooksMarkerHelper markerHelper = new SmooksMarkerHelper(); @Override public void run() { final Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); IRunnableWithProgress runnableWithProgress = new IRunnableWithProgress() { public void run(final IProgressMonitor progressMonitor) throws InvocationTargetException, InterruptedException { try { List<Diagnostic> lists = validate(progressMonitor); Resource resource = editingDomain.getResourceSet().getResources().get(0); if (resource != null) { markerHelper.deleteMarkers(resource); } for (Iterator<?> iterator = lists.iterator(); iterator.hasNext();) { final Diagnostic diagnostic = (Diagnostic) iterator.next(); shell.getDisplay().asyncExec(new Runnable() { public void run() { if (progressMonitor.isCanceled()) { handleDiagnostic(Diagnostic.CANCEL_INSTANCE); } else { handleDiagnostic(diagnostic); } } }); } } finally { progressMonitor.done(); } } }; if (markerHelper != null) { runnableWithProgress = markerHelper.getWorkspaceModifyOperation(runnableWithProgress); } try { // This runs the operation, and shows progress. // (It appears to be a bad thing to fork this onto another thread.) // new ProgressMonitorDialog(shell).run(true, true, runnableWithProgress); } catch (Exception exception) { SmooksConfigurationActivator.getDefault().log(exception); } } protected void handleDiagnostic(Diagnostic diagnostic) { if (diagnostic.getSeverity() == Diagnostic.OK) { return; } else { } if (markerHelper != null) { if (resource != null) { for (Diagnostic childDiagnostic : diagnostic.getChildren()) { markerHelper.createMarkers(resource, childDiagnostic); } } } } protected List<Diagnostic> validate(IProgressMonitor progressMonitor) { if (resource != null && editingDomain != null) { validator = new SmooksModelValidator(resource.getContents(), editingDomain); return validator.validate(progressMonitor); } return Collections.emptyList(); } public Resource getResource() { return resource; } public void setResource(Resource resource) { this.resource = resource; } public EditingDomain getEditingDomain() { return editingDomain; } public void setEditingDomain(EditingDomain editingDomain) { this.editingDomain = editingDomain; } }