blob: 622f26c907a95e947bd3ae64a9d9622d51b594bd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 by SAP AG, Walldorf.
* All rights reserved. This program and the accompanying materials
* are 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:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.integration.validation;
import java.util.Collection;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jst.ws.jaxws.dom.integration.internal.plugin.DomIntegrationPlugin;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.CustomDomItemProviderAdapterFactory;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.DOMAdapterFactoryLabelProvider;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.ISEIChildList;
import org.eclipse.jst.ws.jaxws.dom.integration.navigator.IWebServiceChildList;
import org.eclipse.jst.ws.jaxws.dom.runtime.api.IWebServiceProject;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.DomValidatorFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.validation.IDomValidator;
import org.eclipse.jst.ws.jaxws.utils.dom.validation.DomValidationConstants;
import org.eclipse.jst.ws.jaxws.utils.logging.Logger;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.validation.internal.provisional.core.IProjectValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
/**
* Registered to WST validation framework IValidator. Receives notifications for
* validation to be performed and calls registered DOM validators to perform the
* real validation.
*
* @author Georgi Vachkov
*/
public class DomValidationManager implements IValidatorJob
{
public void cleanup(final IReporter reporter) {
// no resources for clean up
}
public void validate(final IValidationContext context, final IReporter reporter) {
validateInJob(context, reporter);
}
public IStatus validateInJob(final IValidationContext context, final IReporter reporter)
{
cleanMarkers((IProjectValidationContext) context);
IWebServiceProject wsProject;
for (IDomValidator validator : getValidators())
{
wsProject = (IWebServiceProject)context.loadModel("webServiceProject", new String []{validator.getSupportedDomRuntime()}); //$NON-NLS-1$
if (wsProject == null) {
continue;
}
validator.validate(wsProject);
refreshTree(wsProject);
}
return IValidatorJob.OK_STATUS;
}
public ISchedulingRule getSchedulingRule(final IValidationContext helper) {
return null;
}
protected void refreshTree(final IWebServiceProject wsProject)
{
final DOMAdapterFactoryLabelProvider labelProvider = labelProvider();
if (labelProvider == null) {
return;
}
Display.getDefault().asyncExec(new RefreshRunnable(labelProvider, wsProject));
}
protected DOMAdapterFactoryLabelProvider labelProvider()
{
return DomIntegrationPlugin.getDefault().getLabelProvider();
}
protected void cleanMarkers(IProjectValidationContext context)
{
try {
final IProject project = context.getProject();
if (project != null && project.isAccessible()) {
project.deleteMarkers(DomValidationConstants.MARKER_ID, true, IResource.DEPTH_INFINITE);
}
}
catch (CoreException e) {
(new Logger()).logError(e.getMessage(), e);
}
}
protected Collection<IDomValidator> getValidators()
{
return DomValidatorFactory.INSTANCE.getRegisteredValidators();
}
/**
* Class that fires label changed event to the label provider to apply validation
* results in the displayed tree - i.e. decorate images
*
* @author Georgi Vachkov
*/
protected class RefreshRunnable implements Runnable
{
private final DOMAdapterFactoryLabelProvider labelProvider;
private final IWebServiceProject wsProject;
public RefreshRunnable(final DOMAdapterFactoryLabelProvider labelProvider, final IWebServiceProject wsProject) {
this.labelProvider = labelProvider;
this.wsProject = wsProject;
}
public void run()
{
labelProvider.fireLabelProviderChanged(wsProject);
fireLabelProviderChanged(ISEIChildList.class);
fireLabelProviderChanged(IWebServiceChildList.class);
final TreeIterator<EObject> allChilds = wsProject.eAllContents();
while (allChilds.hasNext()) {
labelProvider.fireLabelProviderChanged(allChilds.next());
}
}
private void fireLabelProviderChanged(final Class<?> adapterClass)
{
final Adapter adapter = CustomDomItemProviderAdapterFactory.INSTANCE.adapt(wsProject, adapterClass);
if (adapter == null) {
return;
}
labelProvider.fireLabelProviderChanged(adapter);
}
}
}