/*******************************************************************************
* 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;
import org.eclipse.core.resources.IProject;
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.core.runtime.IPath;
import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IStartup;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
import org.jboss.tools.seam.core.SeamCorePlugin;
/**
* Workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=207146
* @author eskimo
*
*/
public class WorkaroundFor207146 implements IStartup{
/* (non-Javadoc)
* @see org.eclipse.ui.IStartup#earlyStartup()
*/
public void earlyStartup() {
ResourcesPlugin.getWorkspace().addResourceChangeListener(new WebContentUpdater(), IResourceChangeEvent.POST_CHANGE);
}
public static class WebContentUpdater implements IResourceChangeListener {
public void resourceChanged(IResourceChangeEvent event) {
if (event.getType() != IResourceChangeEvent.POST_CHANGE || event.getDelta()==null) {
//SeamGuiPlugin.getDefault().logInfo("No reason to run");
return;
}
ManifestChangeDetector visitor = new ManifestChangeDetector();
try {
event.getDelta().accept(visitor);
} catch (CoreException e) {
SeamCorePlugin.getPluginLog().logError(e);
}
if(visitor.skip) return; // skip listener if MANIFEST.MF and WEB-INF were changed
IResourceDelta[] delta = event.getDelta().getAffectedChildren();
// go trough changed resources
for (IResourceDelta resourceDelta : delta) {
IProject prj = resourceDelta.getResource().getProject();
IVirtualComponent comp = ComponentCore.createComponent(prj);
if(comp==null) continue;
final IVirtualFolder root = comp.getRootFolder();
// check that changes in WebContent folder
IResourceDelta foundMember = event.getDelta().findMember(root.getUnderlyingFolder().getFullPath());
if(foundMember!=null) {
//SeamGuiPlugin.getDefault().logInfo("Refreshing package explorer to workaround Eclipse bug 207146: " + findMember.getFullPath());
refreshPackageExplorer();
return; // only required to refresh once.
}
}
}
private void refreshPackageExplorer() {
// Refresh Package Explorer
Display display = Display.getDefault();
if(display==null) {
return;
}
display.asyncExec(new Runnable() {
public void run() {
PackageExplorerPart p = PackageExplorerPart.getFromActivePerspective();
if(p!=null) {
TreeViewer tv = p.getTreeViewer();
if(tv!=null) {
tv.refresh();
}
}
}
});
}
}
/**
* Find if there is MANIFEST.MF or WEB-INF resources in IResourceDelta
* @author eskimo
*
*/
public static class ManifestChangeDetector implements IResourceDeltaVisitor {
/**
* TODO handle case when something is changed in WEB-INF folder
*/
public boolean visit(IResourceDelta delta) throws CoreException {
if(skip) return false; // skip everything if MANIFEST.MF || WEB-INF are found already
IPath location = delta.getResource().getLocation();
if(location==null) {
return false;
}
if("MANIFEST.MF".equals(location.lastSegment())
|| "META-INF".equals(location.lastSegment())){
skip = true;
return false;
}
return true;
}
boolean skip = false;
}
}