blob: e58f38c9baf6389611c48ddf21ef2d4306025e06 [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS core plugin --
-- --
-- Copyright (C) 2011-2012 --
-- University of Padova, ITALY --
-- --
-- Author: Alessandro Zovi azovi@math.unipd.it --
-- --
-- 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-v20.html --
-----------------------------------------------------------------------
*/
package org.polarsys.chess.core.resourcelistener;
import java.util.Enumeration;
import java.util.Hashtable;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.command.CompoundCommand;
import org.eclipse.emf.transaction.ResourceSetChangeEvent;
import org.eclipse.emf.transaction.RollbackException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
import org.osgi.framework.Bundle;
/**
* This class manages the resorceListener extension-point.
*
*/
public class ResourceSetListenerManager extends ResourceSetListenerExtra {
/** The listener registry. */
// list of of listener
private Hashtable<String, ResourceSetListenerExtra> listenerRegistry;
/** The modellistenerid extension id. */
// extension point ID
private String MODELLISTENERID_EXTENSION_ID = "org.polarsys.chess.resourceListener";
/** The name id. */
private String NAME_ID = "name";
/** The realization id. */
private String REALIZATION_ID = "realization";
/**
* Instantiates a new resource set listener manager.
*
* @param serviceRegistry the service registry
*/
public ResourceSetListenerManager(ServicesRegistry serviceRegistry) {
listenerRegistry = new Hashtable<String, ResourceSetListenerExtra>();
this.sr = serviceRegistry;
initializeListenerList();
}
/**
* Load all registered listeners for the model.
*/
private void initializeListenerList() {
// Reading data from plugins
IConfigurationElement[] configElements = Platform
.getExtensionRegistry().getConfigurationElementsFor(
MODELLISTENERID_EXTENSION_ID);
for (int i = 0; i < configElements.length; i++)
{
inializeOneRule(configElements[i]);
}
}
/**
* Load one listener.
*
* @param element the extension point
*/
private void inializeOneRule(IConfigurationElement element) {
String listenerName = element.getAttribute(NAME_ID);
try {
ResourceSetListenerExtra listener = (ResourceSetListenerExtra) createExtension(
element, element.getAttribute(REALIZATION_ID));
listener.setRegistry(sr);
listenerRegistry.put(listenerName, listener);
} catch (Exception e) {
System.err
.println("- " + listenerName + " can not be loaded: " + e);
e.printStackTrace();
}
}
/**
* Load an instance of a class.
*
* @param element the extension point
* @param classAttribute the name of the class to load
* @return the loaded Class
* @throws Exception if the class is not loaded
*/
private static Object createExtension(final IConfigurationElement element,
final String classAttribute) throws Exception {
try {
Bundle extensionBundle = Platform.getBundle(element
.getDeclaringExtension().getNamespaceIdentifier());
Class<?> clazz = extensionBundle.loadClass(classAttribute);
Object obj = clazz.newInstance();
return obj;
// return element.createExecutableExtension(classAttribute);
} catch (Exception e) {
throw new Exception("unable to create Extension" + e);
}
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
String out = "ModelListener: \n";
Enumeration<String> keyenum = listenerRegistry.keys();
// we will call to string in each class
while (keyenum.hasMoreElements()) {
Object aKey = keyenum.nextElement();
out = out + "- " + aKey.toString() + " ("
+ listenerRegistry.get(aKey).toString() + ")\n";
}
return out;
}
/* (non-Javadoc)
* @see org.eclipse.emf.transaction.ResourceSetListenerImpl#transactionAboutToCommit(org.eclipse.emf.transaction.ResourceSetChangeEvent)
*/
@Override
public Command transactionAboutToCommit(ResourceSetChangeEvent event)
throws RollbackException {
Enumeration<String> keyenum = listenerRegistry.keys();
// we will call to string in each class
Command c = null;
CompoundCommand command = new CompoundCommand();
while (keyenum.hasMoreElements())
{
Object aKey = keyenum.nextElement();
c = listenerRegistry.get(aKey).transactionAboutToCommit(event);
//System.out.println(c);
if ( c != null )
{
command.append(c);
break;
}
}
//return c == null ? super.transactionAboutToCommit(event) : c;
return command.isEmpty() ? super.transactionAboutToCommit(event) : command;
}
}