Hola a todos.
Estoy llevando a cabo un proyecto sobre UML. Para tener una base sobre la que poder construirlo, decidí utilizar las librerías de ArgoUML, un software open source bastante conocido. Lo que me interesaba era utilizar la lógica de negocio para después incluir una capa de vista personalizada por encima.
ArgoUML utiliza una interfaz para interactuar con los modelos, de forma que la implementación concreta queda oculta. Es, básicamente, un patrón adapter para las librerías que pueda usar.
Utilizando la implementación MDR, no he tenido ningún problema. La única pega es que sólo soporta UML 1.x. Por eso, me decidí a ccambiar a la implementación eUML, que soporta UML 2.x, ya que me es necesario.
El problema viene cuando intento guardar el modelo en un archivo XMI, que es el estándar para el intercambio de modelos UML. Me salta la siguiente excepcióm:
org.argouml.model.UmlException: Root container is not affiliated with any resource!
at org.argouml.model.euml.XmiWriterEUMLImpl.write(XmiWriterEUMLImpl.java:75)
at pruebas.PruebaArgo.main(PruebaArgo.java:95)
El código de la prueba es el siguiente, que como digo, sí que funciona con MDR:
public static void main(String[] args) {
// initialize model subsystem
Throwable error = Model
.initialise("org.argouml.model.euml.EUMLModelImplementation");
if (error != null) {
// need to be handled
System.out.println(error.toString());
return;
}
// create a model
Object model = Model.getModelManagementFactory().createModel();
Model.getCoreHelper().setName(model, "drivingModel");
// Create classes.
Object cPerson = Model.getCoreFactory().buildClass("Person", model);
Object cDriver = Model.getCoreFactory().buildClass("Driver", model);
Object cCar = Model.getCoreFactory().buildClass("Car", model);
Object mInterface = Model.getCoreFactory().buildInterface("MyInterface", model);
Model.getCoreFactory().buildGeneralization(cDriver, cPerson);
// Model.getCoreFactory().buildGeneralization(mClass2, mInterface);
Model.getCoreFactory().buildAssociation(cCar, Model.getAggregationKind().getNone(), cDriver, Model.getAggregationKind().getNone(), true);
// Create native types.
Object tInt = Model.getCoreFactory().buildDataType("int", model);
Object tFloat = Model.getCoreFactory().buildDataType("float", model);
Object tString = Model.getCoreFactory().buildDataType("String", model);
Object tDate = Model.getCoreFactory().buildDataType("Date", model);
Object tVoid = Model.getCoreFactory().buildDataType("void", model);
// Create attributes.
Object aName = Model.getCoreFactory().buildAttribute2(cPerson, tString);
Model.getCoreHelper().setName(aName, "name");
Model.getCoreHelper().setVisibility(aName, Model.getVisibilityKind().getPrivate());
// Model.getCoreHelper().setStatic(mAttr, false);
// Model.getCoreHelper().setReadOnly(mAttr, true);
Object aAge = Model.getCoreFactory().buildAttribute2(cPerson, tInt);
Model.getCoreHelper().setName(aAge, "age");
Model.getCoreHelper().setVisibility(aAge, Model.getVisibilityKind().getPrivate());
Object aLicenceDate = Model.getCoreFactory().buildAttribute2(cDriver, tDate);
Model.getCoreHelper().setName(aLicenceDate, "licenceDate");
Model.getCoreHelper().setVisibility(aLicenceDate, Model.getVisibilityKind().getPrivate());
Object aModel = Model.getCoreFactory().buildAttribute2(cCar, tString);
Model.getCoreHelper().setName(aModel, "model");
Model.getCoreHelper().setVisibility(aModel, Model.getVisibilityKind().getPrivate());
Object aPrice = Model.getCoreFactory().buildAttribute2(cCar, tFloat);
Model.getCoreHelper().setName(aPrice, "price");
Model.getCoreHelper().setVisibility(aPrice, Model.getVisibilityKind().getPrivate());
// create operations.
Object oSetName = Model.getCoreFactory().buildOperation2(cPerson, tVoid, "setName");
Model.getCoreFactory().buildParameter(oSetName, tString);
Object oGetName = Model.getCoreFactory().buildOperation2(cPerson, tString, "getName");
Object oObtainLicence = Model.getCoreFactory().buildOperation2(cDriver, tVoid, "obtainLicence");
Model.getCoreFactory().buildParameter(oObtainLicence, tDate);
Object oBuyCar = Model.getCoreFactory().buildOperation2(cDriver, tVoid, "buyCar");
Model.getCoreFactory().buildParameter(oBuyCar, cCar);
JsonBuilderHandler builder = new JsonBuilderHandler(new ClassifierJsonBuilder(cDriver));
System.out.println(builder.buildJson());
// export to XMI
try {
File file = new File("drivers.xmi");
FileOutputStream stream = new FileOutputStream(file);
XmiWriter xmiWriter = Model
.getXmiWriter(model, stream, "myVersion");
xmiWriter.write();
stream.flush();
stream.close();
System.out.println("Wrote file: " + file.getAbsolutePath());
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
Sé que las operaciones que realizo tienen efecto porque, como veis, construyo un JSON con la información de una de las cclases y sale todo como debe. Así que, supongo que debe ser algún tema de configuración interna de eUML, pero no encuentro mucha documentación al respecto.
Sé que es una pregunta muy específica, pero ojalá alguien me pueda responder, porque estoy u poquito desesperado.