I have a metamodel that references several other metamodels. I want to evolve the metamodel to a new version. This works with a simple metamodel, i.e. one containing no references to other metamodels. But it breaks when I try to migrate models based on complex metamodels, i.e. ones with dependencies.
Let's assume the simplest possible case: The only change is to the NSURI, so I have an empty Flock file.
Simple example:
Original metamodel:
@namespace(uri="http://simplemetamodel/1.0", prefix="simplemetamodel")
package simplemetamodel;
class Something {
attr String name;
}
Migrated Metamodel:
@namespace(uri="http://simplemetamodel/2.0", prefix="simplemetamodel")
package simplemetamodel;
class Something {
attr String name;
}
Original model:
@Spec {
metamodel "http://simplemetamodel/1.0" {
nsUri: "http://simplemetamodel/1.0"
}
}
package {
Something "Simple" {
name: "Simple"
}
}
Migrated model:
@Spec {
metamodel "http://simplemetamodel/2.0" {
nsUri: "http://simplemetamodel/2.0"
}
}
package {
Something "Simple" {
name: "Simple"
}
}
Complex example:
External metamodel:
@namespace(uri="http://externalmetamodel/1.0", prefix="externalmetamodel")
package externalmetamodel;
class Peer {
attr String name;
}
Original metamodel:
@namespace(uri="http://complexmetamodel/1.0", prefix="complexmetamodel")
package complexmetamodel;
import "platform:/resource/flock.update.example/model/ExternalMetamodel.ecore";
class Something {
attr String name;
ref externalmetamodel.Peer referenced;
}
Migrated metamodel:
@namespace(uri="http://complexmetamodel/2.0", prefix="complexmetamodel")
package complexmetamodel;
import "platform:/resource/flock.update.example/model/ExternalMetamodel.ecore";
class Something {
attr String name;
ref externalmetamodel.Peer referenced;
}
External model:
@Spec {
metamodel "http://externalmetamodel/1.0" {
nsUri: "http://externalmetamodel/1.0"
}
}
package {
Peer "Foo" {
name: "Foo"
}
}
Original model:
@Spec {
metamodel "http://complexmetamodel/1.0" {
nsUri: "http://complexmetamodel/1.0"
}
metamodel "http://externalmetamodel/1.0" {
nsUri: "http://externalmetamodel/1.0"
}
}
package {
Something "Complex" {
name: "Complex"
referenced: Peer "PeerOne.model#_dMKaUFKZEeGB5seTnKLM5Q"
}
}
Migrated model:
@Spec {
metamodel "http://complexmetamodel/2.0" {
nsUri: "http://complexmetamodel/2.0"
}metamodel "http://externalmetamodel/1.0" {
nsUri: "http://externalmetamodel/1.0"
}
}
package {
Something "Complex" {
name: "Complex"
}
Peer "Foo" {
name: "Foo"
}
}
package {
}
As you can see, that's all wrong. Since the syntax of Flock remains somewhat undocumented, I'm hoping there's some simple workaround?
Regards,
Mark Tippetts