| /****************************************************************************** |
| * Copyright (c) 2002, 2010 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.gmf.runtime.common.ui.resources; |
| |
| import java.net.URI; |
| import java.util.Hashtable; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.resources.IFolder; |
| import org.eclipse.core.runtime.content.IContentType; |
| import org.eclipse.gmf.runtime.common.core.util.StringStatics; |
| import org.eclipse.gmf.runtime.common.core.util.Trace; |
| import org.eclipse.gmf.runtime.common.ui.internal.CommonUIDebugOptions; |
| import org.eclipse.gmf.runtime.common.ui.internal.CommonUIPlugin; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.FileChangeEvent; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.FileChangeEventType; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.FileObserverFilter; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.FileObserverFilterType; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.MarkerChangeEvent; |
| import org.eclipse.gmf.runtime.common.ui.internal.resources.MarkerChangeEventType; |
| |
| /** |
| * Manage the list of file observers for the file change manager. |
| * |
| * @author Anthony Hunter <a |
| * href="mailto:ahunter@rational.com">ahunter@rational.com </a> |
| */ |
| public class FileObserverManager { |
| |
| /** |
| * list of file observers. |
| */ |
| private Hashtable fileObserverList = new Hashtable(); |
| |
| /** |
| * Add a file observer with no filter. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| */ |
| protected void add(IFileObserver fileObserver) { |
| trace("...FileObserverManager: addFileObserver " //$NON-NLS-1$ |
| + fileObserver.toString() + " filter ALL"); //$NON-NLS-1$ |
| FileObserverFilter filter = new FileObserverFilter( |
| FileObserverFilterType.ALL); |
| fileObserverList.put(fileObserver, filter); |
| } |
| |
| /** |
| * Add a file observer with a file filter. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| * @param fileFilter |
| * the file filter. |
| */ |
| protected void add(IFileObserver fileObserver, IFile fileFilter) { |
| URI uri = fileFilter.getLocationURI(); |
| trace("...FileObserverManager: addFileObserver " //$NON-NLS-1$ |
| + fileObserver.toString() |
| + " filter " + (uri != null ? uri.toString() : StringStatics.BLANK)); //$NON-NLS-1$ |
| FileObserverFilter filter = new FileObserverFilter( |
| FileObserverFilterType.FILE, fileFilter); |
| fileObserverList.put(fileObserver, filter); |
| } |
| |
| /** |
| * Add a file observer with a content type filter. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| * @param contentTypeFilter |
| * the content type array filter. |
| */ |
| protected void add(IFileObserver fileObserver, IContentType[] contentTypeFilter) { |
| trace("...FileObserverManager: addFileObserver " //$NON-NLS-1$ |
| + fileObserver.toString() |
| + " filter " + contentTypeFilter.toString()); //$NON-NLS-1$ |
| FileObserverFilter filter = new FileObserverFilter( |
| FileObserverFilterType.CONTENT_TYPE, contentTypeFilter); |
| fileObserverList.put(fileObserver, filter); |
| } |
| |
| /** |
| * Add a file observer with a folder filter. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| * @param folderFilter |
| * the folder filter. |
| */ |
| protected void add(IFileObserver fileObserver, IFolder folderFilter) { |
| trace("...FileObserverManager: addFileObserver " //$NON-NLS-1$ |
| + fileObserver.toString() |
| + " filter folder" + folderFilter.getLocationURI().toString()); //$NON-NLS-1$ |
| FileObserverFilter filter = new FileObserverFilter( |
| FileObserverFilterType.FOLDER, folderFilter); |
| fileObserverList.put(fileObserver, filter); |
| } |
| |
| /** |
| * Add a file observer with a file extension filter. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| * @param extensionFilter |
| * the file extension array filter. |
| */ |
| protected void add(IFileObserver fileObserver, String[] extensionFilter) { |
| trace("...FileObserverManager: addFileObserver " //$NON-NLS-1$ |
| + fileObserver.toString() + " filter " + extensionFilter[0]); //$NON-NLS-1$ |
| FileObserverFilter filter = new FileObserverFilter( |
| FileObserverFilterType.EXTENSION, extensionFilter); |
| fileObserverList.put(fileObserver, filter); |
| } |
| |
| /** |
| * Remove a file observer. |
| * |
| * @param fileObserver |
| * the file observer class implementing the IFileObserver |
| * interface. |
| */ |
| protected void remove(IFileObserver fileObserver) { |
| if (fileObserverList.containsKey(fileObserver)) { |
| trace("...FileObserverManager: removeFileObserver " + fileObserver.toString()); //$NON-NLS-1$ |
| fileObserverList.remove(fileObserver); |
| } |
| } |
| |
| /** |
| * Notify file observers of a file change event. |
| * |
| * @param event |
| * the file change event. |
| */ |
| protected void notify(FileChangeEvent event) { |
| |
| // Avoid concurrency problems when multiple threads are modifying |
| // the fileObserverList |
| Hashtable fileObserverListCopy = (Hashtable) fileObserverList.clone(); |
| |
| for (Iterator i = fileObserverListCopy.entrySet().iterator(); i |
| .hasNext();) { |
| Map.Entry entry = (Map.Entry) i.next(); |
| IFileObserver fileObserver = (IFileObserver) entry.getKey(); |
| FileObserverFilter filter = (FileObserverFilter) entry.getValue(); |
| if (event.getEventType() == FileChangeEventType.MOVED) { |
| if (filter.matches(event.getOldFilePath())) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleFileMoved"); //$NON-NLS-1$ |
| fileObserver.handleFileMoved(event.getOldFile(), event |
| .getFile()); |
| } |
| } else if (event.getEventType() == FileChangeEventType.RENAMED) { |
| if (filter.matches(event.getOldFilePath())) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleFileRenamed"); //$NON-NLS-1$ |
| fileObserver.handleFileRenamed(event.getOldFile(), event |
| .getFile()); |
| } |
| } else if (event.getEventType() == FileChangeEventType.DELETED) { |
| if (filter.matches(event.getFilePath())) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleFileDeleted"); //$NON-NLS-1$ |
| fileObserver.handleFileDeleted(event.getFile()); |
| } |
| } else if (event.getEventType() == FileChangeEventType.CHANGED) { |
| if (filter.matches(event.getFilePath())) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleFileChanged"); //$NON-NLS-1$ |
| fileObserver.handleFileChanged(event.getFile()); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Notify file observers of a marker change event. |
| * |
| * @param event |
| * the marker change event. |
| */ |
| protected void notify(MarkerChangeEvent event) { |
| |
| // Avoid concurrency problems when multiple threads are modifying |
| // the fileObserverList |
| Hashtable fileObserverListCopy = (Hashtable) fileObserverList.clone(); |
| |
| for (Iterator i = fileObserverListCopy.entrySet().iterator(); i |
| .hasNext();) { |
| Map.Entry entry = (Map.Entry) i.next(); |
| IFileObserver fileObserver = (IFileObserver) entry.getKey(); |
| FileObserverFilter filter = (FileObserverFilter) entry.getValue(); |
| if (filter.matches(event.getMarker().getResource())) { |
| if (event.getEventType() == MarkerChangeEventType.ADDED) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleMarkerAdded"); //$NON-NLS-1$ |
| fileObserver.handleMarkerAdded(event.getMarker()); |
| } else if (event.getEventType() == MarkerChangeEventType.CHANGED) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleMarkerChanged"); //$NON-NLS-1$ |
| fileObserver.handleMarkerChanged(event.getMarker()); |
| } else if (event.getEventType() == MarkerChangeEventType.REMOVED) { |
| trace("...FileObserverManager: Notify " //$NON-NLS-1$ |
| + fileObserver.toString() + " handleMarkerDeleted"); //$NON-NLS-1$ |
| fileObserver.handleMarkerDeleted(event.getMarker(), event |
| .getAttributes()); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Print a trace message if tracing is on for file change management. |
| * |
| * @param message |
| * the trace message to print. |
| */ |
| private void trace(String message) { |
| if (Trace.shouldTrace(CommonUIPlugin.getDefault(), |
| CommonUIDebugOptions.RESOURCE)) { |
| Trace.trace(CommonUIPlugin.getDefault(), message); |
| } |
| } |
| } |