/***************************************************************************** * Copyright (c) 2011 CEA LIST. * * * 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: * CEA LIST - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.uml.alf.validation; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.papyrus.uml.alf.validation.typing.SignatureFacade; import org.eclipse.papyrus.uml.alf.validation.typing.SignatureFacadeFactory; import org.eclipse.papyrus.uml.alf.validation.typing.TypeExpressionFactory; import org.eclipse.papyrus.uml.alf.validation.typing.TypeFacade; import org.eclipse.papyrus.uml.alf.validation.typing.TypeFacadeFactory; import org.eclipse.papyrus.uml.alf.validation.typing.TypeUtils; import org.eclipse.uml2.uml.Behavior; import org.eclipse.uml2.uml.Classifier; import org.eclipse.uml2.uml.ElementImport; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.Package; import org.eclipse.uml2.uml.PackageImport; public class PredefinedBehaviorsAndTypesUtils { private Map<String, List<SignatureFacade>> behaviorMap = new HashMap<String, List<SignatureFacade>>(); private Map<String, TypeFacade> typeMap = new HashMap<String, TypeFacade>() ; private List<Behavior> behaviorInsertedAsElementImport = new ArrayList<Behavior>() ; private List<Classifier> classifierInsertedAsElementImport = new ArrayList<Classifier>(); //private List<Behavior> predefinedCollectionFunctions = new ArrayList<Behavior>() ; //private Map<String, SignatureFacade> predefinedCollectionFunctionsMap = new HashMap<String, SignatureFacade>() ; public void init(org.eclipse.uml2.uml.Package library) { behaviorMap = new HashMap<String, List<SignatureFacade>>(); typeMap = new HashMap<String, TypeFacade>() ; behaviorInsertedAsElementImport = new ArrayList<Behavior>() ; classifierInsertedAsElementImport = new ArrayList<Classifier>() ; TypeUtils.predefinedCollectionFunctions = new HashMap<String, SignatureFacade>() ; localInit(library) ; // initializes predefined type facades from TypeUtils TypeUtils._bitString = typeMap.get("BitString") ; TypeUtils._boolean = typeMap.get("Boolean") ; TypeUtils._integer = typeMap.get("Integer") ; TypeUtils._natural = typeMap.get("Natural") ; TypeUtils._string = typeMap.get("String") ; TypeUtils._undefined = new TypeFacade(); TypeUtils._unlimited = typeMap.get("UnlimitedNatural") ; TypeUtils._nullExpression = TypeExpressionFactory.eInstance.createTypeExpression(TypeUtils._undefined) ; TypeUtils._Collection = typeMap.get("Collection") ; TypeUtils._Set = typeMap.get("Set"); TypeUtils._Bag = typeMap.get("Bag") ; TypeUtils._Queue = typeMap.get("Queue") ; TypeUtils._OrderedSet = typeMap.get("OrderedSet") ; TypeUtils._List = typeMap.get("List") ; TypeUtils._Deque = typeMap.get("Deque") ; TypeUtils._Map = typeMap.get("Map") ; TypeUtils._Entry = typeMap.get("Entry") ; } private void localInit(org.eclipse.uml2.uml.Package library) { if (library.getQualifiedName().equals("Alf::Library::CollectionFunctions")) { this.initCollectionFunctions(library) ; } for (NamedElement n : library.getOwnedMembers()) { if (n instanceof Behavior) { insertSignatureFacade(SignatureFacadeFactory.eInstance.createSignatureFacade(n)) ; } else if (n instanceof Classifier) { insertTypeFacade(TypeFacadeFactory.eInstance.createTypeFacade(n)) ; } else if (n instanceof org.eclipse.uml2.uml.Package) { localInit((org.eclipse.uml2.uml.Package)n) ; } } for (ElementImport eImport : library.getElementImports()) { if (eImport.getImportedElement() instanceof Behavior) { insertSignatureFacade(new SignatureFacade(eImport)) ; behaviorInsertedAsElementImport.add((Behavior)eImport.getImportedElement()) ; } else if (eImport.getImportedElement() instanceof Classifier) { insertTypeFacade(TypeFacadeFactory.eInstance.createTypeFacade(eImport)) ; classifierInsertedAsElementImport.add((Classifier)eImport.getImportedElement()) ; } else if (eImport.getImportedElement() instanceof org.eclipse.uml2.uml.Package) { localInit((org.eclipse.uml2.uml.Package)eImport.getImportedElement()) ; } } for (PackageImport pImport : library.getPackageImports()) { localInit(pImport.getImportedPackage()) ; } TypeUtils._Collection = typeMap.get("Collection") ; TypeUtils._Set = typeMap.get("Set"); TypeUtils._Bag = typeMap.get("Bag") ; TypeUtils._Queue = typeMap.get("Queue") ; TypeUtils._OrderedSet = typeMap.get("OrderedSet") ; TypeUtils._List = typeMap.get("List") ; TypeUtils._Deque = typeMap.get("Deque") ; TypeUtils._Map = typeMap.get("Map") ; TypeUtils._Entry = typeMap.get("Entry") ; } private void initCollectionFunctions(Package library) { for (NamedElement element : library.getOwnedMembers()) { if (element instanceof Behavior) { SignatureFacade s = SignatureFacadeFactory.eInstance.createSignatureFacade(element) ; TypeUtils.predefinedCollectionFunctions.put(s.getName(), s) ; } } for (ElementImport eImport : library.getElementImports()) { if (eImport.getImportedElement() instanceof Behavior) { SignatureFacade s = SignatureFacadeFactory.eInstance.createSignatureFacade(eImport) ; TypeUtils.predefinedCollectionFunctions.put(eImport.getAlias() == null || eImport.getAlias().length()==0 ? s.getName() : eImport.getAlias(), s) ; } } } public List<SignatureFacade> getSignatures(String name) { return behaviorMap.get(name) ; } public TypeFacade getClassifier(String name) { return typeMap.get(name) ; } private void insertSignatureFacade(SignatureFacade s) { for (Behavior b : behaviorInsertedAsElementImport) { if (s.equals(b)) return ; } List<SignatureFacade> l = behaviorMap.get(s.getName()) ; if (l == null) { l = new ArrayList<SignatureFacade>() ; behaviorMap.put(s.getName(), l) ; } l.add(s) ; } private void insertTypeFacade(TypeFacade t) { for (Classifier c : classifierInsertedAsElementImport) { if (t.equals(c)) return ; } if (typeMap.get(t.getLabel()) == null) typeMap.put(t.getLabel(), t) ; } }