/******************************************************************************* * Copyright (c) 2011, 2012, 2013, 2014 Red Hat, Inc. * All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation * * @author Bob Brodt ******************************************************************************/ package org.eclipse.bpmn2.modeler.core.model; import org.eclipse.bpmn2.modeler.core.LifecycleEvent; import org.eclipse.bpmn2.modeler.core.LifecycleEvent.EventType; import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter; import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime; import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntimeAdapter; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.impl.DynamicEObjectImpl; import org.eclipse.emf.ecore.impl.EFactoryImpl; import org.eclipse.emf.ecore.xml.type.XMLTypeFactory; /** * Object Factory class used to construct dynamic EObjects. We use the XMLTypeFactory's * AnyType as our generic container for attributes and elements. * * Once the object is created, an ExtendedPropertiesAdapter is added, which handles resolution * of dynamic attributes and elements. */ class AnyTypeObjectFactory extends EFactoryImpl { public ModelDecorator modelDecorator; public AnyTypeObjectFactory(ModelDecorator modelDecorator) { this.modelDecorator = modelDecorator; } @Override public EObject create(EClass eClass) { EObject object; if (eClass == EcorePackage.eINSTANCE.getEObject()) { object = XMLTypeFactory.eINSTANCE.createAnyType(); } else if (getEPackage() != eClass.getEPackage()) { object = eClass.getEPackage().getEFactoryInstance().create(eClass); } else { // If an implementation class with the given EClass name exists // try creating an instance of that class instead of the generic // AnyTypeImpl. The implementation class name must have the // EClass name followed by "Impl" and must extend AnyTypeImpl. if ("AnyType".equals(eClass.getInstanceClass().getSimpleName())) //$NON-NLS-1$ object = super.create(eClass); else object = create(eClass, (Class<EObject>)eClass.getInstanceClass()); } TargetRuntime rt = modelDecorator.getTargetRuntime(); TargetRuntimeAdapter.adapt(object, rt); ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object); LifecycleEvent.notify(new LifecycleEvent(EventType.BUSINESSOBJECT_CREATED, object, rt)); return object; } public EObject create(EClass eClass, Class<EObject> instanceClass) { try { EObject object = instanceClass.newInstance(); TargetRuntime rt = modelDecorator.getTargetRuntime(); ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(object); LifecycleEvent.notify(new LifecycleEvent(EventType.BUSINESSOBJECT_CREATED, object, rt)); return object; } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } protected EObject basicCreate(EClass eClass) { return eClass.getInstanceClassName() == "java.util.Map$Entry" ? //$NON-NLS-1$ new DynamicEObjectImpl.BasicEMapEntry<String, String>(eClass) : XMLTypeFactory.eINSTANCE.createAnyType(); } }