Разобрать OCL в Java?

Я пишу Java-программу для курса, который использует диаграмму классов UML, которая является метамоделью, в качестве входных данных и позволяет пользователю создавать диаграммы типа, указанного в метамодели. Затем пользователь должен иметь возможность моделировать экземпляры того, что моделирует эта диаграмма.

Таким образом, я анализирую сгенерированный файл XML, представляющий UML, и извлекаю все классы и ассоциации. Все идет нормально.

Но есть ограничения, о которых мне нужно знать и предупреждать, когда пользователь их нарушает. Однако я понятия не имею, как выполнять синтаксический анализ OCL. Я просмотрел dresden OCL, но я не уверен, что это то, что мне нужно, так как мне нужно для анализа OCL во время выполнения, в отличие от импорта модели и генерации кода Java из OCL с использованием eclipse.

Таким образом, я был бы очень признателен, если бы кто-нибудь мог указать мне способ разбора OCL и извлечения его основного синтаксиса.

С уважением, Жоао Фернандес


person JSFernandes    schedule 31.10.2013    source источник


Ответы (2)


проект Eclipse OCL обеспечивает автономное использование (просто Java-программа вне Eclipse) и есть некоторая документация и примеры о том, как это сделать.

В частности, см. следующие ссылки о:

Пример использования Jave API, взятый из справки, чтобы показать, как можно создавать и оценивать инварианты и запросы:

OCL ocl = OCL.newInstance(new PivotEnvironmentFactory());
OCLHelper helper = ocl.createOCLHelper(EXTLibraryPackage.Literals.LIBRARY);
ExpressionInOCL invariant = helper.createInvariant(
    "books->forAll(b1, b2 | b1 <> b2 implies b1.title <> b2.title)");
ExpressionInOCL query = helper.createQuery(
    "books->collect(b : Book | b.category)->asSet()");

// create a Query to evaluate our query expression
Query queryEval = ocl.createQuery(query);
// create another to check our constraint
Query constraintEval = ocl.createQuery(invariant);

List<Library> libraries = getLibraries();  // hypothetical source of libraries
// only print the set of book categories for valid libraries
for (Library next : libraries) {
   if (constraintEval.check(next)) {
      // the OCL result type of our query expression is Set(BookCategory)
      @SuppressWarnings("unchecked")
      Set<BookCategory> categories = (Set<BookCategory>) queryEval.evaluate(next);

      System.out.printf("%s: %s%n", next.getName(), categories);
   }
}
person ASBH    schedule 03.11.2013
comment
Большое спасибо за развернутый ответ, думаю, теперь я сам справлюсь :) - person JSFernandes; 04.11.2013
comment
Было бы лучше опубликовать ссылку напрямую, например. на случай, если goo.gl прекратит обслуживание в один прекрасный день. - person Beeno Tung; 07.03.2018

Взгляните на компонент Eclipse OCL (он предлагает функцию проверки, которая оценивает, удовлетворяет ли модель/экземпляр правилам правильности метамодели/модели) и инструмент USE (который был создан специально для того, чтобы позволить людям играть и учиться с помощью OCL, позволяя им оценивать выражения OCL на наборах экземпляров, чтобы увидеть эффект выражения). Оба с открытым исходным кодом.

person Jordi Cabot    schedule 02.11.2013