--/*******************************************************************************
-- * Copyright (c) 2015 Vienna University of Technology.
-- * 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:
-- * Alexander Bergmayr (Vienna University of Technology) - initial API and implementation
-- * Manuel Wimmer (Vienna University of Technology) - initial API and implementation 
-- *
-- * Initially developed in the context of ARTIST EU project www.artist-project.eu
-- *******************************************************************************/

-- @nsURI UMLMM=http://www.eclipse.org/uml2/3.0.0/UML

library profileLibrary;

helper context UMLMM!Element def: setTaggedValue(stereotype : OclAny, propertyName : String, newValue : OclAny ) : OclAny = 
if (not newValue.oclIsUndefined())
	then
		if (not thisModule.isMultiValued(newValue)) -- if single-valued 
			then
				if (not thisModule.isComplexType(propertyName))  
					then
						-- CASE 1: single-valued && simple
						self.setValue(stereotype, propertyName, newValue)
					else
						-- CASE 2: single-valued && complex
						self.setValue(stereotype, propertyName, thisModule.resolveTemp(newValue, 'y').getStereotypeApplications().asSequence().first())
				endif
			else  -- if multi-valued 
				if (not thisModule.isComplexType(propertyName))  
					then
						-- CASE 3: multi-valued && simple
						self.setValue(stereotype, propertyName, newValue)
					else
						-- CASE 4: multi-valued && complex
						self.setValue(stereotype, propertyName, newValue -> collect(c | thisModule.resolveTemp(c, 'y').getStereotypeApplications().asSequence().first()))
				endif
		endif
		else OclUndefined
endif;

helper def : isMultiValued(attr : OclAny) : Boolean =
        attr.oclIsKindOf(Collection(OclAny))
;

helper def : isComplexType(taggedValueName : String) : Boolean =
        UMLMM!Property.allInstances() -> any(e|e.name = taggedValueName).type.oclIsTypeOf(UMLMM!Stereotype)
;
