/**
 * Copyright (c) 2009, 2012 Borland Software Corporation & 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 *    Guillaume Hillairet (Montages A.G.)
 */
library ValueExpressions;

modeltype GMFMAP uses mappings('http://www.eclipse.org/gmf/2006/mappings');
modeltype GMFGEN uses gmfgen('http://www.eclipse.org/gmf/2009/GenModel');

--	
--	ValueExpression
--

mapping GMFMAP::ValueExpression::createValueExpression(): GMFGEN::ValueExpression 
	disjuncts 
		GMFMAP::ValueExpression::createGenValueExpression, GMFMAP::Constraint::createConstraint
	{}

mapping GMFMAP::ValueExpression::createGenValueExpression(): GMFGEN::ValueExpression
when {
	self.oclIsTypeOf(ValueExpression)
}
{
		body := self.body;
}

mapping GMFMAP::Constraint::createConstraint(): GMFGEN::GenConstraint {
	body := self.body;
}

mapping GMFMAP::ValueExpression::createExpressionProvider(): GenExpressionProviderBase {
	init {
		switch {
			case (self.language = Language::java) { result := object GenJavaExpressionProvider {} };
			case (self.language = Language::ocl) { result := object GenExpressionInterpreter { language := self.language() } };
			case (self.language = Language::regexp) { result := object GenExpressionInterpreter { language := self.language() } };
			case (self.language = Language::nregexp) { result := object GenExpressionInterpreter { language := self.language() } };
			case (self.language = Language::_literal) { result := object GenLiteralExpressionProvider {} };
			else { result := object GenExpressionInterpreter {}; }
		};
	}
	
	expressions += ValueExpression.allInstances()->select(e | e.language = self.language)->map createValueExpression();
}

-- 
-- Constraints and initializers
-- 

mapping GMFMAP::LinkConstraints::structure() : GMFGEN::GenLinkConstraints {
	sourceEnd := self.sourceEnd.map createConstraint();
	targetEnd := self.targetEnd.map createConstraint();
}

--	
--	Helpers
--

helper GMFMAP::ValueExpression::language(): GenLanguage =
	switch {
		case (self.language = Language::java) GenLanguage::java;
		case (self.language = Language::ocl)  GenLanguage::ocl;
		case (self.language = Language::regexp) GenLanguage::regexp;
		case (self.language = Language::nregexp) GenLanguage::nregexp;
		case (self.language = Language::_literal) return GenLanguage::_literal;
		else GenLanguage::ocl;
	};
	