이 문서는 객체 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;
}
추가 표현 예제 (Monticore 's 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 언어의 명령 줄 도구에 대해 설명합니다. 이 도구는 모델을 처리 할 때 사용되는 일반적인 기능을 제공합니다. 이 효과를 위해, 그것은 기능을 제공합니다
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 pull monticore/ocl
Docker를 사용하는 경우 다음에 의해 java -jar MCOCL.jar
교체하십시오 (Windows PowerShell, Mac Terminal 또는 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
becomes
docker run --rm -v ${PWD}:/input -w /input monticore/ocl -i Example.ocl -pp
Docker를 사용할 때.
GitHub에있는 소스 파일에서 도구의 실행 가능한 JAR을 빌드 할 수 있습니다. 다음은 Bash를 사용하여 소스 파일에서 도구를 구축하는 프로세스를 설명합니다. GitHub에서 사용 가능한 소스 파일에서 bash가있는 실행 가능한 JAR을 구축하려면 다음 명령을 실행하십시오.
먼저 저장소를 복제하십시오.
git clone https://github.com/MontiCore/ocl.git
복제 된 소스의 루트 디렉토리로 디렉토리를 변경하십시오.
cd OCL
그런 다음 실행하여 프로젝트를 구축합니다 (정보 :이를 위해 Gradle을 설치해야 함) :
gradle build
축하해요! 이제 디렉토리 target/libs
( cd target/libs
를 통해 액세스 가능)에서 실행 가능한 JAR 파일 MCOCL.jar
찾을 수 있습니다.
이전 섹션에서는 실행 가능한 JAR 파일 (OCL 명령 줄 도구)을 얻는 방법을 설명합니다. 이 섹션에서는 OCL 도구를 사용하기위한 자습서를 제공합니다. 다음 예는 당신이 도구 MCOCL
로컬로 명명했다고 가정합니다. 소스에서 도구를 구축하거나 위의 wget
명령을 사용하면 괜찮습니다. 도구를 수동으로 다운로드 한 경우 다운로드 된 JAR의 이름 변경을 고려해야합니다.
옵션없이 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 모델이 포함 된 하나 이상의 입력 파일의 파일 경로를 가져옵니다. 다른 인수가 지정되지 않으면 도구는 모델 만 구문 분석합니다.
이것을 시도하려면 MCOCL.jar
를 선택한 디렉토리에 복사하십시오. 그 후, 다음 간단한 OCL을 포함하는 것을 만듭니다.
ocl Example {
}
MCOCL.jar
가있는 디렉토리의 Example.ocl
로 텍스트 파일을 저장하십시오.
이제 다음 명령을 실행합니다.
java -jar MCOCL.jar -i Example.ocl
도구가 콘솔에 출력이 없음을 알 수 있습니다. 이는 도구가 파일 Example.ocl
성공적으로 구문 분석했음을 의미합니다.
이 도구는 OCL 언어를위한 꽤 프린터를 제공합니다. 예를 들어 OCL을 포함하는 파일의 형식을 수정하기 위해 예를 들어 프린터를 사용할 수 있습니다. Pretty-Printer를 실행하려면 -pp,--prettyprint
옵션을 사용할 수 있습니다. 인수없이 옵션을 사용하여 입력 파일에 포함 된 모델은 콘솔에 포함됩니다.
이것을 시도하기 위해 다음 명령을 실행하십시오.
java -jar MCOCL.jar -i Example.ocl -pp
명령은 입력 파일에 포함 된 예쁜 인쇄 모델을 콘솔에 인쇄합니다.
ocl Example {
}
입력 파일에 포함 된 모델을 출력 파일로 인쇄 할 수 있습니다. 이 작업의 경우 출력 파일의 이름을 -pp,--prettyprint
옵션)에 인수로 제공 할 수 있습니다. 출력 파일에 대한 인수가 제공되면 출력 파일 수는 입력 파일 수와 같아야합니다. I-TH 입력 파일은 I-TH 출력 파일로 인쇄되었습니다.
이것을 시도하기 위해 다음 명령을 실행하십시오.
java -jar MCOCL.jar -i Example.ocl -pp Output.ocl
이 명령은 입력 파일에 포함 된 예쁜 인쇄 모델을 파일 Output.ocl
로 인쇄합니다.
컨텍스트 조건을 확인하려면 -c,--coco <arg>
옵션을 사용할 수 있습니다. 인수 없이이 옵션을 사용하면 모델이 모든 컨텍스트 조건을 충족하는지 확인합니다.
모델이 컨텍스트 조건의 하위 집합 만 충족하는지 여부를 확인하는 데 관심이 있거나 모든 컨텍스트 조건을 확인해야한다고 설명하려면 세 가지 인수 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/resources/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 표현이 포함되어 있습니다. 이 경우 심볼 파일에는 정의 된 유형에 대한 정보가 포함되어 있습니다. 일반적으로 몬티 코어 언어 도구는 이러한 파일의 내용을 자동으로 생성하며 언어 사용자로서 귀하의 내용에 관심을 가져서는 안됩니다.
심볼 파일을 포함하는 디렉토리 구조를 포함하는 경로를 "심볼 경로"라고합니다. 도구에 대한 기호 경로를 제공하면 기호 경로에 포함 된 디렉토리에 저장된 기호 파일의 기호를 검색합니다. 따라서 도구가 기호 파일을 찾을 수있는 도구를 원한다면 --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 도구에 제공된 Symbolfiles를 해석하려면 CD 도구에 저장된 기호를 해석하는 방법을 이해해야합니다. -cd4c
플래그는 CD4 코드의 경우이를 수행하기위한 속기입니다. 또한 --typeSymbol
, --functionSymbol
및 --variableSymbol
플래그를 사용하여 TypeSymbol
, FunctionSymbol
및 VariableSymbol
로 해석 해야하는 기호 종류를 사용하여 수동으로 수행 할 수 있습니다.
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에서 흥미로운 것은 아닙니다. 이러한 의도하지 않은 경고를 억제하려면 OCL 도구에 --ignoreSymKind <SYM_KINDS_TO_IGNORE>
옵션을 사용하여 받고 싶지 않은 기호 종류에 대해 알 수 있습니다. 이 예에서는 다음과 같습니다.
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 파일에 정의 된 개체에 대한 정보가 포함됩니다. 이 객체 정의에 의해 소개 된 기호를 사용하기 위해 다른 모델로 가져올 수 있으며, Symbol Bookshop.sym
에 포함 된 기호를 가져 오기 위해 Bookshop.ocl
을 변경하는 방법과 유사하게.
-s,-symboltable <file>
옵션을 사용하면 입력 모델의 심볼 테이블을 작성하고 인수로 주어진 파일 경로에 저장합니다. 파일 경로가 제공되지 않거나 각 입력 모델에 대해 정확히 하나의 파일 경로가 제공되어야합니다. I-TH 입력 모델의 기호 파일은 I-TH 파일 경로에 의해 정의 된 파일에 저장됩니다. 파일 경로를 제공하지 않으면 도구는 기호 파일 target/symbols/{packageName}/{fileName}.oclsym
에 각 입력 모델의 심볼 테이블을 저장합니다. 여기서 packageName
은 포함 된 파일에 지정된 패키지 이름입니다. 모델과 fileName
은 모델이 포함 된 파일의 이름입니다. 파일은 Working Directory (IE)에 기준으로 저장되어 있으며, 심볼 파일을 저장하기위한 명령을 실행하는 디렉토리입니다. 또한 기호를 올바르게 저장하려면 모델이 모든면에서 잘 형성되어야하므로 모든 컨텍스트 조건이 미리 확인됩니다.
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
의 기호 파일을 저장하려면 다음 명령을 실행합니다 (다시, 암시 적 컨텍스트 조건 검사는 Symbol Path 옵션을 사용해야합니다).
java -jar MCOCL.jar -i Bookshop.ocl -path mytypes -cd4c -s syms/Bookshop.oclsym
축하합니다. SD 심볼 파일 저장에 대한 자습서를 방금 완료했습니다!