transformation lateresolve;

modeltype SIMPLEUML uses 'http://www.eclipse.org/qvt/1.0.0/Operational/examples/simpleuml';

mapping main(in model: simpleuml::Model): simpleuml::Model {
	name := model.name;
	stereotype := model.stereotype;
	taggedValue := model.taggedValue;
	ownedElements += model.ownedElements->select(oclIsKindOf(simpleuml::Package))->
		collect(p | package2package(p.oclAsType(simpleuml::Package)))->asOrderedSet();
	ownedElements += model.ownedElements->select(oclIsKindOf(simpleuml::Class))->
		collect(p | p.oclAsType(simpleuml::Class).class2class())->asOrderedSet();
}

mapping package2package(in pack: simpleuml::Package): simpleuml::Package {
	name := pack.name;
	stereotype := pack.stereotype;
	taggedValue := pack.taggedValue;
	ownedElements += pack.ownedElements->select(oclIsKindOf(simpleuml::Package))->
		collect(p | package2package(p.oclAsType(simpleuml::Package)))->asOrderedSet();
	ownedElements += pack.ownedElements->select(oclIsKindOf(simpleuml::Class))->
		collect(p | p.oclAsType(simpleuml::Class).class2class())->asOrderedSet();
}

mapping simpleuml::Class::class2class(): simpleuml::Class {
	name := self.name;
	_abstract := self._abstract;
	stereotype := self.stereotype;
	taggedValue := self.taggedValue;
	generalizations := self.generalizations->collect(g | object simpleuml::Generalization {
		general := g.general.late resolveone(simpleuml::Class);
	})->asOrderedSet();
}

