blob: fc6dca4b49613c6ae6f002b8c77325b744717e6e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Gregoire DUPE (Mia-Software)
*******************************************************************************/
package org.eclipse.modisco.infra.common.core.internal.resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.modisco.infra.common.core.internal.CommonModiscoActivator;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
/**
* @author Gregoire DUPE
*/
public class MoDiscoResourceListenerGroup {
private final Map<IMoDiscoResourceListener, HashSet<URI>> listeners = new HashMap<IMoDiscoResourceListener, HashSet<URI>>();
private final URI watchedResourceUri;
public MoDiscoResourceListenerGroup(final URI watchedResourceUri) {
this.watchedResourceUri = watchedResourceUri;
if (MoDiscoResourceSet.DEBUG) {
String message = this.getClass().getSimpleName()
+ "." + this.getClass().getSimpleName() + "(): " //$NON-NLS-1$ //$NON-NLS-2$
+ this.watchedResourceUri;
System.out.println(message);
// IStatus status = new Status(IStatus.INFO,
// CommonModiscoActivator.PLUGIN_ID, message);
// CommonModiscoActivator.getDefault().getLog().log(status);
}
}
public void notifyChange() {
if (MoDiscoResourceSet.DEBUG) {
String message = this.getClass().getSimpleName()
+ ".notifyChange(): " + this.watchedResourceUri //$NON-NLS-1$
+ " nbListeners=" + this.listeners.size(); //$NON-NLS-1$
System.out.println(message);
// IStatus status = new Status(IStatus.INFO,
// CommonModiscoActivator.PLUGIN_ID, message);
// CommonModiscoActivator.getDefault().getLog().log(status);
}
List<Runnable> toDoList = new ArrayList<Runnable>();
for (IMoDiscoResourceListener listener : this.listeners.keySet()) {
final IMoDiscoResourceListener fListener = listener;
for (URI clientUri : this.listeners.get(listener)) {
final URI fClientURI = clientUri;
Runnable toDo = new Runnable() {
public void run() {
try {
if (MoDiscoResourceSet.DEBUG) {
System.out
.println(MoDiscoResourceListenerGroup.this.getClass()
.getSimpleName()
+ ".notifyChange(): aListenedResourceHasChanged(changed=" + MoDiscoResourceListenerGroup.this.watchedResourceUri + ", depending=" + fClientURI + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
fListener.aListenedResourceHasChanged(
MoDiscoResourceListenerGroup.this.watchedResourceUri,
fClientURI);
} catch (Exception e) {
MoDiscoLogger
.logError(
e,
"An exception happened while notifying change of: " //$NON-NLS-1$
+ MoDiscoResourceListenerGroup.this.watchedResourceUri
+ " to: " + fListener, CommonModiscoActivator //$NON-NLS-1$
.getDefault());
}
}
};
toDoList.add(toDo);
}
}
for (Runnable toDo : toDoList) {
toDo.run();
}
}
public void addListener(final IMoDiscoResourceListener listener, final URI resourceUri) {
HashSet<URI> list = this.listeners.get(listener);
if (list == null) {
list = new HashSet<URI>();
this.listeners.put(listener, list);
}
list.add(resourceUri);
}
public void remove(final IMoDiscoResourceListener listener, final URI dependingResource) {
HashSet<URI> uriSet = this.listeners.get(listener);
if (uriSet != null) {
uriSet.remove(dependingResource);
}
}
}