| /******************************************************************************* |
| * 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; |
| } |
| } |
| } |