blob: 8a36f95265d85f4e26dc6b70cd02da71670210bd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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.bpel.ui.factories;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.bpel.ui.Policy;
import org.eclipse.bpel.ui.bpelactions.AbstractBPELAction;
import org.eclipse.bpel.ui.extensions.ActionDescriptor;
import org.eclipse.bpel.ui.extensions.BPELUIRegistry;
import org.eclipse.bpel.ui.extensions.UIObjectFactoryDescriptor;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.emf.ecore.EClass;
/**
* A factory provider for BPEL model objects and other model objects used within the
* BPEL editor.
*/
public class UIObjectFactoryProvider {
private static UIObjectFactoryProvider instance;
protected Map<EClass,AbstractUIObjectFactory> eClass2factory = new HashMap<EClass,AbstractUIObjectFactory>();
/**
* @return the instance
*/
public static UIObjectFactoryProvider getInstance() {
if (instance == null) {
instance = new UIObjectFactoryProvider();
createUIObjectFactories(instance);
}
return instance;
}
protected static void createUIObjectFactories (UIObjectFactoryProvider provider) {
// TODO: temporary HACK!
for (EClass modelType : BPELUIObjectFactory.classArray) {
provider.register(modelType, new BPELUIObjectFactory(modelType));
}
// TODO: this is even worse
// for (int i = 0; i<BPELUIObjectFactory.bpelPlusClassArray.length; i++) {
// EClass modelType = BPELUIObjectFactory.bpelPlusClassArray[i];
// provider.register(modelType, new BPELUIObjectFactory(modelType));
// }
// List of extension ui object factories factories
UIObjectFactoryDescriptor[] factories = BPELUIRegistry.getInstance().getUIObjectFactoryDescriptors();
// loop over List of extension ui object factories
for (int i = 0; i < factories.length; i++) {
// get the extension ui object factory
AbstractUIObjectFactory factory = factories[i].getFactory();
// get the classes for which the extension ui object factory is responsible
EClass[] classArray = ((IExtensionUIObjectFactory)factory).getClassArray();
// get the configuration element of the extension ui object factory
IConfigurationElement factConfigElement = factories[i].getConfigElement();
// loop over classes for which the extension ui object factory is responsible
for (int j = 0; j < classArray.length; j++) {
// get the class name
EClass modelType = classArray[j];
IExtensionUIObjectFactory fact = null;
try {
// create a extension ui object factory
fact = (IExtensionUIObjectFactory)factConfigElement. createExecutableExtension("class");
// set the class for which the factory is responsible
fact.setModelType(modelType);
} catch (CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// register the factory
provider.register(modelType, (AbstractUIObjectFactory)fact);
}
}
// TODO: We are currently overwritting the ones already provided above.
// We should change that so that we do not create the ones for action twice.
// (i.e. we should not use BPELUIObjectFactory.classArray neither BPELUIObjectFactory.bpelPlusClassArray
for(ActionDescriptor descriptor : BPELUIRegistry.getInstance().getActionDescriptors() ) {
AbstractBPELAction action = descriptor.getAction();
if (action != null) {
provider.register(action.getModelType(), new ActionUIObjectFactory(action));
}
}
}
/**
*
* @param modelType
* @return the UI Object factory for the given model type.
*/
public AbstractUIObjectFactory getFactoryFor (EClass modelType) {
return eClass2factory.get(modelType);
}
/**
* @param modelType
* @param factory
*/
public void register (EClass modelType, AbstractUIObjectFactory factory) {
Assert.isTrue(factory.getModelType() == modelType);
eClass2factory.put(modelType, factory);
if (Policy.DEBUG) {
System.out.println("BPELUIObjectFactoryProvider registering EClass: "+modelType.getInstanceClassName()); //$NON-NLS-1$
}
}
}