blob: 410c02b6d13803e7833e2bb14052e20cfd9a8bc6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ote.container;
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectNature;
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.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.osee.framework.ui.workspacebundleloader.JarCollectionNature;
/**
* Handler for IResourceChangeEvent.POST_CHANGE and IResourceChangeEvent.PRE_CLOSE events for projects with a given
* nature ID that extends JarCollectionNature. POST_CHANGE events against the jars in projects with the nature, and
* close events on the projects with the nature are detected and offered to an IJarChangeListener.
*
* @author Robert A. Fisher
*/
public class JarChangeResourceListener<T extends JarCollectionNature> implements IResourceChangeListener {
private final String natureId;
private final LibraryChangeProvider listener;
public JarChangeResourceListener(String natureId, LibraryChangeProvider listener) {
if (natureId == null) {
throw new IllegalArgumentException("natureId must not be null");
}
if (listener == null) {
throw new IllegalArgumentException("listener must not be null");
}
this.natureId = natureId;
this.listener = listener;
}
@SuppressWarnings("unchecked")
@Override
public void resourceChanged(IResourceChangeEvent event) {
try {
if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
handleChangeEvent(event);
} else if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
IResource resource = event.getResource();
if (resource != null && resource instanceof IProject) {
IProject project = (IProject) resource;
IProjectNature nature = project.getNature(natureId);
if (nature != null) {
listener.handleNatureClosed((T) nature);
}
}
}
} catch (CoreException ex) {
} catch (MalformedURLException ex) {
}
}
private void handleChangeEvent(IResourceChangeEvent event) throws CoreException, MalformedURLException {
IResourceDelta rootDelta = event.getDelta();
if (rootDelta != null) {
boolean triggered = false;
for (IResourceDelta child : rootDelta.getAffectedChildren()) {
IResource resource = child.getResource();
if (resource != null && resource instanceof IProject) {
IProject project = (IProject) resource;
IProjectNature nature = project.getNature(natureId);
if (nature != null) {
JarCollectionNature starterNature = (JarCollectionNature) nature;
IPath[] paths = starterNature.getProjectRelativeBundlePaths();
for (IPath path : paths) {
IResourceDelta pluginDelta = child.findMember(path);
if (pluginDelta != null) {
handlePluginChanges(project.getLocation().removeLastSegments(1),
pluginDelta.getAffectedChildren());
triggered = true;
}
}
}
}
}
if (triggered) {
listener.handlePostChange();
}
}
}
protected void handlePluginChanges(IPath workspacePath, IResourceDelta[] affectedChildren) throws MalformedURLException {
for (IResourceDelta affectedPluginDelta : affectedChildren) {
URL url = workspacePath.append(affectedPluginDelta.getFullPath()).toFile().toURI().toURL();
if (affectedPluginDelta.getFullPath().getFileExtension().equals("jar")) {
try {
switch (affectedPluginDelta.getKind()) {
case IResourceDelta.ADDED:
listener.handleBundleAdded(url);
break;
case IResourceDelta.CHANGED:
listener.handleBundleChanged(url);
break;
case IResourceDelta.REMOVED:
listener.handleBundleRemoved(url);
break;
default:
System.err.println("Do not expect change kind of " + generateKindString(affectedPluginDelta.getKind()));
}
} catch (RuntimeException ex) {
ex.printStackTrace();
throw ex;
}
}
}
}
private String generateKindString(int kind) {
switch (kind) {
case IResourceDelta.ADDED:
return "Added";
case IResourceDelta.CHANGED:
return "Changed";
case IResourceDelta.REMOVED:
return "Removed";
default:
return "Unexpected Kind: " + kind;
}
}
protected String generateEventString(int type) {
switch (type) {
case IResourceChangeEvent.POST_BUILD:
return "Post Build";
case IResourceChangeEvent.POST_CHANGE:
return "Post Change";
case IResourceChangeEvent.PRE_BUILD:
return "Pre Build";
case IResourceChangeEvent.PRE_CLOSE:
return "Pre Close";
case IResourceChangeEvent.PRE_DELETE:
return "Pre Delete";
case IResourceChangeEvent.PRE_REFRESH:
return "Pre Refresh";
default:
return "Unknown Code: " + type;
}
}
}