rule Model2EPackage 
	transform m : ArgoUML!Model
	to p : Ecore!EPackage {
	
	p.name = m.name;
	p.nsURI = m.name;
	p.nsPrefix = "";
	p.eClassifiers.addAll(m.ownedElement.equivalent());
}

rule Class2EClass
	transform c : ArgoUML!Class
	to ec : Ecore!EClass {
	
	ec.name = c.name;
	ec.`abstract` = c.isAbstract;
}

rule Attribute2EAttribute
	transform a : ArgoUML!Attribute
	to ea : Ecore!EAttribute {
	
	ea.name = a.name;
	ea.eType = a.type.name.getEDataType();
	ea.lowerBound = a.multiplicity.range[0].lower;
	ea.upperBound = a.multiplicity.range[0].upper;
	a.owner.equivalent().eStructuralFeatures.add(ea); 
}

rule AssociationEnd2EReference
	transform ae : ArgoUML!AssociationEnd
	to er : Ecore!EReference {
	
	// We are only interested in
	// named association ends
	guard : ae.name.isDefined()
	
	er.name = ae.name;
	er.eType ::= ae.participant;
	er.lowerBound = ae.multiplicity.range[0].lower;
	er.upperBound = ae.multiplicity.range[0].upper;
	ae.getOpposite().participant.equivalent().
		eStructuralFeatures.add(er);
		
	if (ae.getOpposite().name.isDefined()) {
		er.eOpposite = ae.getOpposite().equivalent();
	}
	
	er.containment = (ae.getOpposite().aggregation == ArgoUML!AggregationKind#ak_composite);
}

rule Generalisation2Extension
	transform g : ArgoUML!Generalization 
	to nothing : Sequence {
	
	g.child.equivalent().eSuperTypes.add(g.parent.equivalent());
}

rule Enumeration2EEnum
	transform e : ArgoUML!Enumeration
	to ee : Ecore!EEnum {

	ee.name = e.name;
}

rule EnumerationLiteral2EEnumLiteral
	transform l : ArgoUML!EnumerationLiteral
	to el : Ecore!EEnumLiteral {
	
	el.name = l.name;
	var eLiterals = l.enumeration.equivalent().eLiterals;
	eLiterals.add(el);
	el.value = eLiterals.size();
}


operation ArgoUML!AssociationEnd getOpposite() {
	return self.association.connection.
		selectOne(ae|ae <> self);
}

@cached
operation String getEDataType() {

	var enumeration = ArgoUML!Enumeration.all.selectOne(e|e.name = self);
	if (enumeration.isDefined()) {
		return enumeration.equivalent();
	}
	else {
		var edt = new Ecore!EDataType;
		edt.name = self;
		edt.instanceClassName = "java.lang." + self;
		Ecore!EPackage.all.first().println().eClassifiers.add(edt);
		return edt;
	}
}