Как я могу выполнить итерацию по моей модели emf из редактора gmf без анализа файла модели xml?

Я успешно создал редактор GMF, который рисует модели, основанные на моей модели EMF. Что я хотел сделать, так это перебирать EClasses моей модели. Может ли это быть достигнуто во время выполнения с помощью кода моего плагина, не читая XML-файл, который редактор gmf создает? Есть ли такой API от EMF?

1 ответ

Решение

Когда вы генерируете тестовый код из файла genmodel, то внутри плагина XYZ.test есть такой тип кода, который я искал. Он проходит через файл xmi вашей модели

// Create a resource set to hold the resources.
    //
    ResourceSet resourceSet = new ResourceSetImpl();

    // Register the appropriate resource factory to handle all file extensions.
    //
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put
        (Resource.Factory.Registry.DEFAULT_EXTENSION, 
         new XMIResourceFactoryImpl());

    // Register the package to ensure it is available during loading.
    //
    resourceSet.getPackageRegistry().put
        (XYZmetamodelPackage.eNS_URI, 
         XYZmetamodelPackage.eINSTANCE);

    // If there are no arguments, emit an appropriate usage message.
    //
    if (args.length == 0) {
        System.out.println("Enter a list of file paths or URIs that have content like this:");
        try {
            Resource resource = resourceSet.createResource(URI.createURI("http:///My.metamodel"));
            ModelObject root = atagmetamodelFactory.eINSTANCE.createModelObject();
            resource.getContents().add(root);
            resource.save(System.out, null);
        }
        catch (IOException exception) {
            exception.printStackTrace();
        }
    }
    else {
        // Iterate over all the arguments.
        //
        for (int i = 0; i < args.length; ++i) {
            // Construct the URI for the instance file.
            // The argument is treated as a file path only if it denotes an existing file.
            // Otherwise, it's directly treated as a URL.
            //
            File file = new File(args[i]);
            URI uri = file.isFile() ? URI.createFileURI(file.getAbsolutePath()): URI.createURI(args[i]);

            try {
                // Demand load resource for this file.
                //
                Resource resource = resourceSet.getResource(uri, true);
                System.out.println("Loaded " + uri);

                // Validate the contents of the loaded resource.
                //
                for (EObject eObject : resource.getContents()) {
                    Diagnostic diagnostic = Diagnostician.INSTANCE.validate(eObject);
                    if (diagnostic.getSeverity() != Diagnostic.OK) {
                        printDiagnostic(diagnostic, "");
                    }
                }
            }
            catch (RuntimeException exception) {
                System.out.println("Problem loading " + uri);
                exception.printStackTrace();
            }
        }
    }
}
Другие вопросы по тегам