/*******************************************************************************
 * Copyright (c) 2007,2008 Tata Consultancy Services and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *     TCS - initial implementation for ModelMorf
 *     E.D.Willink - alignment with evolved specification
 *******************************************************************************/
import ecoreMM : 'http://www.eclipse.org/emf/2002/Ecore'; 
import umlmmmi : 'umlMM.emof'::umlmmmi; 
import javammsi : 'javaMM.emof'::javammsi; 

/*
 * This rewrite of ModelMorf's MiToSi example avoids complexities by doing one thing per relation.
 */
transformation MiToSiSimple(uml:{umlmmmi,ecoreMM}, java:javammsi)
{
--	key umlmmmi::Class {name};
--	key javammsi::Class {name};
--	key javammsi::Interface {name};

	/**
	 * Return true if this class or a transitive super-class is marked as DomainRoot. 
	 */
	 query isClass(c : umlmmmi::Class) : Boolean {
		c->closure(supers)->exists(type = 'DomainRoot')		
	}

	/**
	 * Create a Package for each Package.
	 */
	top relation PackageToPackage
	{
		n : String;
		domain uml p1:Package {
			name = n
		};	
		enforce domain java p2:Package {
			name = n
		};
	}

	/**
	 * Create a Class for each isClass() class.
	 */
	top relation ClassToClass
	{
		n : String;
		domain uml c1:Class {
			containingPackage = p1:Package{},
			name = n
		}
		{isClass(c1)};		
		enforce domain java c2:Class {
			containingPackage = p2:Package{},
			name = n
		};
		when {
			PackageToPackage(p1, p2);
		}
	}

	/**
	 * Create an Interface for each non-isClass() class.
	 */
	top relation ClassToInterface
	{
		n : String;
		domain uml c1:Class {
			containingPackage = p1:Package{},
			name = n
		}
		{not isClass(c1)};		
		enforce domain java c2:Interface {
			containingPackage = p2:Package{},
			name = n
		};
		when {
			PackageToPackage(p1, p2);
		}
	}

	/**
	 * Define a Class::extends relationship for each class with a super-class
	 */
	top relation ClassExtends
	{
		c1sup: umlmmmi::Class;
		c2sup: javammsi::Class;
		domain uml c1:Class {
			supers = s1:Set(Class){c1sup ++ _}
		};
		enforce domain java c2:Class {
			extends = s2:Set(Class){c2sup ++ _}
		};
		when {
			ClassToClass(c1, c2);
			ClassToClass(c1sup, c2sup);
		}
	}

	/**
	 * Define a Class::implements relationship for each class with a super-interface
	 */
	top relation ClassImplements
	{
		c1sup: umlmmmi::Class;
		c2sup: javammsi::Interface;
		domain uml c1:Class {
			supers = s1:Set(Class){c1sup ++ _}
		};
		enforce domain java c2:Class {
			implements = s2:Set(Interface){c2sup ++ _}
		};
		when {
			ClassToClass(c1, c2);
			ClassToInterface(c1sup, c2sup);
		}
	}

	/**
	 * Define a Interface::extends relationship for each interface with a super-interface
	 */
	top relation InterfaceExtends
	{
		c1sup: umlmmmi::Class;
		c2sup: javammsi::Interface;
		domain uml c1:Class {
			supers = s1:Set(Class){c1sup ++ _}
		};
		enforce domain java c2:Interface {
			extends = s2:Set(Interface){c2sup ++ _}
		};
		when {
			ClassToInterface(c1, c2);
			ClassToInterface(c1sup, c2sup);
		}
	}
}
