blob: 9b1e4480fd40aca18e0e872cc636c0b0235a4cc3 [file] [log] [blame]
/******************************************************************************
* 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);
}
}
}