entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problema al generar archivo XMI con EUML y ArgoUML

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.

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola Kaiba,

la verdad es que no me había topado antes con este tipo de problemas, pero uso XML en Java pra otros usos por lo general.

Encontré este thread con una conversación interesante al respecto: http://argouml.tigris.org/ds/viewMessage.do?dsForumId=448&dsMessageId=1382453

La cuestión parece pasar porque en la nueva implementación de EUML, la carga del Modelo se delegó a un subsistema, lo que significa que el código asume que solo se trabaja con un XML.

Para trabajar con varios archivos hay que crear un profile, pero no estoy familiarizado con esta nueva implementación para ayudarte con código :-(

Espero que la pista te sirva!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta