/***************************************************************************** * Copyright (c) 2011 Atos. * * * 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: * Arthur Daussy (Atos) - Initial API and implementation * Arthur Daussy - 371712 : 372745: [ActivityDiagram] Major refactoring group framework * *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.activity.activitygroup; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.ecore.EClass; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.ActivityContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.ActivityNodeContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.ActivityPartitionContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.ConditionalNodeContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.ExpansionRegionContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.InterruptibleActivityRegionContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.LoopNodeContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.SequenceNodeContainment; import org.eclipse.papyrus.uml.diagram.activity.activitygroup.groupcontainment.StructuredActivityNodeContainment; import org.eclipse.uml2.uml.UMLPackage; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; /** * Registry of all node and group descriptor */ public final class ContainerNodeDescriptorRegistry { /** * Constructor */ private ContainerNodeDescriptorRegistry() { } /** * Registry of all descriptor */ private static Map<EClass, IContainerNodeDescriptor> registry; /** * Initialize * (May be in the future using extension point */ static { registry = new HashMap<EClass, IContainerNodeDescriptor>(); registry.put(UMLPackage.Literals.ACTIVITY_PARTITION, new ActivityPartitionContainment()); registry.put(UMLPackage.Literals.STRUCTURED_ACTIVITY_NODE, new StructuredActivityNodeContainment()); registry.put(UMLPackage.Literals.CONDITIONAL_NODE, new ConditionalNodeContainment()); registry.put(UMLPackage.Literals.EXPANSION_REGION, new ExpansionRegionContainment()); registry.put(UMLPackage.Literals.INTERRUPTIBLE_ACTIVITY_REGION, new InterruptibleActivityRegionContainment()); registry.put(UMLPackage.Literals.LOOP_NODE, new LoopNodeContainment()); registry.put(UMLPackage.Literals.SEQUENCE_NODE, new SequenceNodeContainment()); registry.put(UMLPackage.Literals.ACTIVITY_NODE, new ActivityNodeContainment()); registry.put(UMLPackage.Literals.ACTIVITY, new ActivityContainment()); } /** * SingletonHolder is loaded on the first execution of Singleton.getInstance() * or the first access to SingletonHolder.INSTANCE, not before. */ private static class SingletonHolder { public static final ContainerNodeDescriptorRegistry instance = new ContainerNodeDescriptorRegistry(); } public IContainerNodeDescriptor getContainerNodeDescriptor(EClass eclass) { try { IContainerNodeDescriptor result = registry.get(eclass); if(result == null) { ArrayList<EClass> superTypes = Lists.newArrayList(eclass.getEAllSuperTypes()); for(EClass aux : Iterables.reverse(superTypes)) { result = registry.get(aux); if(result != null) { return result; } } } return result; } catch (Exception e) { throw new RuntimeException("wrong use of the ContainerNodeDescriptorRegistry"); } } public static ContainerNodeDescriptorRegistry getInstance() { return SingletonHolder.instance; } }