/******************************************************************************* | |
* 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$ | |
} | |
} | |
} |