blob: 9eb610bb53cf8a9d80aa68a618fe6f87606a471b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsdl.ui.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.wst.wsdl.Definition;
public class WSDLEditorResourceChangeHandler
{
protected WSDLEditor wsdlEditor;
protected boolean isUpdateRequired;
protected InternalResourceChangeListener resourceChangeListener;
protected InternalPartListener partListener;
public WSDLEditorResourceChangeHandler(WSDLEditor wsdlEditor)
{
this.wsdlEditor = wsdlEditor;
resourceChangeListener = new InternalResourceChangeListener();
partListener = new InternalPartListener();
}
public void attach()
{
ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener);
wsdlEditor.getSite().getWorkbenchWindow().getPartService().addPartListener(partListener);
}
public void dispose()
{
ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
wsdlEditor.getSite().getWorkbenchWindow().getPartService().removePartListener(partListener);
}
protected Map computeDependencyMap()
{
Map map = new HashMap();
Definition definition = wsdlEditor.getDefinition();
ResourceSet resourceSet = definition.eResource().getResourceSet();
for (Iterator i = resourceSet.getResources().iterator(); i.hasNext();)
{
Resource resource = (Resource)i.next();
if (resource != definition.eResource())
{
String uri = resource.getURI().toString();
if (map.get(uri) == null)
{
map.put(uri, uri);
}
}
}
return map;
}
public void performReload()
{
boolean doReload = false;
int policy = WSDLEditorPlugin.getInstance().getDependenciesChangedPolicy();
if (policy == WSDLEditorPlugin.DEPENDECIES_CHANGED_POLICY_PROMPT)
{
doReload = MessageDialog.openQuestion(wsdlEditor.getSite().getShell(), WSDLEditorPlugin.getWSDLString("_UI_DEPENDENCIES_CHANGED"), WSDLEditorPlugin.getWSDLString("_UI_DEPENDENCIES_CHANGED_REFRESH"));
}
else if (policy == WSDLEditorPlugin.DEPENDECIES_CHANGED_POLICY_RELOAD)
{
doReload = true;
}
if (doReload)
{
wsdlEditor.reloadDependencies();
}
}
public boolean isListeningToResourceChanges()
{
int policy = WSDLEditorPlugin.getInstance().getDependenciesChangedPolicy();
return policy == WSDLEditorPlugin.DEPENDECIES_CHANGED_POLICY_PROMPT ||
policy == WSDLEditorPlugin.DEPENDECIES_CHANGED_POLICY_RELOAD;
}
class InternalResourceChangeListener implements IResourceChangeListener, IResourceDeltaVisitor
{
protected List list = new ArrayList();
protected boolean isPending = false;
protected int count = 0;
public void resourceChanged(IResourceChangeEvent event)
{
Display display = Display.getCurrent();
if (display != null && isListeningToResourceChanges() && !isUpdateRequired)
{
if (event.getType() == IResourceChangeEvent.POST_CHANGE)
{
IResourceDelta[] deltas = event.getDelta().getAffectedChildren();
for (int i = 0; i < deltas.length; i++)
{
try
{
deltas[i].accept(this);
}
catch (Exception e)
{
}
}
}
if (list.size() > 0)
{
if (!isPending)
{
isPending = true;
display.timerExec(2000, new TimerEvent());
}
}
}
}
public boolean visit(IResourceDelta delta) throws CoreException
{
IResource resource = delta.getResource();
if (resource.getType() == IResource.FILE)
{
if (!list.contains(resource))
{
list.add(resource);
}
}
return true;
}
class TimerEvent implements Runnable
{
public TimerEvent()
{
//System.out.println("NewTimerEvent(" + wsdlEditor.getDefinition().eResource().getURI() + ") " + count);
}
public void run()
{
// for (Iterator i = list.iterator(); i.hasNext();)
// {
// IResource resource = (IResource)i.next();
// String platformPath = URI.createPlatformResourceURI(resource.getFullPath().toString()).toString();
// }
Map dependencyMap = computeDependencyMap();
for (Iterator i = list.iterator(); i.hasNext();)
{
IResource resource = (IResource)i.next();
String platformPath = URI.createPlatformResourceURI(resource.getFullPath().toString()).toString();
if (dependencyMap.get(platformPath) != null)
{
isUpdateRequired = true;
if (wsdlEditor.getSite().getWorkbenchWindow().getPartService().getActivePart() == wsdlEditor)
{
isUpdateRequired = false;
performReload();
}
}
}
isPending = false;
list = new ArrayList();
}
}
}
class InternalPartListener implements IPartListener
{
public void partActivated(IWorkbenchPart part)
{
if (part == wsdlEditor)
{
if (isUpdateRequired)
{
isUpdateRequired = false;
performReload();
}
}
}
public void partBroughtToTop(IWorkbenchPart part)
{
}
public void partClosed(IWorkbenchPart part)
{
}
public void partDeactivated(IWorkbenchPart part)
{
}
public void partOpened(IWorkbenchPart part)
{
}
}
}
/*
class DependencyVisitor
{
public void visitImport(Import theImport)
{
if (theImport.getEDefinition() != null)
{
visitDefinition(theImport.getEDefinition());
}
else if (theImport.getESchema() != null)
{
visitSchema(theImport.getESchema());
}
}
public void visitXSDSchemaDirective(XSDSchemaDirective directive)
{
XSDSchema referencedSchema = directive.getResolvedSchema();
if (referencedSchema != null)
{
visitSchema(referencedSchema);
}
}
public void visitDefinition(Definition definition)
{
if (definition != null)
{
for (Iterator i = definition.getEImports().iterator(); i.hasNext();)
{
visitImport((Import)i.next());
}
Types types = definition.getETypes();
if (types != null)
{
for (Iterator i = types.getEExtensibilityElements().iterator(); i.hasNext();)
{
Object o = i.next();
if (o instanceof XSDSchemaExtensibilityElement)
{
XSDSchemaExtensibilityElement e = (XSDSchemaExtensibilityElement)o;
if (e.getEXSDSchema() != null)
{
visitSchema(e.getEXSDSchema());
}
}
}
}
}
}
public void visitSchema(XSDSchema schema)
{
for (Iterator i = schema.getContents().iterator(); i.hasNext();)
{
Object o = i.next();
if (o instanceof XSDSchemaDirective)
{
visitXSDSchemaDirective((XSDSchemaDirective)o);
}
}
}
}
class ReloadDependencyVisitor extends DependencyVisitor
{
public void visitImport(Import theImport)
{
ComponentHandler handler = WSDLReconciler.getReconciler(theImport);
Element element = WSDLUtil.getInstance().getElementForObject(theImport);
if (element != null && handler != null)
{
handler.reconcile(wsdlEditor.getDefinition(), theImport, element);
}
}
public void visitXSDSchemaDirective(XSDSchemaDirective directive)
{
}
}*/