このドキュメントは、オブジェクトOCL言語を使用するモデラーを対象としています。 OCL言語を使用または拡張する言語エンジニア向けの詳細なドキュメントは、ここにあります。詳細なドキュメントを読む前に、言語エンジニアがこのドキュメントを読むことをお勧めします。
ocl Bookshop {
context Shop s inv CustomerPaysBeforeNewOrder: // invariant
forall Customer c in s.customers: // quantifiers available
c.allowedToOrder implies !exists Invoice i in s.invoices:
i.buyer == c && i.moneyPayed < i.invoiceAmount ;
// Method specification for selling a book
context Invoice Stock.sellBook(String iban, int discountPercent, Customer c)
let availableBooks = // set comprehension
{ book | Book book in booksInStock, book.iban == iban }
pre: !availableBooks.isEmpty && // precondition
c.allowedToOrder;
post: let discount = (100 - discountPercent)/100; // postcondition, let
b = result.soldBook // result variable
in
!(b isin booksInStock) &&
booksInStock.size@pre == booksInStock.size + 1 && // @pre
result.invoiceAmount == b.price * discount;
}
さらなる表現の例(モンティコールのcommonexpressionsを含む):
a + 3*4; // number expressions
a >= b; a < 3; a == "myName"; // equalities
b implies (c && a) || d; // boolean expressions
forall a in S: foo(a) > 3; // quantifiers
exists a in S: foo(a) > 3;
a ?== b; c ?<= d // elvis operators (dealing with optionals)
S.first; S.size; S.addAll(T); // 30 operators for Lists
a in S; S.add(a); // + more for Sets
max(S) > 3; // + more for numbers
テキストOCL表現は、主に[Rum16、Rum17]の定義に依存しています。 OCLは、他のモデルの正確性を確認するために使用されます。ここでは、 Book
やCustomer
種類は、たとえば、クラス図で定義されています。
classdiagram Bookshop {
class Book {
String name;
String iban;
double cost;
double price;
}
class Shop;
association [1] Shop -> (invoices) Invoice [*];
association [1] Shop -> (customers) Customer [*];
class Stock {
void addBook(Book b);
Invoice sellBook(Book bookToSell, int discountPercent, Customer buyer);
}
association [1] Stock -> (booksInStock) Book [*];
class Customer {
String name;
String phoneNumber;
int customerNumber;
boolean allowedToOrder;
void payInvoice(double moneyWired, Invoice invoice);
}
class Invoice {
int invoiceNumber;
double invoiceAmount;
double moneyPayed;
}
association [1] Invoice <-> (buyer) Customer [1];
association [1] Invoice <-> (soldBook) Book [1];
}
このセクションでは、OCL言語のコマンドラインツールについて説明します。このツールは、モデルを処理するときに使用される典型的な機能を提供します。この効果のために、それはfuncionalityを提供します
OCLツールの構築と使用の要件は、(少なくとも)JDK 8(JDK 11およびJDK 14も当社によって公式にサポートされている)、GIT、およびGradleがインストールされ、BASHで使用できることです。 Dockerを使用している場合は、Java、Git、またはGradleを設置せずにDockerコンテナを使用することもできます。
次のサブセクションでは、ツールをダウンロードする方法について説明します。次に、このドキュメントでは、ソースファイルからツールを構築する方法について説明します。その後、このドキュメントには、ツールを使用するためのチュートリアルが含まれています。
ツールのすぐに使用できるバージョンは、実行可能なJARファイルの形でダウンロードできます。このダウンロードリンクを使用して、ツールをダウンロードできます。
または、 wget
使用してツールをダウンロードすることもできます。次のコマンドは、ツールの最新バージョンをダウンロードし、ワーキングディレクトリにMCOCL.jar
という名前で保存します。
wget "monticore.de/download/MCOCL.jar" -O MCOCL.jar
ツールのDocker画像の最新バージョンは、
docker pull monticore/ocl
Dockerを使用している場合は、以下でjava -jar MCOCL.jar
を置き換えます(Windows Powershell、Macターミナル、またはLinux Bashの場合)
docker run --rm -v ${PWD}:/input -w /input monticore/ocl
または(Windowsコマンドライン用)
docker run --rm -v %CD%:/input -w /input monticore/ocl
たとえば、このチュートリアルのステップ2からのこのコマンド
java -jar MCOCL.jar -i Example.ocl -pp
なります
docker run --rm -v ${PWD}:/input -w /input monticore/ocl -i Example.ocl -pp
Dockerを使用する場合。
GitHubにあるソースファイルからツールの実行可能ジャーを構築することができます。以下は、BASHを使用してソースファイルからツールを構築するプロセスについて説明します。 GitHubで利用可能なソースファイルからBASHを使用して実行可能な瓶を構築するには、次のコマンドを実行します。
まず、リポジトリをクローンします。
git clone https://github.com/MontiCore/ocl.git
ディレクトリをクローンソースのルートディレクトリに変更します。
cd OCL
次に、実行してプロジェクトを構築します(情報:Gradleをインストールする必要があります):
gradle build
おめでとう!これで、ディレクトリtarget/libs
( cd target/libs
を介してアクセス可能)で実行可能なJARファイルMCOCL.jar
を見つけることができます。
前のセクションでは、実行可能なJARファイル(OCLコマンドラインツール)を取得する方法について説明します。このセクションでは、OCLツールを使用するためのチュートリアルを提供します。次の例は、あなたがTool MCOCL
にローカルに命名されたことを前提としています。ソースからツールを作成したり、上記のwget
コマンドを使用したりする場合は、大丈夫です。ツールを手動でダウンロードした場合は、ダウンロードした瓶の名前を変更することを検討する必要があります。
オプションなしでJARファイルを実行すると、使用情報が表示されます
コンソールへのツール:
$ java -jar MCOCL.jar
usage: OCLTool
-c,--coco <arg> Checks the CoCos for the input. Optional
arguments are:
-c intra to check only the intra-model CoCos,
-c inter checks also inter-model CoCos,
-c type (default) checks all CoCos.
-cd4c,--cd4code Load symbol kinds from CD4C. Shortcut for loading
CDTypeSymbol as TypeSymbol,
CDMethodSignatureSymbol as FunctionSymbol, and
FieldSymbol as VariableSymbol. Furthermore,
warnings about not deserializing
CDAssociationSymbol and CDRoleSymbol will be
ignored.
-d,--dev Specifies whether developer level logging should
be used (default is false)
-fs,--functionSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
FunctionSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-h,--help Prints this help dialog
-i,--input <files> Processes the list of OCL input artifacts.
Argument list is space separated. CoCos are not
checked automatically (see -c).
-is,--ignoreSymKind <fqns> Takes the fully qualified name of one or more
symbol kind(s) for which no warnings about not
being able to deserialize them shall be printed.
Allows cleaner outputs. Multiple symbol kinds
should be separated by spaces.
-p,--path <directory> Sets the artifact path for imported symbols.
Directory will be searched recursively for files
with the ending ".*sym" (for example ".cdsym" or
".sym"). Defaults to the current folder.
-pp,--prettyprint <files> Prints the OCL model to stdout or the specified
file(s) (optional). Multiple files should be
separated by spaces and will be used in the same
order in which the input files (-i option) are
provided.
-s,--symboltable <files> Stores the symbol tables of the input OCL
artifacts in the specified files. For each input
OCL artifact (-i option) please provide one
output symbol file (using same order in which the
input artifacts are provided) to store its
symbols in. For example, -i x.ocl y.ocl -s
a.oclsym b.oclsym will store the symbols of x.ocl
to a.oclsym and the symbols of y.ocl to b.oclsym.
Arguments are separated by spaces. If no
arguments are given, output is stored to
'target/symbols/{packageName}/{artifactName}.ocls
ym'.
-ts,--typeSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
TypeSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-vs,--variableSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
VariableSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
適切に動作するには、ツールには必須の引数が必要です-i,--input <file>
。これにより、SDモデルを含む少なくとも1つの入力ファイルのファイルパスが表示されます。他の引数が指定されていない場合、ツールはモデルのみを解析します。
これを試してみるには、 MCOCL.jar
選択したディレクトリにコピーします。その後、次の簡単なOCLを含む作成します。
ocl Example {
}
MCOCL.jar
が配置されているディレクトリのExample.ocl
としてテキストファイルを保存します。
次のコマンドを実行します。
java -jar MCOCL.jar -i Example.ocl
ツールがコンソールへの出力を印刷しないことに気付くかもしれません。これは、ツールがファイルExample.ocl
を正常に解析したことを意味します。
このツールは、OCL言語にきれいなプリンターを提供します。たとえば、OCLを含むファイルのフォーマットを修正するために、きれいなプリンターを使用できます。きれいなプリンターを実行するには、 -pp,--prettyprint
オプションを使用できます。引数なしでオプションを使用すると、コンソールへの入力ファイルに含まれるモデルがかなりプリントされます。
これを試すために次のコマンドを実行します。
java -jar MCOCL.jar -i Example.ocl -pp
コマンドは、コンソールへの入力ファイルに含まれるかなりプリントされたモデルを印刷します。
ocl Example {
}
入力ファイルに含まれるモデルを出力ファイルにかなりプリントすることができます。このタスクでは、出力ファイルの名前を-pp,--prettyprint
オプションの引数として提供することができます。出力ファイルの引数が提供されている場合、出力ファイルの数は入力ファイルの数に等しくなければなりません。 i番目の入力ファイルは、i番目の出力ファイルにかなり印刷されています。
これを試すために次のコマンドを実行します。
java -jar MCOCL.jar -i Example.ocl -pp Output.ocl
コマンドは、入力ファイルに含まれるかなり印刷されたモデルをファイルOutput.ocl
に印刷します。
コンテキスト条件をチェックするには、 -c,--coco <arg>
オプションを使用できます。引数なしでこのオプションを使用すると、モデルがすべてのコンテキスト条件を満たすかどうかを確認します。
モデルがコンテキスト条件のサブセットのみを満たしているかどうかを確認するか、すべてのコンテキスト条件をチェックする必要があることを説明したい場合のみ、3つの引数のいずれかをintra
、 inter
、およびtype
提供することでこれを行うことができます。
intra
が実行されます。たとえば、これらのコンテキスト条件では、命名規則を確認します。inter
すべてのモデル内コンテキスト条件を実行し、コンストラクター署名のタイプ名が定義されているかどうかをさらにチェックします。type
を使用すると、すべてのコンテキストの分配が実行されます。これらのコンテキスト条件には、使用されるタイプとメソッドが存在するかどうかを確認することが含まれます。引数type
使用するときの動作は、引数を使用しない場合のデフォルトの動作に等しくなります。簡単な例を試すために、次のコマンドを実行します。
java -jar MCOCL.jar -i Example.ocl -c -cd4c
このコマンドを実行すると、ツールがコンソールに何も印刷されていないことに気付くかもしれません。これは、モデルがすべてのコンテキストコンディションを満たすことを意味します。
ここで、より複雑な例を考えてみましょう。上記のAn Example Model
セクションからOCL Bookshop
思い出してください。継続するには、OCL Bookshop
のテキスト表現をコピーし、ファイルMCOCL.jar
が配置されているディレクトリのファイルBookshop.ocl
に保存します。このためには、 Bookshop.ocl
に対応するクラス図のシンボルを含むシンボルファイルが必要です。これについては、次のセクションで詳しく説明します。とりあえず、 -p src/test/resources/docs/Bookshop/ -cd4c
をコマンドに追加するだけで、この例に合わせて準備されたシンボルファイルを見つける場所とそれを処理する方法をツールに伝えます。
-c,--coco <arg>
オプションを使用して、さまざまな種類のコンテキスト条件を確認できます。
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c intra
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c inter
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c type
これらのコマンドはどれも出力を生成しません。
エラーを確認すると、モデルにミスを追加できます。この行をBookshop.ocl
に置き換えます
{ book | Book book in booksInStock, book.iban == iban }
による
{ book2 | Book book in booksInStock, book.iban == iban }
book2
が未定義であるため、COCOSをチェックするときにツールがエラーメッセージを印刷する必要があります。
$ java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c
[INFO] DeriveSymTypeOfExpression package suspected
[ERROR] 0xA0309 Bookshop.ocl:<13,12> Could not calculate type of expression "book2" on the left side of SetComprehension
「間違い」を元に戻すことを忘れないでください。
このセクションでは、シンボルパスを使用し、必要なタイプ情報を含む別のモデルのシンボルファイル(保存されたシンボルテーブル)をツールに提供します。
ツールMCOCL.jar
が配置されているディレクトリに新しいディレクトリmytypes
を作成します。たとえば、最初のセクションのBookshop.ocl
例には、データ型を指定したクラス図が必要でした。このクラスダイアグラムファイルは、SRC/TEST/RESOASHN/DOCS/BOOKSHOP/BOOKSHOP.CDの下で見つけることができます。
OCLで使用するには、最初にシンボルファイルに情報を変換する必要があります。クラス図のシンボルファイルBookshop.sym
OCLでそのタイプを使用するために必要なすべてのタイプ情報を提供します。この時点でCDツールに参加したくない場合は、SRC/test/resources/docs/bookshop/bookshop.symですぐに使用できるファイルを見つけることもできます。 mytypes
フォルダーにコピーするだけです。それ以外の場合は、クラス図をシンボルファイルに変換するには、CD4AnalysisプロジェクトからMCCD.jar
使用し、次のコマンドを使用してクラス図ファイルを変換する必要があります。
java -jar MCCD.jar -d false --fieldfromrole navigable -i src/test/resources/docs/Bookshop/Bookshop.cd -s mytypes/Bookshop.sym
シンボルファイルの内容は、言語ユーザーとしてあなたにとって重要なことです。好奇心が強く、シンボルファイルを調べた場合には、シンボルファイルには、モデルで定義されたシンボルのJSON表現が含まれています。この場合、シンボルファイルには定義された型に関する情報が含まれています。通常、Monticore言語のツールはこれらのファイルの内容を自動的に生成し、言語ユーザーとしてのあなたはその内容に関心を持ってはなりません。
シンボルファイルを含むディレクトリ構造を含むパスは、「シンボルパス」と呼ばれます。ツールへのシンボルパスを提供すると、シンボルパスに含まれるディレクトリに保存されるシンボルファイルのシンボルを検索します。したがって、ツールがシンボルファイルを見つけたい場合は、 --path <directory>
オプションを介してツールへのモデルパスを提供する必要があります。作成したばかりのmytypes
フォルダーを使用して試してみることができます。
java -jar MCOCL.jar -i Bookshop.ocl --path <SYMBOLPATH> -c type -cd4c
ここで、 <SYMBOLPATH>
は、ダウンロードされたシンボルファイルを保存したパスです。この例では、モデルをディレクトリmytypes
に保存した場合は、次のコマンドを実行します。
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
このコマンドは-cd4c
フラグも使用していることに注意してください。 OCLツールに提供されるシンボルファイルを解釈するには、CDツールによって保存されているシンボルを解釈する方法を理解する必要があります。 -cd4c
フラグは、CD4コードに対してこれを行うための速記です。 --typeSymbol
、 --functionSymbol
TypeSymbol
、および--variableSymbol
フラグをVariableSymbol
して手動FunctionSymbol
行うこともできます。
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol <TYPE_SYMBOL_KINDS> --variableSymbol <VAR_SYMBOL_KINDS> --functionSymbol <FUNC_SYMBOL_KINDS>
ここで、 <TYPE_SYMBOL_KINDS>
、 <VAR_SYMBOL_KINDS>
、および<FUNC_SYMBOL_KINDS>
は、記号の完全に適格な名前です。複数のシンボルタイプを提供する場合は、スペースで区切って追加するだけです。私たちの例では、CD4analysisからシンボルを宣言することは次のようになります。
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol
このツールは、解釈できないシンボルに多くの警告を生成するようになりました。異なる言語のすべてのシンボルがOCLで興味深いわけではありません。これらの意図しない警告を抑制するために、 --ignoreSymKind <SYM_KINDS_TO_IGNORE>
オプションを使用してそれらを受け取ることを望まないシンボルの種類についてOCLツールを伝えることができます。私たちの例では、これは次のようになります。
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol --ignoreSymKind de.monticore.cdassociation._symboltable.CDAssociationSymbol de.monticore.cdassociation._symboltable.CDRoleSymbol
毎日の使用のために、これは少し複雑です。したがって、 -cd4c
フラグはこれを減らすことができることを忘れないでください
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
前のセクションでは、既存のシンボルファイルからシンボルをロードする方法について説明します。次に、このツールを使用して、 Bookshop.ocl
モデルにシンボルファイルを保存します。保存されたシンボルファイルには、OCLファイルで定義されているオブジェクトに関する情報が含まれます。これらのオブジェクト定義によって導入されたシンボルを使用するために、他のモデルによってインポートできます。これは、シンボルファイルのBookshop.sym
に含まれるシンボルをインポートするためにファイルBookshop.ocl
変更する方法と同様です。
-s,-symboltable <file>
オプションを使用すると、入力モデルのシンボルテーブルが作成され、引数として与えられたファイルパスにそれらを保存します。ファイルパスを提供する必要はないか、入力モデルごとに1つのファイルパスを提供する必要があります。 i番目の入力モデルのシンボルファイルは、i番目のファイルパスで定義されたファイルに保存されます。ファイルパスを提供しない場合、ツールは各入力packageName
のシンボルテーブルをシンボルファイルtarget/symbols/{packageName}/{fileName}.oclsym
に保存します。モデルとfileName
モデルを含むファイルの名前です。ファイルは、ワーキングディレクトリ、つまりシンボルファイルを保存するためにコマンドを実行するディレクトリに関連して保存されます。さらに、シンボルを適切に保存するには、すべての点でモデルを適切に形成する必要があるため、すべてのコンテキスト条件が事前にチェックされていることに注意してください。
Bookshop.ocl
のシンボルファイルを保存するには、次のコマンドを実行します(暗黙のコンテキスト条件チェックは、シンボルパスオプションを使用して必要です):
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -cd4c -s
このツールは、ファイルtarget/symbols/docs/Bookshop.oclsym
を生成します。これは、OCLファイルのBookshop
で定義されているオブジェクトの一部を使用する必要があるモデルなど、他のモデルによってインポートできます。
たとえば、ファイルsyms/Bookshop.oclsym
にBookshop.ocl
のシンボルファイルを保存するには、次のコマンドを実行します(繰り返しますが、暗黙のコンテキスト条件チェックには、シンボルパスオプションを使用して必要です):
java -jar MCOCL.jar -i Bookshop.ocl -path mytypes -cd4c -s syms/Bookshop.oclsym
おめでとうございます、SDシンボルファイルの保存に関するチュートリアルを終了しました!