[doc] Refresh some tutorials for 2021-06
diff --git a/doc/org.eclipse.ocl.doc/build/ocl.fo b/doc/org.eclipse.ocl.doc/build/ocl.fo
new file mode 100644
index 0000000..9de2b60
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/build/ocl.fo
@@ -0,0 +1,8253 @@
+<?xml version="1.0" encoding="UTF-8"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" font-size="10pt" text-align="justify" line-height="normal" font-selection-strategy="character-by-character" line-height-shift-adjustment="disregard-shifts" writing-mode="lr-tb" language="en"><fo:layout-master-set><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="blank" margin-left="1in" margin-right="1in"><fo:region-body margin-top="0.5in" margin-bottom="1.2cm" display-align="center"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-blank"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-blank"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-first" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-odd" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-even" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="blank-draft" margin-left="1in" margin-right="1in"><fo:region-body margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-blank"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-blank"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="titlepage-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="lot-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="front-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="body-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="back-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="1" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-first-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-first"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-first"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-odd-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-odd"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-odd"/></fo:simple-page-master><fo:simple-page-master margin-bottom="0.5in" margin-top="0.5in" page-height="297mm" page-width="210mm" master-name="index-even-draft" margin-left="1in" margin-right="1in"><fo:region-body column-count="2" column-gap="12pt" margin-top="0.5in" margin-bottom="1.2cm"/><fo:region-before display-align="before" extent="0.4in" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0.4in" region-name="xsl-region-after-even"/></fo:simple-page-master><fo:page-sequence-master master-name="titlepage"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="titlepage-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="titlepage-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="titlepage-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="lot"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="lot-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="lot-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="lot-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="front"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="front-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="front-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="front-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="body"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="body-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="body-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="body-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="back"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="back-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="back-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="back-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="index"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/><fo:conditional-page-master-reference page-position="first" master-reference="index-first"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="index-odd"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="index-odd"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="titlepage-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="titlepage-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="titlepage-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="titlepage-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="lot-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="lot-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="lot-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="lot-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="front-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="front-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="front-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="front-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="body-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="body-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="body-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="body-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="back-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="back-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="back-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="back-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="index-draft"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank-draft"/><fo:conditional-page-master-reference page-position="first" master-reference="index-first-draft"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="index-odd-draft"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="index-odd-draft"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:page-sequence-master master-name="coversequence"><fo:repeatable-page-master-alternatives><fo:conditional-page-master-reference page-position="first" master-reference="my.titlepage"/><fo:conditional-page-master-reference odd-or-even="odd" master-reference="my.titlepage"/><fo:conditional-page-master-reference odd-or-even="even" master-reference="my.titlepage"/><fo:conditional-page-master-reference blank-or-not-blank="blank" master-reference="blank"/></fo:repeatable-page-master-alternatives></fo:page-sequence-master><fo:simple-page-master margin-right="1in" margin-left="1in" margin-bottom="20mm" margin-top="20mm" page-height="297mm" page-width="210mm" master-name="my.titlepage"><fo:region-body column-count="1" margin-top="20" margin-bottom="20"/><fo:region-before display-align="before" extent="0" region-name="xsl-region-before-even"/><fo:region-after display-align="after" extent="0" region-name="xsl-region-after-even"/></fo:simple-page-master></fo:layout-master-set><fo:declarations xmlns:fox="http://xmlgraphics.apache.org/fop/extensions"><x:xmpmeta xmlns:x="adobe:ns:meta/"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about=""><dc:title>OCL Documentation</dc:title></rdf:Description><rdf:Description xmlns:pdf="http://ns.adobe.com/pdf/1.3/" rdf:about=""/><rdf:Description xmlns:xmp="http://ns.adobe.com/xap/1.0/" rdf:about=""><xmp:CreatorTool>DocBook XSL Stylesheets with Apache FOP</xmp:CreatorTool></rdf:Description></rdf:RDF></x:xmpmeta></fo:declarations><fo:bookmark-tree><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="N10001" starting-state="hide"><fo:bookmark-title>OCL Documentation</fo:bookmark-title></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="toc...N10001"><fo:bookmark-title>Table of Contents</fo:bookmark-title></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="OverviewandGettingStarted" starting-state="hide"><fo:bookmark-title>Chapter 1. Overview and Getting Started</fo:bookmark-title><fo:bookmark internal-destination="WhatisOCL" starting-state="hide"><fo:bookmark-title>1.1. What is OCL?</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="HowDoesItWork" starting-state="hide"><fo:bookmark-title>1.2. How Does It Work?</fo:bookmark-title><fo:bookmark internal-destination="Editing" starting-state="hide"><fo:bookmark-title>1.2.1. Editing</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Execution" starting-state="hide"><fo:bookmark-title>1.2.2. Execution</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Debugging" starting-state="hide"><fo:bookmark-title>1.2.3. Debugging</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Testing" starting-state="hide"><fo:bookmark-title>1.2.4. Testing</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="EclipseOCLisExtensible" starting-state="hide"><fo:bookmark-title>1.3. Eclipse OCL is Extensible</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="WhoUsesOCLandEclipseOCL" starting-state="hide"><fo:bookmark-title>1.4. Who Uses OCL and Eclipse OCL?</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="WhoisBehindEclipseOCL" starting-state="hide"><fo:bookmark-title>1.5. Who is Behind Eclipse OCL?</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="GettingStarted" starting-state="hide"><fo:bookmark-title>1.6. Getting Started</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="UsersGuide" starting-state="hide"><fo:bookmark-title>Chapter 2. Users Guide</fo:bookmark-title><fo:bookmark internal-destination="EclipseOCLs" starting-state="hide"><fo:bookmark-title>2.1. The two Eclipse OCLs</fo:bookmark-title><fo:bookmark internal-destination="TheClassicEclipseOCLmetamodels" starting-state="hide"><fo:bookmark-title>2.1.1. The Classic Eclipse OCL metamodels</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheUnifiedorPivotEclipseOCLmetamodel" starting-state="hide"><fo:bookmark-title>2.1.2. The Unified or Pivot Eclipse OCL metamodel</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Thetransition" starting-state="hide"><fo:bookmark-title>2.1.3. The transition</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Migration" starting-state="hide"><fo:bookmark-title>2.1.4. Migration</fo:bookmark-title><fo:bookmark internal-destination="Language" starting-state="hide"><fo:bookmark-title>2.1.4.1. Language</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ASModels" starting-state="hide"><fo:bookmark-title>2.1.4.2. AS Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CSModels" starting-state="hide"><fo:bookmark-title>2.1.4.3. CS Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheOCLFacade" starting-state="hide"><fo:bookmark-title>2.1.4.4. The OCL Facade</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheOCLArchitecture" starting-state="hide"><fo:bookmark-title>2.1.4.5. The OCL Architecture</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="APIs" starting-state="hide"><fo:bookmark-title>2.1.5. APIs</fo:bookmark-title><fo:bookmark internal-destination="ToolAPIs" starting-state="hide"><fo:bookmark-title>2.1.5.1. Tool APIs</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="InternalAPIs" starting-state="hide"><fo:bookmark-title>2.1.5.2. Internal APIs</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Versions" starting-state="hide"><fo:bookmark-title>2.1.5.3. Versions</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="EssentialOCL" starting-state="hide"><fo:bookmark-title>2.2. The Essential OCL Language</fo:bookmark-title><fo:bookmark internal-destination="Syntax" starting-state="hide"><fo:bookmark-title>2.2.1. Syntax</fo:bookmark-title><fo:bookmark internal-destination="GrammarImplementation" starting-state="hide"><fo:bookmark-title>2.2.1.1. Grammar Implementation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="GrammarApproach" starting-state="hide"><fo:bookmark-title>2.2.1.2. Grammar Approach</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-Exp" starting-state="hide"><fo:bookmark-title>2.2.1.3. OCL Expression</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-PrimaryExp" starting-state="hide"><fo:bookmark-title>2.2.1.4. PrimaryExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-SelfExp" starting-state="hide"><fo:bookmark-title>2.2.1.5. SelfExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-PrimitiveLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.6. PrimitiveLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NumberLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.7. NumberLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-StringLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.8. StringLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-BooleanLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.9. BooleanLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-UnlimitedNaturalLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.10. UnlimitedNaturalLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-InvalidLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.11. InvalidLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NullLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.12. NullLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-CollectionLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.13. CollectionLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-CollectionLiteralPart" starting-state="hide"><fo:bookmark-title>2.2.1.14. CollectionLiteralPart</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TupleLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.15. TupleLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TupleLiteralPart" starting-state="hide"><fo:bookmark-title>2.2.1.16. TupleLiteralPart</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TypeLiteralExp" starting-state="hide"><fo:bookmark-title>2.2.1.17. TypeLiteralExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NestedExp" starting-state="hide"><fo:bookmark-title>2.2.1.18. NestedExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-IfExp" starting-state="hide"><fo:bookmark-title>2.2.1.19. IfExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-LetExp" starting-state="hide"><fo:bookmark-title>2.2.1.20. LetExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NameExp" starting-state="hide"><fo:bookmark-title>2.2.1.21. NameExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-IndexExp" starting-state="hide"><fo:bookmark-title>2.2.1.22. IndexExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NavigatingExp" starting-state="hide"><fo:bookmark-title>2.2.1.23. NavigatingExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NavigatingArg" starting-state="hide"><fo:bookmark-title>2.2.1.24. NavigatingArg</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-PrefixedExp" starting-state="hide"><fo:bookmark-title>2.2.1.25. PrefixedExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-InfixedExp" starting-state="hide"><fo:bookmark-title>2.2.1.26. InfixedExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-NavigationOperators" starting-state="hide"><fo:bookmark-title>2.2.1.27. NavigationOperators</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TypeExp" starting-state="hide"><fo:bookmark-title>2.2.1.28. TypeExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TypeNameExp" starting-state="hide"><fo:bookmark-title>2.2.1.29. TypeNameExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TypeLiteral" starting-state="hide"><fo:bookmark-title>2.2.1.30. TypeLiteral</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-PrimitiveType" starting-state="hide"><fo:bookmark-title>2.2.1.31. PrimitiveType</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-CollectionType" starting-state="hide"><fo:bookmark-title>2.2.1.32. CollectionType</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TupleType" starting-state="hide"><fo:bookmark-title>2.2.1.33. TupleType</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-TuplePart" starting-state="hide"><fo:bookmark-title>2.2.1.34. TuplePart</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-UnreservedName" starting-state="hide"><fo:bookmark-title>2.2.1.35. UnreservedName</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EssentialOCL-UnrestrictedName" starting-state="hide"><fo:bookmark-title>2.2.1.36. UnrestrictedName</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLinEcore" starting-state="hide"><fo:bookmark-title>2.3. The OCLinEcore Language</fo:bookmark-title><fo:bookmark internal-destination="Syntax2" starting-state="hide"><fo:bookmark-title>2.3.1. Syntax</fo:bookmark-title><fo:bookmark internal-destination="GrammarImplementation2" starting-state="hide"><fo:bookmark-title>2.3.1.1. Grammar Implementation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Module" starting-state="hide"><fo:bookmark-title>2.3.1.2. Module</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Package" starting-state="hide"><fo:bookmark-title>2.3.1.3. Package</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Classifier" starting-state="hide"><fo:bookmark-title>2.3.1.4. Classifier</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-DataType" starting-state="hide"><fo:bookmark-title>2.3.1.5. DataType</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Enumeration" starting-state="hide"><fo:bookmark-title>2.3.1.6. Enumeration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-EnumerationLiteral" starting-state="hide"><fo:bookmark-title>2.3.1.7. EnumerationLiteral</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Class" starting-state="hide"><fo:bookmark-title>2.3.1.8. Class</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-StructuralFeature" starting-state="hide"><fo:bookmark-title>2.3.1.9. StructuralFeature</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Attribute" starting-state="hide"><fo:bookmark-title>2.3.1.10. Attribute</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Reference" starting-state="hide"><fo:bookmark-title>2.3.1.11. Reference</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Operation" starting-state="hide"><fo:bookmark-title>2.3.1.12. Operation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Parameter" starting-state="hide"><fo:bookmark-title>2.3.1.13. Parameter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-TypeRef" starting-state="hide"><fo:bookmark-title>2.3.1.14. Types</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Annotations" starting-state="hide"><fo:bookmark-title>2.3.1.15. AnnotationElement</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Annotation" starting-state="hide"><fo:bookmark-title>2.3.1.16. Annotation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Detail" starting-state="hide"><fo:bookmark-title>2.3.1.17. Detail</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Documentation" starting-state="hide"><fo:bookmark-title>2.3.1.18. Documentation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcore-Constraint" starting-state="hide"><fo:bookmark-title>2.3.1.19. Constraints</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Terminals" starting-state="hide"><fo:bookmark-title>2.3.1.20. Terminals</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Names" starting-state="hide"><fo:bookmark-title>2.3.1.21. Names</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Comments" starting-state="hide"><fo:bookmark-title>2.3.1.22. Comments</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Limitations" starting-state="hide"><fo:bookmark-title>2.3.2. Limitations</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CompleteOCL" starting-state="hide"><fo:bookmark-title>2.4. The Complete OCL Language</fo:bookmark-title><fo:bookmark internal-destination="Syntax3" starting-state="hide"><fo:bookmark-title>2.4.1. Syntax</fo:bookmark-title><fo:bookmark internal-destination="GrammarImplementation3" starting-state="hide"><fo:bookmark-title>2.4.1.1. Grammar Implementation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Document" starting-state="hide"><fo:bookmark-title>2.4.1.2. Complete OCL Document</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-PackageDeclaration" starting-state="hide"><fo:bookmark-title>2.4.1.3. PackageDeclaration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-ContextDecl" starting-state="hide"><fo:bookmark-title>2.4.1.4. ContextDecl</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-ClassifierContextDecl" starting-state="hide"><fo:bookmark-title>2.4.1.5. ClassifierContextDecl</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Def" starting-state="hide"><fo:bookmark-title>2.4.1.6. Def</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Inv" starting-state="hide"><fo:bookmark-title>2.4.1.7. Inv</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-OperationContextDecl" starting-state="hide"><fo:bookmark-title>2.4.1.8. OperationContextDecl</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Parameter" starting-state="hide"><fo:bookmark-title>2.4.1.9. Parameter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Body" starting-state="hide"><fo:bookmark-title>2.4.1.10. Body</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Post" starting-state="hide"><fo:bookmark-title>2.4.1.11. Post</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Pre" starting-state="hide"><fo:bookmark-title>2.4.1.12. Pre</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-PropertyContextDecl" starting-state="hide"><fo:bookmark-title>2.4.1.13. PropertyContextDecl</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Init" starting-state="hide"><fo:bookmark-title>2.4.1.14. Init</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Der" starting-state="hide"><fo:bookmark-title>2.4.1.15. Der</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-Specification" starting-state="hide"><fo:bookmark-title>2.4.1.16. Specification</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-NavigatingExp" starting-state="hide"><fo:bookmark-title>2.4.1.17. NavigatingExp</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-NavigationOperators" starting-state="hide"><fo:bookmark-title>2.4.1.18. NavigationOperators</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-UnreservedName" starting-state="hide"><fo:bookmark-title>2.4.1.19. UnreservedName</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCL-UnrestrictedName" starting-state="hide"><fo:bookmark-title>2.4.1.20. UnrestrictedName</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLstdlib" starting-state="hide"><fo:bookmark-title>2.5. The OCL Standard Library Language</fo:bookmark-title><fo:bookmark internal-destination="Syntax4" starting-state="hide"><fo:bookmark-title>2.5.1. Syntax</fo:bookmark-title><fo:bookmark internal-destination="GrammarImplementation4" starting-state="hide"><fo:bookmark-title>2.5.1.1. Grammar Implementation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Library" starting-state="hide"><fo:bookmark-title>2.5.1.2. OCL Standard Library Document</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Precedence" starting-state="hide"><fo:bookmark-title>2.5.1.3. Precedence</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Package" starting-state="hide"><fo:bookmark-title>2.5.1.4. Package</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Classifier" starting-state="hide"><fo:bookmark-title>2.5.1.5. Class and Classifier</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Inv" starting-state="hide"><fo:bookmark-title>2.5.1.6. Inv</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Operation" starting-state="hide"><fo:bookmark-title>2.5.1.7. Operation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-LibOperation" starting-state="hide"><fo:bookmark-title>2.5.1.8. LibOperation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-LibIteration" starting-state="hide"><fo:bookmark-title>2.5.1.9. LibIteration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Iterator" starting-state="hide"><fo:bookmark-title>2.5.1.10. Iterator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Accumulator" starting-state="hide"><fo:bookmark-title>2.5.1.11. Accumulator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Parameter" starting-state="hide"><fo:bookmark-title>2.5.1.12. Parameter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Pre" starting-state="hide"><fo:bookmark-title>2.5.1.13. Pre</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Post" starting-state="hide"><fo:bookmark-title>2.5.1.14. Post</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Property" starting-state="hide"><fo:bookmark-title>2.5.1.15. LibProperty</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLstdlib-Specification" starting-state="hide"><fo:bookmark-title>2.5.1.16. Specification</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Editors" starting-state="hide"><fo:bookmark-title>2.6. Editors</fo:bookmark-title><fo:bookmark internal-destination="Syntaxcoloring" starting-state="hide"><fo:bookmark-title>2.6.1. Syntax coloring</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Validation" starting-state="hide"><fo:bookmark-title>2.6.2. Validation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="HoverText" starting-state="hide"><fo:bookmark-title>2.6.3. Hover Text</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ContentAssist" starting-state="hide"><fo:bookmark-title>2.6.4. Content Assist</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CodeTemplates" starting-state="hide"><fo:bookmark-title>2.6.5. Code Templates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OpenDeclaration" starting-state="hide"><fo:bookmark-title>2.6.6. Open Declaration</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="NatureAndBuilder" starting-state="hide"><fo:bookmark-title>2.7. OCL Nature and Builder Auto-Validation</fo:bookmark-title><fo:bookmark internal-destination="OCLbuilderConfiguration" starting-state="hide"><fo:bookmark-title>2.7.1. Configuring the OCL Nature and Builder</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EcoreAndUMLautoValidation" starting-state="hide"><fo:bookmark-title>2.7.2. Ecore and UML Auto-Validation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="NoNature" starting-state="hide"><fo:bookmark-title>2.7.3. Building on pre-Photon / 2018 releases</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="InteractiveOCL" starting-state="hide"><fo:bookmark-title>2.8. Console</fo:bookmark-title><fo:bookmark internal-destination="ContextObjectSelection" starting-state="hide"><fo:bookmark-title>2.8.1. Context Object Selection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Editing2" starting-state="hide"><fo:bookmark-title>2.8.2. Editing</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EditorKeys" starting-state="hide"><fo:bookmark-title>2.8.3. Editor Keys</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Results" starting-state="hide"><fo:bookmark-title>2.8.4. Results</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ToolBar" starting-state="hide"><fo:bookmark-title>2.8.5. Tool Bar</fo:bookmark-title><fo:bookmark internal-destination="EcoreUMLbinding" starting-state="hide"><fo:bookmark-title>2.8.5.1. Ecore/UML binding</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="M1M2" starting-state="hide"><fo:bookmark-title>2.8.5.2. M1/M2</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ClearConsole" starting-state="hide"><fo:bookmark-title>2.8.5.3. Clear Console</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CloseConsole" starting-state="hide"><fo:bookmark-title>2.8.5.4. Close Console</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Debug" starting-state="hide"><fo:bookmark-title>2.8.5.5. Debug</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="LoadSaveanexpression" starting-state="hide"><fo:bookmark-title>2.8.5.6. Load/Save an expression</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ValidityView" starting-state="hide"><fo:bookmark-title>2.9. Validity View (new in Luna)</fo:bookmark-title><fo:bookmark internal-destination="ValidityViewToolBar" starting-state="hide"><fo:bookmark-title>2.9.1. View Tool Bar</fo:bookmark-title><fo:bookmark internal-destination="ExpandAll" starting-state="hide"><fo:bookmark-title>2.9.1.1. Expand All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CollapseAll" starting-state="hide"><fo:bookmark-title>2.9.1.2. Collapse All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pin" starting-state="hide"><fo:bookmark-title>2.9.1.3. Pin</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Refresh" starting-state="hide"><fo:bookmark-title>2.9.1.4. Refresh</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Run" starting-state="hide"><fo:bookmark-title>2.9.1.5. Run</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Filter" starting-state="hide"><fo:bookmark-title>2.9.1.6. Filter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Save" starting-state="hide"><fo:bookmark-title>2.9.1.7. Save</fo:bookmark-title><fo:bookmark internal-destination="html" starting-state="hide"><fo:bookmark-title>html</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="model" starting-state="hide"><fo:bookmark-title>model</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="text" starting-state="hide"><fo:bookmark-title>text</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ValidityViewModelElementsPane" starting-state="hide"><fo:bookmark-title>2.9.2. Model Elements Pane</fo:bookmark-title><fo:bookmark internal-destination="ValidityViewModelElementsToolBar" starting-state="hide"><fo:bookmark-title>2.9.2.1. Model Elements Tool Bar</fo:bookmark-title><fo:bookmark internal-destination="ExpandAll2" starting-state="hide"><fo:bookmark-title>Expand All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CollapseAll2" starting-state="hide"><fo:bookmark-title>Collapse All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EnableAll" starting-state="hide"><fo:bookmark-title>Enable All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DisableAll" starting-state="hide"><fo:bookmark-title>Disable All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ShowHidedisabled" starting-state="hide"><fo:bookmark-title>Show/Hide disabled</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="TextFilter" starting-state="hide"><fo:bookmark-title>2.9.2.2. Text Filter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ModelElementstree" starting-state="hide"><fo:bookmark-title>2.9.2.3. Model Elements tree</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ModelElementsContextMenu" starting-state="hide"><fo:bookmark-title>2.9.2.4. Model Elements Context Menu</fo:bookmark-title><fo:bookmark internal-destination="ValidateSelection" starting-state="hide"><fo:bookmark-title>Validate Selection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DebugSingleEnabledSelection" starting-state="hide"><fo:bookmark-title>Debug Single Enabled Selection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ShowinEditor" starting-state="hide"><fo:bookmark-title>Show in Editor</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ValidityViewMetamodelConstraintsPane" starting-state="hide"><fo:bookmark-title>2.9.3. Metamodel Constraints Pane</fo:bookmark-title><fo:bookmark internal-destination="ValidityViewMetamodelConstraintsToolBar" starting-state="hide"><fo:bookmark-title>2.9.3.1. Metamodel Constraints Tool Bar</fo:bookmark-title><fo:bookmark internal-destination="ExpandAll3" starting-state="hide"><fo:bookmark-title>Expand All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CollapseAll3" starting-state="hide"><fo:bookmark-title>Collapse All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EnableAll2" starting-state="hide"><fo:bookmark-title>Enable All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DisableAll2" starting-state="hide"><fo:bookmark-title>Disable All</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ShowHidedisabled2" starting-state="hide"><fo:bookmark-title>Show/Hide disabled</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="TextFilter2" starting-state="hide"><fo:bookmark-title>2.9.3.2. Text Filter</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MetamodelConstraintstree" starting-state="hide"><fo:bookmark-title>2.9.3.3. Metamodel Constraints tree</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MetamodelConstraintsContextMenu" starting-state="hide"><fo:bookmark-title>2.9.3.4. Metamodel Constraints Context Menu</fo:bookmark-title><fo:bookmark internal-destination="ValidateSelection2" starting-state="hide"><fo:bookmark-title>Validate Selection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DebugSingleEnabledSelection2" starting-state="hide"><fo:bookmark-title>Debug Single Enabled Selection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ShowinEditor2" starting-state="hide"><fo:bookmark-title>Show in Editor</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ConstraintLocators" starting-state="hide"><fo:bookmark-title>2.9.4. Constraint Locators</fo:bookmark-title><fo:bookmark internal-destination="org.eclipse.ocl.examples.emf.validation.validity.locator.EClassConstraintLocator" starting-state="hide"><fo:bookmark-title>2.9.4.1. org.eclipse.ocl.examples.emf.validation.validity.locator.EClassConstraintLocator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="org.eclipse.ocl.examples.emf.validation.validity.locator.EValidatorConstraintLocator" starting-state="hide"><fo:bookmark-title>2.9.4.2. org.eclipse.ocl.examples.emf.validation.validity.locator.EValidatorConstraintLocator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="org.eclipse.ocl.examples.validity.locator.DelegateUIConstraintLocator" starting-state="hide"><fo:bookmark-title>2.9.4.3. org.eclipse.ocl.examples.validity.locator.DelegateUIConstraintLocator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="org.eclipse.ocl.examples.validity.locator.PivotUIConstraintLocator" starting-state="hide"><fo:bookmark-title>2.9.4.4. org.eclipse.ocl.examples.validity.locator.PivotUIConstraintLocator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="org.eclipse.ocl.examples.validity.locator.UMLUIConstraintLocator" starting-state="hide"><fo:bookmark-title>2.9.4.5. org.eclipse.ocl.examples.validity.locator.UMLUIConstraintLocator</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Debugger" starting-state="hide"><fo:bookmark-title>2.10. Debugger (new in Luna)</fo:bookmark-title><fo:bookmark internal-destination="Launching" starting-state="hide"><fo:bookmark-title>2.10.1. Launching</fo:bookmark-title><fo:bookmark internal-destination="Selectedmodelobjectandmanuallyenteredexpression" starting-state="hide"><fo:bookmark-title>2.10.1.1. Selected model object and manually entered expression</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Selectedmodelobjectconstraintcombination" starting-state="hide"><fo:bookmark-title>2.10.1.2. Selected model object/constraint combination</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Selectedmodelobjectandselectedconstraint" starting-state="hide"><fo:bookmark-title>2.10.1.3. Selected model object and selected constraint</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Stepping" starting-state="hide"><fo:bookmark-title>2.10.2. Stepping</fo:bookmark-title><fo:bookmark internal-destination="StepInto" starting-state="hide"><fo:bookmark-title>2.10.2.1. Step Into</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="StepOver" starting-state="hide"><fo:bookmark-title>2.10.2.2. Step Over</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="StepReturn" starting-state="hide"><fo:bookmark-title>2.10.2.3. Step Return</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Resume" starting-state="hide"><fo:bookmark-title>2.10.2.4. Resume</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="VariablesView" starting-state="hide"><fo:bookmark-title>2.10.3. Variables View</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="BreakpointsView" starting-state="hide"><fo:bookmark-title>2.10.4. Breakpoints View</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OutlineView" starting-state="hide"><fo:bookmark-title>2.10.5. Outline View</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Integration" starting-state="hide"><fo:bookmark-title>2.11. OCL Integration</fo:bookmark-title><fo:bookmark internal-destination="Integration-OCLinEcore" starting-state="hide"><fo:bookmark-title>2.11.1. OCL execution in Ecore / EMF Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Integration-Messages" starting-state="hide"><fo:bookmark-title>2.11.2. Custom Validation Messages</fo:bookmark-title><fo:bookmark internal-destination="Underlyingsupport" starting-state="hide"><fo:bookmark-title>2.11.2.1. Underlying support</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Editorsyntax" starting-state="hide"><fo:bookmark-title>2.11.2.2. Editor syntax</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Integration-CompleteOCL" starting-state="hide"><fo:bookmark-title>2.11.3. CompleteOCL Validation</fo:bookmark-title><fo:bookmark internal-destination="BrowseRegisteredOCLFiles..." starting-state="hide"><fo:bookmark-title>2.11.3.1. Browse Registered OCL Files...</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="BrowseFileSystem..." starting-state="hide"><fo:bookmark-title>2.11.3.2. Browse File System...</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="BrowseWorkspace..." starting-state="hide"><fo:bookmark-title>2.11.3.3. Browse Workspace...</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreforXtextValidation" starting-state="hide"><fo:bookmark-title>2.11.4. OCLinEcore for Xtext Validation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLforXtextValidation" starting-state="hide"><fo:bookmark-title>2.11.5. Complete OCL for Xtext Validation</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus" starting-state="hide"><fo:bookmark-title>2.12. OCL in UML (using Papyrus)</fo:bookmark-title><fo:bookmark internal-destination="OCLinPapyrus-UML-integration" starting-state="hide"><fo:bookmark-title>2.12.1. UML Integration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-Class-Diagram" starting-state="hide"><fo:bookmark-title>2.12.2. Class Diagram</fo:bookmark-title><fo:bookmark internal-destination="OCLinPapyrus-Class-Invariant" starting-state="hide"><fo:bookmark-title>2.12.2.1. Class Invariant</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-Operation-Constraints" starting-state="hide"><fo:bookmark-title>2.12.2.2. Operation Precondition, Postcondition and Body</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-Property-Initializers" starting-state="hide"><fo:bookmark-title>2.12.2.3. Property Initializers</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-Profile-Constraint" starting-state="hide"><fo:bookmark-title>2.12.2.4. Profile Constraint</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-StateMachine-Diagram" starting-state="hide"><fo:bookmark-title>2.12.3. State Machine Diagram</fo:bookmark-title><fo:bookmark internal-destination="OCLinPapyrus-State-Constraint" starting-state="hide"><fo:bookmark-title>2.12.3.1. Statemachine Constraint</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinPapyrus-Transition-Guard" starting-state="hide"><fo:bookmark-title>2.12.3.2. Statemachine Transition Guard</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLExamplesforUML" starting-state="hide"><fo:bookmark-title>2.13. OCL Constraint Examples for UML (using Papyrus)</fo:bookmark-title><fo:bookmark internal-destination="OCLM1Constraints" starting-state="hide"><fo:bookmark-title>2.13.1. Model Constraints</fo:bookmark-title><fo:bookmark internal-destination="SimpleMetamodel" starting-state="hide"><fo:bookmark-title>2.13.1.1. Simple Metamodel</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ScalarConstraints" starting-state="hide"><fo:bookmark-title>2.13.1.2. Scalar Constraints</fo:bookmark-title><fo:bookmark internal-destination="NameIsAlphabetic" starting-state="hide"><fo:bookmark-title>NameIsAlphabetic</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="NoSelfPartnership" starting-state="hide"><fo:bookmark-title>NoSelfPartnership</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CollectionConstraints" starting-state="hide"><fo:bookmark-title>2.13.1.3. Collection Constraints</fo:bookmark-title><fo:bookmark internal-destination="EachChildHasTwoParents" starting-state="hide"><fo:bookmark-title>EachChildHasTwoParents</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="AcyclicAncestry" starting-state="hide"><fo:bookmark-title>AcyclicAncestry</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EachChildsParentsArePartners" starting-state="hide"><fo:bookmark-title>EachChildsParentsArePartners</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLM2Constraints" starting-state="hide"><fo:bookmark-title>2.13.2. Profile Constraints</fo:bookmark-title><fo:bookmark internal-destination="ExampleProfile" starting-state="hide"><fo:bookmark-title>2.13.2.1. Example Profile</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ExampleProfiledModel" starting-state="hide"><fo:bookmark-title>2.13.2.2. Example Profiled Model</fo:bookmark-title><fo:bookmark internal-destination="MaleOrFemale" starting-state="hide"><fo:bookmark-title>MaleOrFemale</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="GenderIsRequired" starting-state="hide"><fo:bookmark-title>GenderIsRequired</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CatholicPriestsAreMale" starting-state="hide"><fo:bookmark-title>CatholicPriestsAreMale</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="AtMostOnePriesthood" starting-state="hide"><fo:bookmark-title>AtMostOnePriesthood</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="notEmpty" starting-state="hide"><fo:bookmark-title>-&gt;notEmpty()</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="UserInterface" starting-state="hide"><fo:bookmark-title>2.14. User Interface</fo:bookmark-title><fo:bookmark internal-destination="PropertyPages" starting-state="hide"><fo:bookmark-title>2.14.1. Project Property Pages</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PreferencePages" starting-state="hide"><fo:bookmark-title>2.14.2. Workspace Preference Pages</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OverallOptions" starting-state="hide"><fo:bookmark-title>2.14.3. Overall Options</fo:bookmark-title><fo:bookmark internal-destination="DefaultDelegationMode" starting-state="hide"><fo:bookmark-title>2.14.3.1. Default Delegation Mode</fo:bookmark-title><fo:bookmark internal-destination="LPGDelegation" starting-state="hide"><fo:bookmark-title>http://www.eclipse.org/emf/2002/Ecore/OCL/LPG</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotDelegation" starting-state="hide"><fo:bookmark-title>http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DefaultDelegation" starting-state="hide"><fo:bookmark-title>http://www.eclipse.org/emf/2002/Ecore/OCL</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CodeGenerationMode" starting-state="hide"><fo:bookmark-title>2.14.3.2. Code Generation Mode</fo:bookmark-title><fo:bookmark internal-destination="CodeGenerationMode-DELEGATED" starting-state="hide"><fo:bookmark-title>Delegate for interpretation at run-time</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CodeGenerationMode-GENERATED" starting-state="hide"><fo:bookmark-title>Generate Java code in xxxBodies classes</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="EcoreUMLOptions" starting-state="hide"><fo:bookmark-title>2.14.4. Ecore and UML Options</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UMLOptions" starting-state="hide"><fo:bookmark-title>2.14.5. UML Options</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ModelRegistry" starting-state="hide"><fo:bookmark-title>2.14.6. Model Registry</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SyntaxColoring" starting-state="hide"><fo:bookmark-title>2.14.7. Syntax Coloring</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EditorTemplates" starting-state="hide"><fo:bookmark-title>2.14.8. Editor Templates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreOptions" starting-state="hide"><fo:bookmark-title>2.14.9. OCLinEcore Options</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="StandardLibrary" starting-state="hide"><fo:bookmark-title>Chapter 3. The OCL Standard Library</fo:bookmark-title><fo:bookmark internal-destination="Precedences" starting-state="hide"><fo:bookmark-title>3.1.  Precedences</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Bag" starting-state="hide"><fo:bookmark-title>3.2.  Bag(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Boolean" starting-state="hide"><fo:bookmark-title>3.3.  Boolean</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Class" starting-state="hide"><fo:bookmark-title>3.4.  Class</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Collection" starting-state="hide"><fo:bookmark-title>3.5.  Collection(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Enumeration" starting-state="hide"><fo:bookmark-title>3.6.  Enumeration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EnumerationLiteral" starting-state="hide"><fo:bookmark-title>3.7.  EnumerationLiteral</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Integer" starting-state="hide"><fo:bookmark-title>3.8.  Integer</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Map" starting-state="hide"><fo:bookmark-title>3.9.  Map(K, V)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclAny" starting-state="hide"><fo:bookmark-title>3.10.  OclAny</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclComparable" starting-state="hide"><fo:bookmark-title>3.11.  OclComparable</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclElement" starting-state="hide"><fo:bookmark-title>3.12.  OclElement</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclEnumeration" starting-state="hide"><fo:bookmark-title>3.13.  OclEnumeration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclInvalid" starting-state="hide"><fo:bookmark-title>3.14.  OclInvalid</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclLambda" starting-state="hide"><fo:bookmark-title>3.15.  OclLambda</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclMessage" starting-state="hide"><fo:bookmark-title>3.16.  OclMessage</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclSelf" starting-state="hide"><fo:bookmark-title>3.17.  OclSelf</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclState" starting-state="hide"><fo:bookmark-title>3.18.  OclState</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclStereotype" starting-state="hide"><fo:bookmark-title>3.19.  OclStereotype</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclSummable" starting-state="hide"><fo:bookmark-title>3.20.  OclSummable</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclTuple" starting-state="hide"><fo:bookmark-title>3.21.  OclTuple</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclType" starting-state="hide"><fo:bookmark-title>3.22.  OclType</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OclVoid" starting-state="hide"><fo:bookmark-title>3.23.  OclVoid</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OrderedCollection" starting-state="hide"><fo:bookmark-title>3.24.  OrderedCollection(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OrderedSet" starting-state="hide"><fo:bookmark-title>3.25.  OrderedSet(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Real" starting-state="hide"><fo:bookmark-title>3.26.  Real</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Sequence" starting-state="hide"><fo:bookmark-title>3.27.  Sequence(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Set" starting-state="hide"><fo:bookmark-title>3.28.  Set(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="State" starting-state="hide"><fo:bookmark-title>3.29.  State</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="String" starting-state="hide"><fo:bookmark-title>3.30.  String</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Type" starting-state="hide"><fo:bookmark-title>3.31.  Type</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UniqueCollection" starting-state="hide"><fo:bookmark-title>3.32.  UniqueCollection(T)</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UnlimitedNatural" starting-state="hide"><fo:bookmark-title>3.33.  UnlimitedNatural</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="Tutorials" starting-state="hide"><fo:bookmark-title>Chapter 4. Tutorials</fo:bookmark-title><fo:bookmark internal-destination="OCLinEcoreTutorial" starting-state="hide"><fo:bookmark-title>4.1. OCLinEcore tutorial</fo:bookmark-title><fo:bookmark internal-destination="Overview" starting-state="hide"><fo:bookmark-title>4.1.1. Overview</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="References" starting-state="hide"><fo:bookmark-title>4.1.2. References</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreTutorial-Installation" starting-state="hide"><fo:bookmark-title>4.1.3. Installing the Eclipse OCL Examples</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Troubleshooting" starting-state="hide"><fo:bookmark-title>4.1.4. Troubleshooting</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UsingtheOCLinEcoretexteditorforEcore" starting-state="hide"><fo:bookmark-title>4.1.5. Using the OCLinEcore text editor for Ecore</fo:bookmark-title><fo:bookmark internal-destination="CreateaNewEMFProject" starting-state="hide"><fo:bookmark-title>4.1.5.1. Create a New EMF Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ConverttoanOCLProject" starting-state="hide"><fo:bookmark-title>4.1.5.2. Convert to an OCL Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CreateaNewEcoreModel" starting-state="hide"><fo:bookmark-title>4.1.5.3. Create a New Ecore Model</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreMetamodel" starting-state="hide"><fo:bookmark-title>4.1.5.4. Edit Ecore Model as OCLinEcore</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheTutorialMetaModel" starting-state="hide"><fo:bookmark-title>4.1.5.5. The Tutorial Meta-Model</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CreateaDynamicModelInstance" starting-state="hide"><fo:bookmark-title>4.1.6. Create a Dynamic Model Instance</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EnrichthemetamodelwithOCL" starting-state="hide"><fo:bookmark-title>4.1.7. Enrich the meta-model with OCL</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreTutorial-Console" starting-state="hide"><fo:bookmark-title>4.1.8. The OCL Console</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreTutorialHelpers" starting-state="hide"><fo:bookmark-title>4.1.9. Helper Features and Operations</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreTutorial-genmodel" starting-state="hide"><fo:bookmark-title>4.1.10. Generating Java Code</fo:bookmark-title><fo:bookmark internal-destination="JavaDetails" starting-state="hide"><fo:bookmark-title>4.1.10.1. Java Details</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="APIInvariants" starting-state="hide"><fo:bookmark-title>4.1.10.2. API Invariants</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Summary" starting-state="hide"><fo:bookmark-title>4.1.11. Summary</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial" starting-state="hide"><fo:bookmark-title>4.2. Complete OCL tutorial</fo:bookmark-title><fo:bookmark internal-destination="Overview2" starting-state="hide"><fo:bookmark-title>4.2.1. Overview</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLUtility" starting-state="hide"><fo:bookmark-title>4.2.2. Complete OCL Utility</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="LoadCompleteOCLTutorialExampleProject" starting-state="hide"><fo:bookmark-title>4.2.3. Load Complete OCL Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-language" starting-state="hide"><fo:bookmark-title>4.2.4. Complete OCL Language Overview</fo:bookmark-title><fo:bookmark internal-destination="importdeclarations" starting-state="hide"><fo:bookmark-title>4.2.4.1. import declarations</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="packagecontextdeclaration" starting-state="hide"><fo:bookmark-title>4.2.4.2. package context declaration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="classifiercontextdeclaration" starting-state="hide"><fo:bookmark-title>4.2.4.3. classifier context declaration</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="featuredefinitions" starting-state="hide"><fo:bookmark-title>4.2.4.4. feature definitions</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="classinvariants" starting-state="hide"><fo:bookmark-title>4.2.4.5. class invariants</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="custommessages" starting-state="hide"><fo:bookmark-title>4.2.4.6. custom messages</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="operationandpropertycontextdeclarations" starting-state="hide"><fo:bookmark-title>4.2.4.7. operation and property context declarations</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="LoadCompleteOCLResource" starting-state="hide"><fo:bookmark-title>4.2.5. OCL-&gt;Load Document Menu Action</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-EcoreComplements" starting-state="hide"><fo:bookmark-title>4.2.6. Example Complete OCL complements for Ecore</fo:bookmark-title><fo:bookmark internal-destination="DerivationIsVolatile" starting-state="hide"><fo:bookmark-title>4.2.6.1. DerivationIsVolatile</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivationIsTransient" starting-state="hide"><fo:bookmark-title>4.2.6.2. DerivationIsTransient</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivationIsNotComposed" starting-state="hide"><fo:bookmark-title>4.2.6.3. DerivationIsNotComposed</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivationWithOppositeHasOppositeDerivation" starting-state="hide"><fo:bookmark-title>4.2.6.4. DerivationWithOppositeHasOppositeDerivation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivationIsUninitialized" starting-state="hide"><fo:bookmark-title>4.2.6.5. DerivationIsUninitialized</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivationDoesNotResolveProxies" starting-state="hide"><fo:bookmark-title>4.2.6.6. DerivationDoesNotResolveProxies</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-EcoreValidation" starting-state="hide"><fo:bookmark-title>4.2.7. Validating Ecore with additional Complete OCL</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-Updating" starting-state="hide"><fo:bookmark-title>4.2.8. Editing the Complete OCL</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-UMLComplements" starting-state="hide"><fo:bookmark-title>4.2.9. Example Complete OCL complements for UML</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorial-XtextComplements" starting-state="hide"><fo:bookmark-title>4.2.10. Example Complete OCL complements for Xtext</fo:bookmark-title><fo:bookmark internal-destination="NoAnonymousImports" starting-state="hide"><fo:bookmark-title>4.2.10.1. NoAnonymousImports</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="NoActions" starting-state="hide"><fo:bookmark-title>4.2.10.2. NoActions</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CamelCaseName" starting-state="hide"><fo:bookmark-title>4.2.10.3. CamelCaseName</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UpperName" starting-state="hide"><fo:bookmark-title>4.2.10.4. UpperName</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CompleteOCLEditor" starting-state="hide"><fo:bookmark-title>4.2.11. Complete OCL Editor</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="RoyalandLoyalExample" starting-state="hide"><fo:bookmark-title>4.2.12. Royal and Loyal Example</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Summary2" starting-state="hide"><fo:bookmark-title>4.2.13. Summary</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="SafeNavigationTutorial" starting-state="hide"><fo:bookmark-title>4.3. Safe navigation tutorial</fo:bookmark-title><fo:bookmark internal-destination="Overview3" starting-state="hide"><fo:bookmark-title>4.3.1. Overview</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="References2" starting-state="hide"><fo:bookmark-title>4.3.2. References</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Evaluationhazards" starting-state="hide"><fo:bookmark-title>4.3.3. Evaluation hazards</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EnableSafeNavigationDiagnosis" starting-state="hide"><fo:bookmark-title>4.3.4. Enable Safe Navigation Diagnosis</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SafeNavigationDiagnosis" starting-state="hide"><fo:bookmark-title>4.3.5. Safe Navigation Diagnosis</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SafeNavigationOperators" starting-state="hide"><fo:bookmark-title>4.3.6. Safe Navigation Operators</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="NullfreeCollections" starting-state="hide"><fo:bookmark-title>4.3.7. Null-free Collections</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DeclaringNullfreeCollectionsinEcore" starting-state="hide"><fo:bookmark-title>4.3.8. Declaring Null-free Collections in Ecore</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DeclaringNullfreeCollectionsinUML" starting-state="hide"><fo:bookmark-title>4.3.9. Declaring Null-free Collections in UML</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CodeGenerationTutorial" starting-state="hide"><fo:bookmark-title>4.4. Code Generation tutorial</fo:bookmark-title><fo:bookmark internal-destination="LoadOCLinEcoreTutorialExampleProject" starting-state="hide"><fo:bookmark-title>4.4.1. Load OCLinEcore Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Directcode" starting-state="hide"><fo:bookmark-title>4.4.2. Direct code</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UsingaGenAnnotation" starting-state="hide"><fo:bookmark-title>4.4.3. Using a GenAnnotation</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="DebuggerTutorial" starting-state="hide"><fo:bookmark-title>4.5. Debugger tutorial</fo:bookmark-title><fo:bookmark internal-destination="LoadOCLinEcoreTutorialExampleProject2" starting-state="hide"><fo:bookmark-title>4.5.1. Load OCLinEcore Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheOCLDebugger" starting-state="hide"><fo:bookmark-title>4.5.2. The OCL Debugger</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="VerySimpleDebugsession" starting-state="hide"><fo:bookmark-title>4.5.3. Very Simple Debug session</fo:bookmark-title><fo:bookmark internal-destination="Startingthedebugger" starting-state="hide"><fo:bookmark-title>4.5.3.1. Starting the debugger</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ExploringVariables" starting-state="hide"><fo:bookmark-title>4.5.3.2. Exploring Variables</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SteppingExecution" starting-state="hide"><fo:bookmark-title>4.5.3.3. Stepping Execution</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="DebuggingaValidationfailure" starting-state="hide"><fo:bookmark-title>4.5.4. Debugging a Validation failure</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DebuggingCompleteOCLvalidationfailure" starting-state="hide"><fo:bookmark-title>4.5.5. Debugging Complete OCL validation failure</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Consoleexperiments" starting-state="hide"><fo:bookmark-title>4.5.6. Console experiments</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Longerrangestepping" starting-state="hide"><fo:bookmark-title>4.5.7. Longer range stepping</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Breakpoints" starting-state="hide"><fo:bookmark-title>4.5.8. Break points</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ValidationTutorial" starting-state="hide"><fo:bookmark-title>4.6. Validation tutorial</fo:bookmark-title><fo:bookmark internal-destination="LoadCompleteOCLTutorialExampleProject2" starting-state="hide"><fo:bookmark-title>4.6.1. Load Complete OCL Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="LoadTestModel" starting-state="hide"><fo:bookmark-title>4.6.2. Load Test Model</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EMFValidation" starting-state="hide"><fo:bookmark-title>4.6.3. EMF Validation</fo:bookmark-title><fo:bookmark internal-destination="ValidityViewValidation" starting-state="hide"><fo:bookmark-title>4.6.3.1. Validity View Validation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="FilteringbyRootModels" starting-state="hide"><fo:bookmark-title>4.6.3.2. Filtering by Root Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="FilteringbyStatus" starting-state="hide"><fo:bookmark-title>4.6.3.3. Filtering by Status</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Debuggingconstraints" starting-state="hide"><fo:bookmark-title>4.6.3.4. Debugging constraints</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="OCLInterpreterTutorial" starting-state="hide"><fo:bookmark-title>4.7. Working with Classic OCL</fo:bookmark-title><fo:bookmark internal-destination="Overview4" starting-state="hide"><fo:bookmark-title>4.7.1. Overview</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="References3" starting-state="hide"><fo:bookmark-title>4.7.2. References</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ParsingOCLExpressions" starting-state="hide"><fo:bookmark-title>4.7.3. Parsing OCL Expressions</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ParsingOCLConstraints" starting-state="hide"><fo:bookmark-title>4.7.4. Parsing OCL Constraints</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EvaluatingOCLExpressionsandConstraints" starting-state="hide"><fo:bookmark-title>4.7.5. Evaluating OCL Expressions and Constraints</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ImplementingContentAssist" starting-state="hide"><fo:bookmark-title>4.7.6. Implementing Content Assist</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="WorkingwiththeAST" starting-state="hide"><fo:bookmark-title>4.7.7. Working with the AST</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Serialization" starting-state="hide"><fo:bookmark-title>4.7.8. Serialization</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Summary3" starting-state="hide"><fo:bookmark-title>4.7.9. Summary</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Extensions" starting-state="hide"><fo:bookmark-title>4.8. Extensions (in the Unified/Pivot OCL prototype)</fo:bookmark-title><fo:bookmark internal-destination="Models" starting-state="hide"><fo:bookmark-title>4.8.1. Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="XMI" starting-state="hide"><fo:bookmark-title>4.8.2. XMI</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Templates" starting-state="hide"><fo:bookmark-title>4.8.3. Templates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Extensibility" starting-state="hide"><fo:bookmark-title>4.8.4. Extensibility</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OperationOverloading" starting-state="hide"><fo:bookmark-title>4.8.5. Operation Overloading</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Stereotypes" starting-state="hide"><fo:bookmark-title>4.8.6. Stereotypes</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SafeNavigation" starting-state="hide"><fo:bookmark-title>4.8.7. Safe Navigation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Reflection" starting-state="hide"><fo:bookmark-title>4.8.8. Reflection</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="LambdaExpressions" starting-state="hide"><fo:bookmark-title>4.8.9. Lambda Expressions</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MapKV" starting-state="hide"><fo:bookmark-title>4.8.10. Map(K,V)</fo:bookmark-title><fo:bookmark internal-destination="Details" starting-state="hide"><fo:bookmark-title>4.8.10.1. Details</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Installation" starting-state="hide"><fo:bookmark-title>4.9. Installing the Eclipse OCL Examples and Editors</fo:bookmark-title><fo:bookmark internal-destination="Troubleshooting2" starting-state="hide"><fo:bookmark-title>4.9.1. Troubleshooting</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="Examples" starting-state="hide"><fo:bookmark-title>Chapter 5. Examples</fo:bookmark-title><fo:bookmark internal-destination="RoyalAndLoyalExample" starting-state="hide"><fo:bookmark-title>5.1. Royal and Loyal Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="EmptyExample" starting-state="hide"><fo:bookmark-title>5.2. Empty Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLinEcoreTutorialExampleProject" starting-state="hide"><fo:bookmark-title>5.3. OCLinEcore Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLTutorialExampleProject" starting-state="hide"><fo:bookmark-title>5.4. Complete OCL Tutorial Example Project</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLInterpreterExample" starting-state="hide"><fo:bookmark-title>5.5. OCL Interpreter Example</fo:bookmark-title><fo:bookmark internal-destination="Introduction" starting-state="hide"><fo:bookmark-title>5.5.1. Introduction</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="References4" starting-state="hide"><fo:bookmark-title>5.5.2. References</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Description" starting-state="hide"><fo:bookmark-title>5.5.3. Description</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SupportforEcoreandUMLModels" starting-state="hide"><fo:bookmark-title>5.5.4. Support for Ecore and UML Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ExampleCode" starting-state="hide"><fo:bookmark-title>5.5.5. Example Code</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="ProgrammersGuide" starting-state="hide"><fo:bookmark-title>Chapter 6. Classic Ecore/UML Programmers Guide</fo:bookmark-title><fo:bookmark internal-destination="ParsingConstraints" starting-state="hide"><fo:bookmark-title>6.1. Parsing Constraints and Queries</fo:bookmark-title><fo:bookmark internal-destination="TheOCLEnvironment" starting-state="hide"><fo:bookmark-title>6.1.1. The OCL Environment</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CreatinganOCLEnvironment" starting-state="hide"><fo:bookmark-title>6.1.2. Creating an OCL Environment</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheOCLHelper" starting-state="hide"><fo:bookmark-title>6.1.3. The OCL Helper</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OperationandAttributeContexts" starting-state="hide"><fo:bookmark-title>6.1.4. Operation and Attribute Contexts</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="EvaluatingConstraints" starting-state="hide"><fo:bookmark-title>6.2. Evaluating Constraints and Queries</fo:bookmark-title><fo:bookmark internal-destination="TheOCLQuery" starting-state="hide"><fo:bookmark-title>6.2.1. The OCL Query</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ParsingDocuments" starting-state="hide"><fo:bookmark-title>6.3. Parsing OCL Documents</fo:bookmark-title><fo:bookmark internal-destination="TheOCLInput" starting-state="hide"><fo:bookmark-title>6.3.1. The OCL Input</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="AccessingtheConstraints" starting-state="hide"><fo:bookmark-title>6.3.2. Accessing the Constraints</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="TargetMetamodels" starting-state="hide"><fo:bookmark-title>6.4. OCL Relationship to Metamodels</fo:bookmark-title><fo:bookmark internal-destination="TheEcoreMetamodelBinding" starting-state="hide"><fo:bookmark-title>6.4.1. The Ecore Metamodel Binding</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheUMLMetamodelBinding" starting-state="hide"><fo:bookmark-title>6.4.2. The UML Metamodel Binding</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ContentAssistSupport" starting-state="hide"><fo:bookmark-title>6.5. Content Assist Support</fo:bookmark-title><fo:bookmark internal-destination="SyntaxCompletionChoices" starting-state="hide"><fo:bookmark-title>6.5.1. Syntax Completion Choices</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="AbstractSyntax" starting-state="hide"><fo:bookmark-title>6.6. OCL Abstract Syntax Model</fo:bookmark-title><fo:bookmark internal-destination="TheVisitableandVisitorInterfaces" starting-state="hide"><fo:bookmark-title>6.6.1. The Visitable and Visitor Interfaces</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ImplementingaVisitor" starting-state="hide"><fo:bookmark-title>6.6.2. Implementing a Visitor</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="HiddenOpposites" starting-state="hide"><fo:bookmark-title>6.6.3. The OppositePropertyCallExp Extension</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="CustomizingtheEnvironment" starting-state="hide"><fo:bookmark-title>6.7. Customizing the Environment</fo:bookmark-title><fo:bookmark internal-destination="DefiningGlobalVariables" starting-state="hide"><fo:bookmark-title>6.7.1. Defining Global Variables</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DefiningHelperOperationsinJava" starting-state="hide"><fo:bookmark-title>6.7.2. Defining Helper Operations in Java</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SelectingaPackageLookupStrategy" starting-state="hide"><fo:bookmark-title>6.7.3. Selecting a Package Lookup Strategy</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CustomizingHiddenOppositeLookupandNavigation" starting-state="hide"><fo:bookmark-title>6.7.4. Customizing Hidden Opposite Lookup and Navigation</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Persistence" starting-state="hide"><fo:bookmark-title>6.8. OCL Persistence</fo:bookmark-title><fo:bookmark internal-destination="TheTypeResolver" starting-state="hide"><fo:bookmark-title>6.8.1. The Type Resolver</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="AdvancedMetamodelBindings" starting-state="hide"><fo:bookmark-title>6.9. Creating Metamodel Bindings</fo:bookmark-title><fo:bookmark internal-destination="TheOCLAbstractSyntaxModel" starting-state="hide"><fo:bookmark-title>6.9.1. The OCL Abstract Syntax Model</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ImpactAnalyzer" starting-state="hide"><fo:bookmark-title>6.10. Incrementally Re-Evaluating OCL Expressions Using the Impact Analyzer</fo:bookmark-title><fo:bookmark internal-destination="UsingtheImpactAnalyzerinEMFEditors" starting-state="hide"><fo:bookmark-title>6.10.1. Using the Impact Analyzer in EMF Editors</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="AlgorithmOutline" starting-state="hide"><fo:bookmark-title>6.10.2. Algorithm Outline</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ImpactAnalyzerConfigurationScopes" starting-state="hide"><fo:bookmark-title>6.10.3. Impact Analyzer Configuration, Scopes</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Delegates" starting-state="hide"><fo:bookmark-title>6.11. Delegates</fo:bookmark-title><fo:bookmark internal-destination="GenModelSettings" starting-state="hide"><fo:bookmark-title>6.11.1. GenModel Settings</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLDelegateURI" starting-state="hide"><fo:bookmark-title>6.11.2. OCL Delegate URIs</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="StandaloneInitialization" starting-state="hide"><fo:bookmark-title>6.11.3. Standalone Initialization</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="InvocationDelegate" starting-state="hide"><fo:bookmark-title>6.11.4. Invocation Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SettingDelegate" starting-state="hide"><fo:bookmark-title>6.11.5. Setting Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ValidationDelegate" starting-state="hide"><fo:bookmark-title>6.11.6. Validation Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ValidationMessages" starting-state="hide"><fo:bookmark-title>6.11.7. Validation Messages</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="QueryDelegate" starting-state="hide"><fo:bookmark-title>6.11.8. Query Delegates</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Standalone" starting-state="hide"><fo:bookmark-title>6.12. Ecore/UML Standalone Configuration</fo:bookmark-title><fo:bookmark internal-destination="Ecore" starting-state="hide"><fo:bookmark-title>6.12.1. Ecore</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UML" starting-state="hide"><fo:bookmark-title>6.12.2. UML</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Classpath" starting-state="hide"><fo:bookmark-title>6.12.3. Classpath</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="XtextEditors" starting-state="hide"><fo:bookmark-title>6.12.4. Xtext Editors</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="PivotProgrammersGuide" starting-state="hide"><fo:bookmark-title>Chapter 7. Unified or Pivot Programmers Guide</fo:bookmark-title><fo:bookmark internal-destination="OCL-Environment" starting-state="hide"><fo:bookmark-title>7.1. OCL Environment</fo:bookmark-title><fo:bookmark internal-destination="OCLproblem" starting-state="hide"><fo:bookmark-title>7.1.1. OCL Implementation Problem</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLwithAdapters" starting-state="hide"><fo:bookmark-title>7.1.2. OCL adapters pre-2021-03</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLperThread" starting-state="hide"><fo:bookmark-title>7.1.3. OCL per Thread post-2021-03</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Validators" starting-state="hide"><fo:bookmark-title>7.2. Validators</fo:bookmark-title><fo:bookmark internal-destination="OCLinEcoreEObjectValidator" starting-state="hide"><fo:bookmark-title>7.2.1. OCLinEcoreEObjectValidator</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="CompleteOCLEObjectValidator" starting-state="hide"><fo:bookmark-title>7.2.2. CompleteOCLEObjectValidator</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotEvaluator" starting-state="hide"><fo:bookmark-title>7.3. The Pivot Evaluator</fo:bookmark-title><fo:bookmark internal-destination="PivotValue-History" starting-state="hide"><fo:bookmark-title>7.3.1. The Evolving Pivot Value System</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotValues" starting-state="hide"><fo:bookmark-title>7.3.2. The Pivot Value System</fo:bookmark-title><fo:bookmark internal-destination="PivotValueConversions" starting-state="hide"><fo:bookmark-title>7.3.2.1. Value Conversions</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotIntegers" starting-state="hide"><fo:bookmark-title>7.3.2.2. Polymorphic Integers</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotCollections" starting-state="hide"><fo:bookmark-title>7.3.2.3. Polymorphic Collections</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotObjects" starting-state="hide"><fo:bookmark-title>7.3.2.4. Polymorphic Objects</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ThePivotEvaluatorTypeSystem" starting-state="hide"><fo:bookmark-title>7.3.3. The Pivot Evaluator Type System</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ThePivotEvaluatorImplementationSystem" starting-state="hide"><fo:bookmark-title>7.3.4. The Pivot Evaluator Implementation System</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PolymorphicImplementations" starting-state="hide"><fo:bookmark-title>7.3.5. Polymorphic Implementations</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotStandalone" starting-state="hide"><fo:bookmark-title>7.4. Pivot Standalone Configuration</fo:bookmark-title><fo:bookmark internal-destination="Models2" starting-state="hide"><fo:bookmark-title>7.4.1. Models</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLStandardLibrary" starting-state="hide"><fo:bookmark-title>7.4.2. OCL Standard Library</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="PivotDelegates" starting-state="hide"><fo:bookmark-title>7.4.3. Pivot Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="XtextParsers" starting-state="hide"><fo:bookmark-title>7.4.4. Xtext Parsers</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="platformpluginandplatformresourceURIs" starting-state="hide"><fo:bookmark-title>7.4.5. platform:/plugin and platform:/resource URIs</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Classpath2" starting-state="hide"><fo:bookmark-title>7.4.6. Classpath</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotThreadSafety" starting-state="hide"><fo:bookmark-title>7.5. Pivot Thread Safety</fo:bookmark-title><fo:bookmark internal-destination="CodeGeneratedEvaluation" starting-state="hide"><fo:bookmark-title>7.5.1. Code Generated Evaluation</fo:bookmark-title><fo:bookmark internal-destination="DesignNotes" starting-state="hide"><fo:bookmark-title>7.5.1.1. Design Notes</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="InterpretedEvaluation" starting-state="hide"><fo:bookmark-title>7.5.2. Interpreted Evaluation</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLAnalysis" starting-state="hide"><fo:bookmark-title>7.5.3. OCL Analysis</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotParsingConstraints" starting-state="hide"><fo:bookmark-title>7.6. Parsing Constraints and Queries</fo:bookmark-title><fo:bookmark internal-destination="TheOCLFacade2" starting-state="hide"><fo:bookmark-title>7.6.1. The OCL Facade</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OCLHandles" starting-state="hide"><fo:bookmark-title>7.6.2. OCL Handles</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ClassContext" starting-state="hide"><fo:bookmark-title>7.6.3. Class Context</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="OperationandPropertyContexts" starting-state="hide"><fo:bookmark-title>7.6.4. Operation and Property Contexts</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Errors" starting-state="hide"><fo:bookmark-title>7.6.5. Errors</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TheOCLHelper2" starting-state="hide"><fo:bookmark-title>7.6.6. The OCL Helper</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotEvaluatingConstraints" starting-state="hide"><fo:bookmark-title>7.7. Evaluating Constraints and Queries</fo:bookmark-title><fo:bookmark internal-destination="TheOCLQuery2" starting-state="hide"><fo:bookmark-title>7.7.1. The OCL Query</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Objectrepresentations" starting-state="hide"><fo:bookmark-title>7.7.2. Object representations</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MultipleEvaluations" starting-state="hide"><fo:bookmark-title>7.7.3. Multiple Evaluations</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="SuccintEvaluations" starting-state="hide"><fo:bookmark-title>7.7.4. Succint Evaluations</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotParsingDocuments" starting-state="hide"><fo:bookmark-title>7.8. Parsing OCL Documents</fo:bookmark-title><fo:bookmark internal-destination="TheOCLInput2" starting-state="hide"><fo:bookmark-title>7.8.1. The OCL Input</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="TraversingtheConstraints" starting-state="hide"><fo:bookmark-title>7.8.2. Traversing the Constraints</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="AccessingtheConstraints2" starting-state="hide"><fo:bookmark-title>7.8.3. Accessing the Constraints</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UsingtheConstraintstoValidateaModel" starting-state="hide"><fo:bookmark-title>7.8.4. Using the Constraints to Validate a Model</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="PivotMetamodels" starting-state="hide"><fo:bookmark-title>7.9. OCL Relationship to Metamodels</fo:bookmark-title><fo:bookmark internal-destination="ThePivotMetamodelBinding" starting-state="hide"><fo:bookmark-title>7.9.1. The Pivot Metamodel Binding</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="Pivot-Ids" starting-state="hide"><fo:bookmark-title>7.10. Ids</fo:bookmark-title><fo:bookmark internal-destination="Pivot-Id-Equality" starting-state="hide"><fo:bookmark-title>7.10.1. Id Equality</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-IdManager" starting-state="hide"><fo:bookmark-title>7.10.2. IdManager</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-CollectionTypeId" starting-state="hide"><fo:bookmark-title>7.10.3. CollectionTypeId</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-TupleTypeId" starting-state="hide"><fo:bookmark-title>7.10.4. TupleTypeId</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-LambdaTypeId" starting-state="hide"><fo:bookmark-title>7.10.5. LambdaTypeId</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-ParameterIds" starting-state="hide"><fo:bookmark-title>7.10.6. ParameterIds</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-TuplePartId" starting-state="hide"><fo:bookmark-title>7.10.7. TuplePartId</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-TemplateParameterId" starting-state="hide"><fo:bookmark-title>7.10.8. TemplateParameterId</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Pivot-Id-CG" starting-state="hide"><fo:bookmark-title>7.10.9. Code Generation</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="APIReference" starting-state="hide"><fo:bookmark-title>Chapter 8. API Reference</fo:bookmark-title><fo:bookmark internal-destination="Javadoc" starting-state="hide"><fo:bookmark-title>8.1. Javadoc</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="Extensionpoints" starting-state="hide"><fo:bookmark-title>8.2. Extension points</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="BuildingtheOCLProject" starting-state="hide"><fo:bookmark-title>Chapter 9. Building the OCL Project</fo:bookmark-title><fo:bookmark internal-destination="OOMPH" starting-state="hide"><fo:bookmark-title>9.1. OOMPH</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MavenCentralandrepo.eclipse.org" starting-state="hide"><fo:bookmark-title>9.2. Maven Central and repo.eclipse.org</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="MavenandGradle" starting-state="hide"><fo:bookmark-title>9.3. Maven and Gradle</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="GenAnnotations" starting-state="hide"><fo:bookmark-title>9.4. GenModel GenAnnotations</fo:bookmark-title><fo:bookmark internal-destination="httpwww.eclipse.orgOCLGenModelGenAnnotationSource" starting-state="hide"><fo:bookmark-title>9.4.1. http://www.eclipse.org/OCL/GenModel GenAnnotation Source</fo:bookmark-title><fo:bookmark internal-destination="UseDelegates" starting-state="hide"><fo:bookmark-title>9.4.1.1. Use Delegates</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="UseNullAnnotations" starting-state="hide"><fo:bookmark-title>9.4.1.2. Use Null Annotations</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="httpwww.eclipse.orgOCLGenModelToString" starting-state="hide"><fo:bookmark-title>9.4.2. http://www.eclipse.org/OCL/GenModel/ToString</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="httpwww.eclipse.orgOCLGenModelVisitor" starting-state="hide"><fo:bookmark-title>9.4.3. http://www.eclipse.org/OCL/GenModel/Visitor</fo:bookmark-title><fo:bookmark internal-destination="RootVisitorClass" starting-state="hide"><fo:bookmark-title>9.4.3.1. Root Visitor Class</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="DerivedVisitorClass" starting-state="hide"><fo:bookmark-title>9.4.3.2. Derived Visitor Class</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="VisitableInterface" starting-state="hide"><fo:bookmark-title>9.4.3.3. Visitable Interface</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="VisitableClasses" starting-state="hide"><fo:bookmark-title>9.4.3.4. Visitable Classes</fo:bookmark-title></fo:bookmark><fo:bookmark internal-destination="ImplementationDetails" starting-state="hide"><fo:bookmark-title>9.4.3.5. Implementation Details</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="httpwww.eclipse.orgOCLGenModelCopyAndPaste" starting-state="hide"><fo:bookmark-title>9.4.4. http://www.eclipse.org/OCL/GenModel/CopyAndPaste</fo:bookmark-title><fo:bookmark internal-destination="ImplementationDetails2" starting-state="hide"><fo:bookmark-title>9.4.4.1. Implementation Details</fo:bookmark-title></fo:bookmark></fo:bookmark><fo:bookmark internal-destination="ImplementationDetails3" starting-state="hide"><fo:bookmark-title>9.4.5. Implementation Details</fo:bookmark-title><fo:bookmark internal-destination="org.eclipse.ocl.examples.build" starting-state="hide"><fo:bookmark-title>9.4.5.1.  org.eclipse.ocl.examples.build</fo:bookmark-title></fo:bookmark></fo:bookmark></fo:bookmark></fo:bookmark><fo:bookmark xmlns:fox="http://xmlgraphics.apache.org/fop/extensions" internal-destination="glossary" starting-state="hide"><fo:bookmark-title>Appendix A. Glossary</fo:bookmark-title></fo:bookmark></fo:bookmark-tree><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="coversequence" hyphenate="true" language="en" format="1" initial-page-number="1" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>OCL Documentation</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>OCL Documentation</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body"><fo:block id="N10001"><fo:block><fo:block><fo:block><fo:table width="175mm" table-layout="fixed"><fo:table-column column-width="175mm"/><fo:table-body><fo:table-row height="20pc"><fo:table-cell text-align="center"><fo:block/></fo:table-cell></fo:table-row><fo:table-row><fo:table-cell text-align="center"><fo:block><fo:external-graphic content-width="10cm" src="file:images/logo/Xtext-logo-dark-1600.png"/></fo:block></fo:table-cell></fo:table-row><fo:table-row><fo:table-cell text-align="center"><fo:block padding-before="25mm" font-size="24pt" font-family="Helvetica">OCL Documentation</fo:block><fo:block font-size="12pt" font-family="Helvetica">Christian Damus, Adolfo Sánchez-Barbudo Herrera, Axel Uhl, Edward Willink and contributors</fo:block><fo:block padding="10mm" font-size="12pt" font-family="Helvetica">Copyright 2002 - 2021</fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="lot" hyphenate="true" language="en" format="i" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>OCL Documentation</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>OCL Documentation</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="toc...N10001"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OverviewandGettingStarted">1. Overview and Getting Started</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OverviewandGettingStarted"><fo:page-number-citation ref-id="OverviewandGettingStarted"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OverviewandGettingStarted" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="WhatisOCL">1.1. What is OCL?</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="WhatisOCL"><fo:page-number-citation ref-id="WhatisOCL"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="HowDoesItWork">1.2. How Does It Work?</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="HowDoesItWork"><fo:page-number-citation ref-id="HowDoesItWork"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.HowDoesItWork" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Editing">1.2.1. Editing</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Editing"><fo:page-number-citation ref-id="Editing"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Execution">1.2.2. Execution</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Execution"><fo:page-number-citation ref-id="Execution"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Debugging">1.2.3. Debugging</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Debugging"><fo:page-number-citation ref-id="Debugging"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Testing">1.2.4. Testing</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Testing"><fo:page-number-citation ref-id="Testing"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EclipseOCLisExtensible">1.3. Eclipse OCL is Extensible</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EclipseOCLisExtensible"><fo:page-number-citation ref-id="EclipseOCLisExtensible"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="WhoUsesOCLandEclipseOCL">1.4. Who Uses OCL and Eclipse OCL?</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="WhoUsesOCLandEclipseOCL"><fo:page-number-citation ref-id="WhoUsesOCLandEclipseOCL"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="WhoisBehindEclipseOCL">1.5. Who is Behind Eclipse OCL?</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="WhoisBehindEclipseOCL"><fo:page-number-citation ref-id="WhoisBehindEclipseOCL"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="GettingStarted">1.6. Getting Started</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="GettingStarted"><fo:page-number-citation ref-id="GettingStarted"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UsersGuide">2. Users Guide</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UsersGuide"><fo:page-number-citation ref-id="UsersGuide"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.UsersGuide" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EclipseOCLs">2.1. The two Eclipse OCLs</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EclipseOCLs"><fo:page-number-citation ref-id="EclipseOCLs"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.EclipseOCLs" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheClassicEclipseOCLmetamodels">2.1.1. The Classic Eclipse OCL metamodels</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheClassicEclipseOCLmetamodels"><fo:page-number-citation ref-id="TheClassicEclipseOCLmetamodels"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheUnifiedorPivotEclipseOCLmetamodel">2.1.2. The Unified or Pivot Eclipse OCL metamodel</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheUnifiedorPivotEclipseOCLmetamodel"><fo:page-number-citation ref-id="TheUnifiedorPivotEclipseOCLmetamodel"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Thetransition">2.1.3. The transition</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Thetransition"><fo:page-number-citation ref-id="Thetransition"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Migration">2.1.4. Migration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Migration"><fo:page-number-citation ref-id="Migration"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="APIs">2.1.5. APIs</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="APIs"><fo:page-number-citation ref-id="APIs"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EssentialOCL">2.2. The Essential OCL Language</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EssentialOCL"><fo:page-number-citation ref-id="EssentialOCL"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.EssentialOCL" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Syntax">2.2.1. Syntax</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Syntax"><fo:page-number-citation ref-id="Syntax"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcore">2.3. The OCLinEcore Language</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcore"><fo:page-number-citation ref-id="OCLinEcore"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLinEcore" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Syntax2">2.3.1. Syntax</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Syntax2"><fo:page-number-citation ref-id="Syntax2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Limitations">2.3.2. Limitations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Limitations"><fo:page-number-citation ref-id="Limitations"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCL">2.4. The Complete OCL Language</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCL"><fo:page-number-citation ref-id="CompleteOCL"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.CompleteOCL" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Syntax3">2.4.1. Syntax</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Syntax3"><fo:page-number-citation ref-id="Syntax3"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLstdlib">2.5. The OCL Standard Library Language</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLstdlib"><fo:page-number-citation ref-id="OCLstdlib"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLstdlib" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Syntax4">2.5.1. Syntax</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Syntax4"><fo:page-number-citation ref-id="Syntax4"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Editors">2.6. Editors</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Editors"><fo:page-number-citation ref-id="Editors"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Editors" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Syntaxcoloring">2.6.1. Syntax coloring</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Syntaxcoloring"><fo:page-number-citation ref-id="Syntaxcoloring"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Validation">2.6.2. Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Validation"><fo:page-number-citation ref-id="Validation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="HoverText">2.6.3. Hover Text</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="HoverText"><fo:page-number-citation ref-id="HoverText"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ContentAssist">2.6.4. Content Assist</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ContentAssist"><fo:page-number-citation ref-id="ContentAssist"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CodeTemplates">2.6.5. Code Templates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CodeTemplates"><fo:page-number-citation ref-id="CodeTemplates"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OpenDeclaration">2.6.6. Open Declaration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OpenDeclaration"><fo:page-number-citation ref-id="OpenDeclaration"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="NatureAndBuilder">2.7. OCL Nature and Builder Auto-Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="NatureAndBuilder"><fo:page-number-citation ref-id="NatureAndBuilder"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.NatureAndBuilder" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLbuilderConfiguration">2.7.1. Configuring the OCL Nature and Builder</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLbuilderConfiguration"><fo:page-number-citation ref-id="OCLbuilderConfiguration"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EcoreAndUMLautoValidation">2.7.2. Ecore and UML Auto-Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EcoreAndUMLautoValidation"><fo:page-number-citation ref-id="EcoreAndUMLautoValidation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="NoNature">2.7.3. Building on pre-Photon / 2018 releases</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="NoNature"><fo:page-number-citation ref-id="NoNature"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="InteractiveOCL">2.8. Console</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="InteractiveOCL"><fo:page-number-citation ref-id="InteractiveOCL"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.InteractiveOCL" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ContextObjectSelection">2.8.1. Context Object Selection</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ContextObjectSelection"><fo:page-number-citation ref-id="ContextObjectSelection"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Editing2">2.8.2. Editing</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Editing2"><fo:page-number-citation ref-id="Editing2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EditorKeys">2.8.3. Editor Keys</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EditorKeys"><fo:page-number-citation ref-id="EditorKeys"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Results">2.8.4. Results</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Results"><fo:page-number-citation ref-id="Results"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ToolBar">2.8.5. Tool Bar</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ToolBar"><fo:page-number-citation ref-id="ToolBar"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidityView">2.9. Validity View (new in Luna)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidityView"><fo:page-number-citation ref-id="ValidityView"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ValidityView" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidityViewToolBar">2.9.1. View Tool Bar</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidityViewToolBar"><fo:page-number-citation ref-id="ValidityViewToolBar"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidityViewModelElementsPane">2.9.2. Model Elements Pane</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidityViewModelElementsPane"><fo:page-number-citation ref-id="ValidityViewModelElementsPane"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidityViewMetamodelConstraintsPane">2.9.3. Metamodel Constraints Pane</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidityViewMetamodelConstraintsPane"><fo:page-number-citation ref-id="ValidityViewMetamodelConstraintsPane"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ConstraintLocators">2.9.4. Constraint Locators</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ConstraintLocators"><fo:page-number-citation ref-id="ConstraintLocators"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Debugger">2.10. Debugger (new in Luna)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Debugger"><fo:page-number-citation ref-id="Debugger"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Debugger" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Launching">2.10.1. Launching</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Launching"><fo:page-number-citation ref-id="Launching"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Stepping">2.10.2. Stepping</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Stepping"><fo:page-number-citation ref-id="Stepping"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="VariablesView">2.10.3. Variables View</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="VariablesView"><fo:page-number-citation ref-id="VariablesView"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="BreakpointsView">2.10.4. Breakpoints View</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="BreakpointsView"><fo:page-number-citation ref-id="BreakpointsView"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OutlineView">2.10.5. Outline View</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OutlineView"><fo:page-number-citation ref-id="OutlineView"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Integration">2.11. OCL Integration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Integration"><fo:page-number-citation ref-id="Integration"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Integration" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Integration-OCLinEcore">2.11.1. OCL execution in Ecore / EMF Delegates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Integration-OCLinEcore"><fo:page-number-citation ref-id="Integration-OCLinEcore"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Integration-Messages">2.11.2. Custom Validation Messages</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Integration-Messages"><fo:page-number-citation ref-id="Integration-Messages"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Integration-CompleteOCL">2.11.3. CompleteOCL Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Integration-CompleteOCL"><fo:page-number-citation ref-id="Integration-CompleteOCL"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreforXtextValidation">2.11.4. OCLinEcore for Xtext Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreforXtextValidation"><fo:page-number-citation ref-id="OCLinEcoreforXtextValidation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLforXtextValidation">2.11.5. Complete OCL for Xtext Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLforXtextValidation"><fo:page-number-citation ref-id="CompleteOCLforXtextValidation"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinPapyrus">2.12. OCL in UML (using Papyrus)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinPapyrus"><fo:page-number-citation ref-id="OCLinPapyrus"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLinPapyrus" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinPapyrus-UML-integration">2.12.1. UML Integration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinPapyrus-UML-integration"><fo:page-number-citation ref-id="OCLinPapyrus-UML-integration"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinPapyrus-Class-Diagram">2.12.2. Class Diagram</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinPapyrus-Class-Diagram"><fo:page-number-citation ref-id="OCLinPapyrus-Class-Diagram"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinPapyrus-StateMachine-Diagram">2.12.3. State Machine Diagram</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinPapyrus-StateMachine-Diagram"><fo:page-number-citation ref-id="OCLinPapyrus-StateMachine-Diagram"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLExamplesforUML">2.13. OCL Constraint Examples for UML (using Papyrus)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLExamplesforUML"><fo:page-number-citation ref-id="OCLExamplesforUML"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLExamplesforUML" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLM1Constraints">2.13.1. Model Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLM1Constraints"><fo:page-number-citation ref-id="OCLM1Constraints"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLM2Constraints">2.13.2. Profile Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLM2Constraints"><fo:page-number-citation ref-id="OCLM2Constraints"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UserInterface">2.14. User Interface</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UserInterface"><fo:page-number-citation ref-id="UserInterface"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.UserInterface" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PropertyPages">2.14.1. Project Property Pages</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PropertyPages"><fo:page-number-citation ref-id="PropertyPages"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PreferencePages">2.14.2. Workspace Preference Pages</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PreferencePages"><fo:page-number-citation ref-id="PreferencePages"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OverallOptions">2.14.3. Overall Options</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OverallOptions"><fo:page-number-citation ref-id="OverallOptions"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EcoreUMLOptions">2.14.4. Ecore and UML Options</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EcoreUMLOptions"><fo:page-number-citation ref-id="EcoreUMLOptions"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UMLOptions">2.14.5. UML Options</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UMLOptions"><fo:page-number-citation ref-id="UMLOptions"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ModelRegistry">2.14.6. Model Registry</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ModelRegistry"><fo:page-number-citation ref-id="ModelRegistry"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SyntaxColoring">2.14.7. Syntax Coloring</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SyntaxColoring"><fo:page-number-citation ref-id="SyntaxColoring"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EditorTemplates">2.14.8. Editor Templates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EditorTemplates"><fo:page-number-citation ref-id="EditorTemplates"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreOptions">2.14.9. OCLinEcore Options</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreOptions"><fo:page-number-citation ref-id="OCLinEcoreOptions"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="StandardLibrary">3. The OCL Standard Library</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="StandardLibrary"><fo:page-number-citation ref-id="StandardLibrary"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.StandardLibrary" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Precedences">3.1. 

+				<fo:inline font-weight="bold">Precedences</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Precedences"><fo:page-number-citation ref-id="Precedences"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Bag">3.2. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Bag(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Bag"><fo:page-number-citation ref-id="Bag"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Boolean">3.3. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Boolean</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Boolean"><fo:page-number-citation ref-id="Boolean"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Class">3.4. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Class"><fo:page-number-citation ref-id="Class"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Collection">3.5. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Collection"><fo:page-number-citation ref-id="Collection"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Enumeration">3.6. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Enumeration</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Enumeration"><fo:page-number-citation ref-id="Enumeration"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EnumerationLiteral">3.7. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">EnumerationLiteral</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EnumerationLiteral"><fo:page-number-citation ref-id="EnumerationLiteral"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Integer">3.8. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Integer"><fo:page-number-citation ref-id="Integer"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Map">3.9. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Map(K, V)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Map"><fo:page-number-citation ref-id="Map"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclAny">3.10. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclAny"><fo:page-number-citation ref-id="OclAny"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclComparable">3.11. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclComparable"><fo:page-number-citation ref-id="OclComparable"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclElement">3.12. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclElement</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclElement"><fo:page-number-citation ref-id="OclElement"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclEnumeration">3.13. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclEnumeration</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclEnumeration"><fo:page-number-citation ref-id="OclEnumeration"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclInvalid">3.14. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclInvalid</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclInvalid"><fo:page-number-citation ref-id="OclInvalid"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclLambda">3.15. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclLambda</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclLambda"><fo:page-number-citation ref-id="OclLambda"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclMessage">3.16. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclMessage"><fo:page-number-citation ref-id="OclMessage"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclSelf">3.17. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSelf</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclSelf"><fo:page-number-citation ref-id="OclSelf"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclState">3.18. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclState</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclState"><fo:page-number-citation ref-id="OclState"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclStereotype">3.19. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclStereotype</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclStereotype"><fo:page-number-citation ref-id="OclStereotype"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclSummable">3.20. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclSummable"><fo:page-number-citation ref-id="OclSummable"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclTuple">3.21. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclTuple</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclTuple"><fo:page-number-citation ref-id="OclTuple"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclType">3.22. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclType"><fo:page-number-citation ref-id="OclType"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OclVoid">3.23. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclVoid</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OclVoid"><fo:page-number-citation ref-id="OclVoid"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OrderedCollection">3.24. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OrderedCollection"><fo:page-number-citation ref-id="OrderedCollection"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OrderedSet">3.25. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedSet(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OrderedSet"><fo:page-number-citation ref-id="OrderedSet"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Real">3.26. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Real</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Real"><fo:page-number-citation ref-id="Real"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Sequence">3.27. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Sequence(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Sequence"><fo:page-number-citation ref-id="Sequence"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Set">3.28. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Set(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Set"><fo:page-number-citation ref-id="Set"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="State">3.29. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">State</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="State"><fo:page-number-citation ref-id="State"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="String">3.30. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">String</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="String"><fo:page-number-citation ref-id="String"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Type">3.31. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Type</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Type"><fo:page-number-citation ref-id="Type"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UniqueCollection">3.32. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UniqueCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UniqueCollection"><fo:page-number-citation ref-id="UniqueCollection"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UnlimitedNatural">3.33. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UnlimitedNatural</fo:inline>

+				</fo:inline>

+			</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UnlimitedNatural"><fo:page-number-citation ref-id="UnlimitedNatural"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Tutorials">4. Tutorials</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Tutorials"><fo:page-number-citation ref-id="Tutorials"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Tutorials" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorial">4.1. OCLinEcore tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:page-number-citation ref-id="OCLinEcoreTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLinEcoreTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Overview">4.1.1. Overview </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Overview"><fo:page-number-citation ref-id="Overview"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="References">4.1.2. References</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="References"><fo:page-number-citation ref-id="References"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorial-Installation">4.1.3. Installing the Eclipse OCL Examples</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorial-Installation"><fo:page-number-citation ref-id="OCLinEcoreTutorial-Installation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Troubleshooting">4.1.4. Troubleshooting</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Troubleshooting"><fo:page-number-citation ref-id="Troubleshooting"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UsingtheOCLinEcoretexteditorforEcore">4.1.5. Using the OCLinEcore text editor for Ecore</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UsingtheOCLinEcoretexteditorforEcore"><fo:page-number-citation ref-id="UsingtheOCLinEcoretexteditorforEcore"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CreateaDynamicModelInstance">4.1.6. Create a Dynamic Model Instance</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CreateaDynamicModelInstance"><fo:page-number-citation ref-id="CreateaDynamicModelInstance"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EnrichthemetamodelwithOCL">4.1.7. Enrich the meta-model with OCL</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EnrichthemetamodelwithOCL"><fo:page-number-citation ref-id="EnrichthemetamodelwithOCL"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorial-Console">4.1.8. The OCL Console</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorial-Console"><fo:page-number-citation ref-id="OCLinEcoreTutorial-Console"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorialHelpers">4.1.9. Helper Features and Operations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorialHelpers"><fo:page-number-citation ref-id="OCLinEcoreTutorialHelpers"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorial-genmodel">4.1.10. Generating Java Code</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorial-genmodel"><fo:page-number-citation ref-id="OCLinEcoreTutorial-genmodel"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Summary">4.1.11. Summary</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Summary"><fo:page-number-citation ref-id="Summary"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial">4.2. Complete OCL tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial"><fo:page-number-citation ref-id="CompleteOCLTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.CompleteOCLTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Overview2">4.2.1. Overview </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Overview2"><fo:page-number-citation ref-id="Overview2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLUtility">4.2.2. Complete OCL Utility</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLUtility"><fo:page-number-citation ref-id="CompleteOCLUtility"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadCompleteOCLTutorialExampleProject">4.2.3. Load Complete OCL Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadCompleteOCLTutorialExampleProject"><fo:page-number-citation ref-id="LoadCompleteOCLTutorialExampleProject"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-language">4.2.4. Complete OCL Language Overview</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-language"><fo:page-number-citation ref-id="CompleteOCLTutorial-language"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadCompleteOCLResource">4.2.5. OCL-&gt;Load Document Menu Action </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadCompleteOCLResource"><fo:page-number-citation ref-id="LoadCompleteOCLResource"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-EcoreComplements">4.2.6. Example Complete OCL complements for Ecore</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-EcoreComplements"><fo:page-number-citation ref-id="CompleteOCLTutorial-EcoreComplements"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-EcoreValidation">4.2.7. Validating Ecore with additional Complete OCL</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-EcoreValidation"><fo:page-number-citation ref-id="CompleteOCLTutorial-EcoreValidation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-Updating">4.2.8. Editing the Complete OCL</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-Updating"><fo:page-number-citation ref-id="CompleteOCLTutorial-Updating"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-UMLComplements">4.2.9. Example Complete OCL complements for UML</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-UMLComplements"><fo:page-number-citation ref-id="CompleteOCLTutorial-UMLComplements"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorial-XtextComplements">4.2.10. Example Complete OCL complements for Xtext</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorial-XtextComplements"><fo:page-number-citation ref-id="CompleteOCLTutorial-XtextComplements"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLEditor">4.2.11. Complete OCL Editor</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLEditor"><fo:page-number-citation ref-id="CompleteOCLEditor"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="RoyalandLoyalExample">4.2.12. Royal and Loyal Example</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="RoyalandLoyalExample"><fo:page-number-citation ref-id="RoyalandLoyalExample"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Summary2">4.2.13. Summary</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Summary2"><fo:page-number-citation ref-id="Summary2"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SafeNavigationTutorial">4.3. Safe navigation tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SafeNavigationTutorial"><fo:page-number-citation ref-id="SafeNavigationTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.SafeNavigationTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Overview3">4.3.1. Overview </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Overview3"><fo:page-number-citation ref-id="Overview3"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="References2">4.3.2. References</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="References2"><fo:page-number-citation ref-id="References2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Evaluationhazards">4.3.3. Evaluation hazards</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Evaluationhazards"><fo:page-number-citation ref-id="Evaluationhazards"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EnableSafeNavigationDiagnosis">4.3.4. Enable Safe Navigation Diagnosis</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EnableSafeNavigationDiagnosis"><fo:page-number-citation ref-id="EnableSafeNavigationDiagnosis"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SafeNavigationDiagnosis">4.3.5. Safe Navigation Diagnosis</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SafeNavigationDiagnosis"><fo:page-number-citation ref-id="SafeNavigationDiagnosis"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SafeNavigationOperators">4.3.6. Safe Navigation Operators</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SafeNavigationOperators"><fo:page-number-citation ref-id="SafeNavigationOperators"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="NullfreeCollections">4.3.7. Null-free Collections</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="NullfreeCollections"><fo:page-number-citation ref-id="NullfreeCollections"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DeclaringNullfreeCollectionsinEcore">4.3.8. Declaring Null-free Collections in Ecore</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DeclaringNullfreeCollectionsinEcore"><fo:page-number-citation ref-id="DeclaringNullfreeCollectionsinEcore"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DeclaringNullfreeCollectionsinUML">4.3.9. Declaring Null-free Collections in UML</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DeclaringNullfreeCollectionsinUML"><fo:page-number-citation ref-id="DeclaringNullfreeCollectionsinUML"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CodeGenerationTutorial">4.4. Code Generation tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CodeGenerationTutorial"><fo:page-number-citation ref-id="CodeGenerationTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.CodeGenerationTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadOCLinEcoreTutorialExampleProject">4.4.1. Load OCLinEcore Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadOCLinEcoreTutorialExampleProject"><fo:page-number-citation ref-id="LoadOCLinEcoreTutorialExampleProject"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Directcode">4.4.2. Direct code</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Directcode"><fo:page-number-citation ref-id="Directcode"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UsingaGenAnnotation">4.4.3. Using a GenAnnotation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UsingaGenAnnotation"><fo:page-number-citation ref-id="UsingaGenAnnotation"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DebuggerTutorial">4.5. Debugger tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DebuggerTutorial"><fo:page-number-citation ref-id="DebuggerTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.DebuggerTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadOCLinEcoreTutorialExampleProject2">4.5.1. Load OCLinEcore Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadOCLinEcoreTutorialExampleProject2"><fo:page-number-citation ref-id="LoadOCLinEcoreTutorialExampleProject2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLDebugger">4.5.2. The OCL Debugger</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLDebugger"><fo:page-number-citation ref-id="TheOCLDebugger"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="VerySimpleDebugsession">4.5.3. Very Simple Debug session</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="VerySimpleDebugsession"><fo:page-number-citation ref-id="VerySimpleDebugsession"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DebuggingaValidationfailure">4.5.4. Debugging a Validation failure</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DebuggingaValidationfailure"><fo:page-number-citation ref-id="DebuggingaValidationfailure"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DebuggingCompleteOCLvalidationfailure">4.5.5. Debugging Complete OCL validation failure</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DebuggingCompleteOCLvalidationfailure"><fo:page-number-citation ref-id="DebuggingCompleteOCLvalidationfailure"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Consoleexperiments">4.5.6. Console experiments</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Consoleexperiments"><fo:page-number-citation ref-id="Consoleexperiments"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Longerrangestepping">4.5.7. Longer range stepping</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Longerrangestepping"><fo:page-number-citation ref-id="Longerrangestepping"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Breakpoints">4.5.8. Break points</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Breakpoints"><fo:page-number-citation ref-id="Breakpoints"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidationTutorial">4.6. Validation tutorial</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidationTutorial"><fo:page-number-citation ref-id="ValidationTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ValidationTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadCompleteOCLTutorialExampleProject2">4.6.1. Load Complete OCL Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadCompleteOCLTutorialExampleProject2"><fo:page-number-citation ref-id="LoadCompleteOCLTutorialExampleProject2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LoadTestModel">4.6.2. Load Test Model</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LoadTestModel"><fo:page-number-citation ref-id="LoadTestModel"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EMFValidation">4.6.3. EMF Validation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EMFValidation"><fo:page-number-citation ref-id="EMFValidation"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLInterpreterTutorial">4.7. Working with Classic OCL</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLInterpreterTutorial"><fo:page-number-citation ref-id="OCLInterpreterTutorial"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLInterpreterTutorial" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Overview4">4.7.1. Overview</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Overview4"><fo:page-number-citation ref-id="Overview4"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="References3">4.7.2. References</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="References3"><fo:page-number-citation ref-id="References3"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ParsingOCLExpressions">4.7.3. Parsing OCL Expressions</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ParsingOCLExpressions"><fo:page-number-citation ref-id="ParsingOCLExpressions"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ParsingOCLConstraints">4.7.4. Parsing OCL Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ParsingOCLConstraints"><fo:page-number-citation ref-id="ParsingOCLConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EvaluatingOCLExpressionsandConstraints">4.7.5. Evaluating OCL Expressions and Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EvaluatingOCLExpressionsandConstraints"><fo:page-number-citation ref-id="EvaluatingOCLExpressionsandConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ImplementingContentAssist">4.7.6. Implementing Content Assist</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ImplementingContentAssist"><fo:page-number-citation ref-id="ImplementingContentAssist"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="WorkingwiththeAST">4.7.7. Working with the AST</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="WorkingwiththeAST"><fo:page-number-citation ref-id="WorkingwiththeAST"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Serialization">4.7.8. Serialization</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Serialization"><fo:page-number-citation ref-id="Serialization"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Summary3">4.7.9. Summary</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Summary3"><fo:page-number-citation ref-id="Summary3"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Extensions">4.8. Extensions (in the Unified/Pivot OCL prototype)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Extensions"><fo:page-number-citation ref-id="Extensions"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Extensions" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Models">4.8.1. Models</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Models"><fo:page-number-citation ref-id="Models"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="XMI">4.8.2. XMI</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="XMI"><fo:page-number-citation ref-id="XMI"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Templates">4.8.3. Templates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Templates"><fo:page-number-citation ref-id="Templates"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Extensibility">4.8.4. Extensibility</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Extensibility"><fo:page-number-citation ref-id="Extensibility"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OperationOverloading">4.8.5. Operation Overloading</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OperationOverloading"><fo:page-number-citation ref-id="OperationOverloading"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Stereotypes">4.8.6. Stereotypes</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Stereotypes"><fo:page-number-citation ref-id="Stereotypes"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SafeNavigation">4.8.7. Safe Navigation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SafeNavigation"><fo:page-number-citation ref-id="SafeNavigation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Reflection">4.8.8. Reflection</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Reflection"><fo:page-number-citation ref-id="Reflection"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="LambdaExpressions">4.8.9. Lambda Expressions</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="LambdaExpressions"><fo:page-number-citation ref-id="LambdaExpressions"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="MapKV">4.8.10. Map(K,V)</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="MapKV"><fo:page-number-citation ref-id="MapKV"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Installation">4.9. Installing the Eclipse OCL Examples and Editors</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Installation"><fo:page-number-citation ref-id="Installation"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Installation" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Troubleshooting2">4.9.1. Troubleshooting</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Troubleshooting2"><fo:page-number-citation ref-id="Troubleshooting2"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Examples">5. Examples</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Examples"><fo:page-number-citation ref-id="Examples"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Examples" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="RoyalAndLoyalExample">5.1. Royal and Loyal Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="RoyalAndLoyalExample"><fo:page-number-citation ref-id="RoyalAndLoyalExample"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EmptyExample">5.2. Empty Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EmptyExample"><fo:page-number-citation ref-id="EmptyExample"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreTutorialExampleProject">5.3. OCLinEcore Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreTutorialExampleProject"><fo:page-number-citation ref-id="OCLinEcoreTutorialExampleProject"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLTutorialExampleProject">5.4. Complete OCL Tutorial Example Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLTutorialExampleProject"><fo:page-number-citation ref-id="CompleteOCLTutorialExampleProject"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLInterpreterExample">5.5. OCL Interpreter Example</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLInterpreterExample"><fo:page-number-citation ref-id="OCLInterpreterExample"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCLInterpreterExample" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Introduction">5.5.1. Introduction</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Introduction"><fo:page-number-citation ref-id="Introduction"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="References4">5.5.2. References</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="References4"><fo:page-number-citation ref-id="References4"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Description">5.5.3. Description</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Description"><fo:page-number-citation ref-id="Description"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SupportforEcoreandUMLModels">5.5.4. Support for Ecore and UML Models</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SupportforEcoreandUMLModels"><fo:page-number-citation ref-id="SupportforEcoreandUMLModels"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ExampleCode">5.5.5. Example Code</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ExampleCode"><fo:page-number-citation ref-id="ExampleCode"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ProgrammersGuide">6. Classic Ecore/UML Programmers Guide</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ProgrammersGuide"><fo:page-number-citation ref-id="ProgrammersGuide"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ProgrammersGuide" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ParsingConstraints">6.1. Parsing Constraints and Queries</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ParsingConstraints"><fo:page-number-citation ref-id="ParsingConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ParsingConstraints" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLEnvironment">6.1.1. The OCL Environment</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLEnvironment"><fo:page-number-citation ref-id="TheOCLEnvironment"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CreatinganOCLEnvironment">6.1.2. Creating an OCL Environment</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CreatinganOCLEnvironment"><fo:page-number-citation ref-id="CreatinganOCLEnvironment"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLHelper">6.1.3. The OCL Helper</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLHelper"><fo:page-number-citation ref-id="TheOCLHelper"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OperationandAttributeContexts">6.1.4. Operation and Attribute Contexts</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OperationandAttributeContexts"><fo:page-number-citation ref-id="OperationandAttributeContexts"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="EvaluatingConstraints">6.2. Evaluating Constraints and Queries</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="EvaluatingConstraints"><fo:page-number-citation ref-id="EvaluatingConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.EvaluatingConstraints" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLQuery">6.2.1. The OCL Query</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLQuery"><fo:page-number-citation ref-id="TheOCLQuery"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ParsingDocuments">6.3. Parsing OCL Documents</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ParsingDocuments"><fo:page-number-citation ref-id="ParsingDocuments"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ParsingDocuments" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLInput">6.3.1. The OCL Input</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLInput"><fo:page-number-citation ref-id="TheOCLInput"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="AccessingtheConstraints">6.3.2. Accessing the Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="AccessingtheConstraints"><fo:page-number-citation ref-id="AccessingtheConstraints"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TargetMetamodels">6.4. OCL Relationship to Metamodels</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TargetMetamodels"><fo:page-number-citation ref-id="TargetMetamodels"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.TargetMetamodels" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheEcoreMetamodelBinding">6.4.1. The Ecore Metamodel Binding</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheEcoreMetamodelBinding"><fo:page-number-citation ref-id="TheEcoreMetamodelBinding"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheUMLMetamodelBinding">6.4.2. The UML Metamodel Binding</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheUMLMetamodelBinding"><fo:page-number-citation ref-id="TheUMLMetamodelBinding"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ContentAssistSupport">6.5. Content Assist Support</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ContentAssistSupport"><fo:page-number-citation ref-id="ContentAssistSupport"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ContentAssistSupport" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SyntaxCompletionChoices">6.5.1. Syntax Completion Choices</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SyntaxCompletionChoices"><fo:page-number-citation ref-id="SyntaxCompletionChoices"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="AbstractSyntax">6.6. OCL Abstract Syntax Model</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="AbstractSyntax"><fo:page-number-citation ref-id="AbstractSyntax"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.AbstractSyntax" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheVisitableandVisitorInterfaces">6.6.1. The Visitable and Visitor Interfaces</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheVisitableandVisitorInterfaces"><fo:page-number-citation ref-id="TheVisitableandVisitorInterfaces"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ImplementingaVisitor">6.6.2. Implementing a Visitor</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ImplementingaVisitor"><fo:page-number-citation ref-id="ImplementingaVisitor"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="HiddenOpposites">6.6.3. The OppositePropertyCallExp Extension</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="HiddenOpposites"><fo:page-number-citation ref-id="HiddenOpposites"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CustomizingtheEnvironment">6.7. Customizing the Environment</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CustomizingtheEnvironment"><fo:page-number-citation ref-id="CustomizingtheEnvironment"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.CustomizingtheEnvironment" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DefiningGlobalVariables">6.7.1. Defining Global Variables</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DefiningGlobalVariables"><fo:page-number-citation ref-id="DefiningGlobalVariables"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="DefiningHelperOperationsinJava">6.7.2. Defining Helper Operations in Java</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="DefiningHelperOperationsinJava"><fo:page-number-citation ref-id="DefiningHelperOperationsinJava"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SelectingaPackageLookupStrategy">6.7.3. Selecting a Package Lookup Strategy</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SelectingaPackageLookupStrategy"><fo:page-number-citation ref-id="SelectingaPackageLookupStrategy"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CustomizingHiddenOppositeLookupandNavigation">6.7.4. Customizing Hidden Opposite Lookup and Navigation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CustomizingHiddenOppositeLookupandNavigation"><fo:page-number-citation ref-id="CustomizingHiddenOppositeLookupandNavigation"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Persistence">6.8. OCL Persistence</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Persistence"><fo:page-number-citation ref-id="Persistence"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Persistence" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheTypeResolver">6.8.1. The Type Resolver</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheTypeResolver"><fo:page-number-citation ref-id="TheTypeResolver"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="AdvancedMetamodelBindings">6.9. Creating Metamodel Bindings</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="AdvancedMetamodelBindings"><fo:page-number-citation ref-id="AdvancedMetamodelBindings"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.AdvancedMetamodelBindings" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLAbstractSyntaxModel">6.9.1. The OCL Abstract Syntax Model</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLAbstractSyntaxModel"><fo:page-number-citation ref-id="TheOCLAbstractSyntaxModel"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ImpactAnalyzer">6.10. Incrementally Re-Evaluating OCL Expressions Using the Impact Analyzer</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ImpactAnalyzer"><fo:page-number-citation ref-id="ImpactAnalyzer"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.ImpactAnalyzer" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UsingtheImpactAnalyzerinEMFEditors">6.10.1. Using the Impact Analyzer in EMF Editors</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UsingtheImpactAnalyzerinEMFEditors"><fo:page-number-citation ref-id="UsingtheImpactAnalyzerinEMFEditors"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="AlgorithmOutline">6.10.2. Algorithm Outline</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="AlgorithmOutline"><fo:page-number-citation ref-id="AlgorithmOutline"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ImpactAnalyzerConfigurationScopes">6.10.3. Impact Analyzer Configuration, Scopes</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ImpactAnalyzerConfigurationScopes"><fo:page-number-citation ref-id="ImpactAnalyzerConfigurationScopes"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Delegates">6.11. Delegates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Delegates"><fo:page-number-citation ref-id="Delegates"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Delegates" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="GenModelSettings">6.11.1. GenModel Settings</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="GenModelSettings"><fo:page-number-citation ref-id="GenModelSettings"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLDelegateURI">6.11.2. OCL Delegate URIs</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLDelegateURI"><fo:page-number-citation ref-id="OCLDelegateURI"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="StandaloneInitialization">6.11.3. Standalone Initialization</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="StandaloneInitialization"><fo:page-number-citation ref-id="StandaloneInitialization"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="InvocationDelegate">6.11.4. Invocation Delegates </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="InvocationDelegate"><fo:page-number-citation ref-id="InvocationDelegate"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SettingDelegate">6.11.5. Setting Delegates </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SettingDelegate"><fo:page-number-citation ref-id="SettingDelegate"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidationDelegate">6.11.6. Validation Delegates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidationDelegate"><fo:page-number-citation ref-id="ValidationDelegate"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ValidationMessages">6.11.7. Validation Messages</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ValidationMessages"><fo:page-number-citation ref-id="ValidationMessages"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="QueryDelegate">6.11.8. Query Delegates </fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="QueryDelegate"><fo:page-number-citation ref-id="QueryDelegate"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Standalone">6.12. Ecore/UML Standalone Configuration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Standalone"><fo:page-number-citation ref-id="Standalone"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Standalone" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Ecore">6.12.1. Ecore</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Ecore"><fo:page-number-citation ref-id="Ecore"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UML">6.12.2. UML</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UML"><fo:page-number-citation ref-id="UML"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Classpath">6.12.3. Classpath</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Classpath"><fo:page-number-citation ref-id="Classpath"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="XtextEditors">6.12.4. Xtext Editors</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="XtextEditors"><fo:page-number-citation ref-id="XtextEditors"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotProgrammersGuide">7. Unified or Pivot Programmers Guide</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotProgrammersGuide"><fo:page-number-citation ref-id="PivotProgrammersGuide"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotProgrammersGuide" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCL-Environment">7.1. OCL Environment</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCL-Environment"><fo:page-number-citation ref-id="OCL-Environment"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.OCL-Environment" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLproblem">7.1.1. OCL Implementation Problem</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLproblem"><fo:page-number-citation ref-id="OCLproblem"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLwithAdapters">7.1.2. OCL adapters pre-2021-03</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLwithAdapters"><fo:page-number-citation ref-id="OCLwithAdapters"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLperThread">7.1.3. OCL per Thread post-2021-03</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLperThread"><fo:page-number-citation ref-id="OCLperThread"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Validators">7.2. Validators</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Validators"><fo:page-number-citation ref-id="Validators"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Validators" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLinEcoreEObjectValidator">7.2.1. OCLinEcoreEObjectValidator</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLinEcoreEObjectValidator"><fo:page-number-citation ref-id="OCLinEcoreEObjectValidator"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CompleteOCLEObjectValidator">7.2.2. CompleteOCLEObjectValidator</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CompleteOCLEObjectValidator"><fo:page-number-citation ref-id="CompleteOCLEObjectValidator"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotEvaluator">7.3. The Pivot Evaluator</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotEvaluator"><fo:page-number-citation ref-id="PivotEvaluator"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotEvaluator" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotValue-History">7.3.1. The Evolving Pivot Value System</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotValue-History"><fo:page-number-citation ref-id="PivotValue-History"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotValues">7.3.2. The Pivot Value System</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotValues"><fo:page-number-citation ref-id="PivotValues"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ThePivotEvaluatorTypeSystem">7.3.3. The Pivot Evaluator Type System</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ThePivotEvaluatorTypeSystem"><fo:page-number-citation ref-id="ThePivotEvaluatorTypeSystem"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ThePivotEvaluatorImplementationSystem">7.3.4. The Pivot Evaluator Implementation System</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ThePivotEvaluatorImplementationSystem"><fo:page-number-citation ref-id="ThePivotEvaluatorImplementationSystem"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PolymorphicImplementations">7.3.5. Polymorphic Implementations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PolymorphicImplementations"><fo:page-number-citation ref-id="PolymorphicImplementations"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotStandalone">7.4. Pivot Standalone Configuration</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotStandalone"><fo:page-number-citation ref-id="PivotStandalone"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotStandalone" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Models2">7.4.1. Models</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Models2"><fo:page-number-citation ref-id="Models2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLStandardLibrary">7.4.2. OCL Standard Library</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLStandardLibrary"><fo:page-number-citation ref-id="OCLStandardLibrary"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotDelegates">7.4.3. Pivot Delegates</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotDelegates"><fo:page-number-citation ref-id="PivotDelegates"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="XtextParsers">7.4.4. Xtext Parsers</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="XtextParsers"><fo:page-number-citation ref-id="XtextParsers"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="platformpluginandplatformresourceURIs">7.4.5. platform:/plugin and platform:/resource URIs</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="platformpluginandplatformresourceURIs"><fo:page-number-citation ref-id="platformpluginandplatformresourceURIs"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Classpath2">7.4.6. Classpath</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Classpath2"><fo:page-number-citation ref-id="Classpath2"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotThreadSafety">7.5. Pivot Thread Safety</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotThreadSafety"><fo:page-number-citation ref-id="PivotThreadSafety"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotThreadSafety" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="CodeGeneratedEvaluation">7.5.1. Code Generated Evaluation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="CodeGeneratedEvaluation"><fo:page-number-citation ref-id="CodeGeneratedEvaluation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="InterpretedEvaluation">7.5.2. Interpreted Evaluation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="InterpretedEvaluation"><fo:page-number-citation ref-id="InterpretedEvaluation"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLAnalysis">7.5.3. OCL Analysis</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLAnalysis"><fo:page-number-citation ref-id="OCLAnalysis"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotParsingConstraints">7.6. Parsing Constraints and Queries</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotParsingConstraints"><fo:page-number-citation ref-id="PivotParsingConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotParsingConstraints" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLFacade2">7.6.1. The OCL Facade</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLFacade2"><fo:page-number-citation ref-id="TheOCLFacade2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OCLHandles">7.6.2. OCL Handles</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OCLHandles"><fo:page-number-citation ref-id="OCLHandles"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ClassContext">7.6.3. Class Context</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ClassContext"><fo:page-number-citation ref-id="ClassContext"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OperationandPropertyContexts">7.6.4. Operation and Property Contexts</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OperationandPropertyContexts"><fo:page-number-citation ref-id="OperationandPropertyContexts"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Errors">7.6.5. Errors</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Errors"><fo:page-number-citation ref-id="Errors"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLHelper2">7.6.6. The OCL Helper</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLHelper2"><fo:page-number-citation ref-id="TheOCLHelper2"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotEvaluatingConstraints">7.7. Evaluating Constraints and Queries</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotEvaluatingConstraints"><fo:page-number-citation ref-id="PivotEvaluatingConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotEvaluatingConstraints" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLQuery2">7.7.1. The OCL Query</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLQuery2"><fo:page-number-citation ref-id="TheOCLQuery2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Objectrepresentations">7.7.2. Object representations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Objectrepresentations"><fo:page-number-citation ref-id="Objectrepresentations"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="MultipleEvaluations">7.7.3. Multiple Evaluations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="MultipleEvaluations"><fo:page-number-citation ref-id="MultipleEvaluations"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="SuccintEvaluations">7.7.4. Succint Evaluations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="SuccintEvaluations"><fo:page-number-citation ref-id="SuccintEvaluations"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotParsingDocuments">7.8. Parsing OCL Documents</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotParsingDocuments"><fo:page-number-citation ref-id="PivotParsingDocuments"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotParsingDocuments" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TheOCLInput2">7.8.1. The OCL Input</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TheOCLInput2"><fo:page-number-citation ref-id="TheOCLInput2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="TraversingtheConstraints">7.8.2. Traversing the Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="TraversingtheConstraints"><fo:page-number-citation ref-id="TraversingtheConstraints"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="AccessingtheConstraints2">7.8.3. Accessing the Constraints</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="AccessingtheConstraints2"><fo:page-number-citation ref-id="AccessingtheConstraints2"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="UsingtheConstraintstoValidateaModel">7.8.4. Using the Constraints to Validate a Model</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="UsingtheConstraintstoValidateaModel"><fo:page-number-citation ref-id="UsingtheConstraintstoValidateaModel"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="PivotMetamodels">7.9. OCL Relationship to Metamodels</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="PivotMetamodels"><fo:page-number-citation ref-id="PivotMetamodels"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.PivotMetamodels" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ThePivotMetamodelBinding">7.9.1. The Pivot Metamodel Binding</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ThePivotMetamodelBinding"><fo:page-number-citation ref-id="ThePivotMetamodelBinding"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-Ids">7.10. Ids</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-Ids"><fo:page-number-citation ref-id="Pivot-Ids"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.Pivot-Ids" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-Id-Equality">7.10.1. Id Equality</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-Id-Equality"><fo:page-number-citation ref-id="Pivot-Id-Equality"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-IdManager">7.10.2. IdManager</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-IdManager"><fo:page-number-citation ref-id="Pivot-IdManager"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-CollectionTypeId">7.10.3. CollectionTypeId</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-CollectionTypeId"><fo:page-number-citation ref-id="Pivot-CollectionTypeId"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-TupleTypeId">7.10.4. TupleTypeId</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-TupleTypeId"><fo:page-number-citation ref-id="Pivot-TupleTypeId"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-LambdaTypeId">7.10.5. LambdaTypeId</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-LambdaTypeId"><fo:page-number-citation ref-id="Pivot-LambdaTypeId"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-ParameterIds">7.10.6. ParameterIds</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-ParameterIds"><fo:page-number-citation ref-id="Pivot-ParameterIds"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-TuplePartId">7.10.7. TuplePartId</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-TuplePartId"><fo:page-number-citation ref-id="Pivot-TuplePartId"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-TemplateParameterId">7.10.8. TemplateParameterId</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-TemplateParameterId"><fo:page-number-citation ref-id="Pivot-TemplateParameterId"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Pivot-Id-CG">7.10.9. Code Generation</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Pivot-Id-CG"><fo:page-number-citation ref-id="Pivot-Id-CG"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="APIReference">8. API Reference</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="APIReference"><fo:page-number-citation ref-id="APIReference"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.APIReference" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Javadoc">8.1. Javadoc</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Javadoc"><fo:page-number-citation ref-id="Javadoc"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="Extensionpoints">8.2. Extension points</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="Extensionpoints"><fo:page-number-citation ref-id="Extensionpoints"/></fo:basic-link></fo:inline></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="BuildingtheOCLProject">9. Building the OCL Project</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="BuildingtheOCLProject"><fo:page-number-citation ref-id="BuildingtheOCLProject"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.BuildingtheOCLProject" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="OOMPH">9.1. OOMPH</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="OOMPH"><fo:page-number-citation ref-id="OOMPH"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="MavenCentralandrepo.eclipse.org">9.2. Maven Central and repo.eclipse.org</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="MavenCentralandrepo.eclipse.org"><fo:page-number-citation ref-id="MavenCentralandrepo.eclipse.org"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="MavenandGradle">9.3. Maven and Gradle</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="MavenandGradle"><fo:page-number-citation ref-id="MavenandGradle"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="GenAnnotations">9.4. GenModel GenAnnotations</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="GenAnnotations"><fo:page-number-citation ref-id="GenAnnotations"/></fo:basic-link></fo:inline></fo:block><fo:block id="toc.N10001.GenAnnotations" margin-left="24pt"><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelGenAnnotationSource">9.4.1. http://www.eclipse.org/OCL/GenModel GenAnnotation Source</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelGenAnnotationSource"><fo:page-number-citation ref-id="httpwww.eclipse.orgOCLGenModelGenAnnotationSource"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelToString">9.4.2. http://www.eclipse.org/OCL/GenModel/ToString</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelToString"><fo:page-number-citation ref-id="httpwww.eclipse.orgOCLGenModelToString"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelVisitor">9.4.3. http://www.eclipse.org/OCL/GenModel/Visitor</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelVisitor"><fo:page-number-citation ref-id="httpwww.eclipse.orgOCLGenModelVisitor"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelCopyAndPaste">9.4.4. http://www.eclipse.org/OCL/GenModel/CopyAndPaste</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="httpwww.eclipse.orgOCLGenModelCopyAndPaste"><fo:page-number-citation ref-id="httpwww.eclipse.orgOCLGenModelCopyAndPaste"/></fo:basic-link></fo:inline></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="normal"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="ImplementationDetails3">9.4.5. Implementation Details</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="ImplementationDetails3"><fo:page-number-citation ref-id="ImplementationDetails3"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:block><fo:block text-align-last="justify" text-align="start" end-indent="24pt" last-line-end-indent="-24pt" font-size="10pt" font-weight="bold"><fo:inline keep-with-next.within-line="always"><fo:basic-link internal-destination="glossary">A. Glossary</fo:basic-link></fo:inline><fo:inline keep-together.within-line="always"> <fo:leader keep-with-next.within-line="always" leader-alignment="reference-area" leader-pattern-width="3pt" leader-pattern="dots"/> <fo:basic-link internal-destination="glossary"><fo:page-number-citation ref-id="glossary"/></fo:basic-link></fo:inline></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="1" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Overview and Getting Started</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Overview and Getting Started</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="OverviewandGettingStarted"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 1. Overview and Getting Started</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For a quick demonstration of OCL enrichment of an Ecore meta-model with computed constraints go to 

+			<fo:basic-link internal-destination="GettingStarted"><fo:inline color="blue" text-decoration="underline">Getting Started</fo:inline></fo:basic-link>.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A PDF version of this documentation is available at 

+			<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/doc/6.15.0/ocl.pdf)">OCL 2021-06 (6.15.0) Documentation</fo:basic-link>.

+		</fo:block><fo:block id="WhatisOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">What is OCL?</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.1. What is OCL?</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10019"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1001A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-style="italic">EMF is Modeled Structure</fo:inline>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse Modeling Framework (

+				<fo:inline font-style="italic">EMF</fo:inline>) supports the definition of structural meta-models and the subsequent use of models conforming to these meta-models. EMF also supports generating of Java code to represent the meta-models. Additional Java code can be provided to add behavior to the structural meta-models.

+			</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10025"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10026"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-style="italic">OCL is EMF and Modeled Behavior</fo:inline>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-style="italic">OCL</fo:inline> provides a modeling language that allows the behavior to be embedded within the structural meta-models or provided as a complement to those meta-models. As a modeling language, OCL understands the models and so OCL code is much more compact than the equivalent Java. OCL code can be statically checked, whereas the corresponding Java code often uses reflection and so cannot be checked.  

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL is an implementation of the OMG OCL 2.4 specification for use with Ecore and UML meta-models.</fo:block></fo:block><fo:block id="HowDoesItWork"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">How Does It Work?</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.2. How Does It Work?</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL is a programming language, so you will want to edit it, execute it and debug it.</fo:block><fo:block id="Editing"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editing</fo:marker><fo:block font-size="14pt">1.2.1. Editing</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL supports entry of semantically checked OCL expressions</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1003F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10040"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>embedded within Ecore using the 

+							<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link> editor

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10047"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>as complementary documents using the 

+							<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> editor

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1004E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>interactive entry and evaluation using the 

+							<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Interactive OCL</fo:inline></fo:basic-link> console.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10055"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>programmatic entry and evaluation using the 

+							<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Java API</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF supports entry of unchecked OCL</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1005E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1005F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>embedded within Ecore using the Sample Ecore Editor properties view</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse UML supports entry of unchecked OCL</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10064"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10065"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>embedded within UML OpaqueExpressions using the UML Model Editor properties view</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:basic-link internal-destination="OCLinPapyrus"><fo:inline color="blue" text-decoration="underline">Papyrus</fo:inline></fo:basic-link> supports entry of semantically checked OCL expressions

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1006E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1006F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>embedded within UML OpaqueExpressions using the 

+							<fo:basic-link internal-destination="EssentialOCL"><fo:inline color="blue" text-decoration="underline">Essential OCL</fo:inline></fo:basic-link> editor

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="Execution"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Execution</fo:marker><fo:block font-size="14pt">1.2.2. Execution</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL supports OCL execution</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1007C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1007D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>interactive entry and evaluation using the 

+							<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Interactive OCL</fo:inline></fo:basic-link> console.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10084"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>programmatic entry and evaluation using the 

+							<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Java API</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF support for generated models enables OCL execution of</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1008D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1008E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>constraints, operation bodies and property initializers using the 

+							<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Java API</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF support for dynamic models enables OCL execution of</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10097"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10098"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>constraints using the 

+							<fo:basic-link internal-destination="ValidationDelegate"><fo:inline color="blue" text-decoration="underline">Validation Delegate</fo:inline></fo:basic-link> API 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1009F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>operation bodies using the 

+							<fo:basic-link internal-destination="InvocationDelegate"><fo:inline color="blue" text-decoration="underline">Invocation Delegate</fo:inline></fo:basic-link> API 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100A6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>property initializers using the 

+							<fo:basic-link internal-destination="SettingDelegate"><fo:inline color="blue" text-decoration="underline">Setting Delegate</fo:inline></fo:basic-link> API 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100AD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>queries using the 

+							<fo:basic-link internal-destination="QueryDelegate"><fo:inline color="blue" text-decoration="underline">Query Delegate</fo:inline></fo:basic-link> API 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All OCL execution is normally interpreted and starts from the OCL source text (Concrete Syntax). There is therefore a first time parsing overhead to create the compiled form (Abstract Syntax). The compiled form is cached to avoid repeated parsing costs. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Altenatively the direct Java code generator may be used as described in the 

+					<fo:basic-link internal-destination="CodeGenerationTutorial"><fo:inline color="blue" text-decoration="underline">Code Generator Tutorial</fo:inline></fo:basic-link>.

+				</fo:block></fo:block><fo:block id="Debugging"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Debugging</fo:marker><fo:block font-size="14pt">1.2.3. Debugging</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since OCL is used embedded in a larger environment, debugging is not easy to provide for OCL in isolation. The 

+					<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">OCL debugger</fo:inline></fo:basic-link> provides a variety of launch mechanisms that enable re-use of model element and/or constraint selections.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Alternatively the following approaches may be useful within other toosl</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N100C8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100C9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the hover-text in the semantic editor to understand the expression types</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100CC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the quick-fixes in the semantic editor for possible corrections</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N100CF"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100D0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>if the same fix is suggested more than once, try restarting the editor</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100D3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the completion assist in the semantic editor for possible syntaxes</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100D6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use intermediate invariants to check partial results</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100D9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the optional explanation messages for an invariant to provide a 'printf'</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100DC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the 

+							<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Interactive Xtext OCL</fo:inline></fo:basic-link> console to practice a problematic expression on a model

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="Testing"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Testing</fo:marker><fo:block font-size="14pt">1.2.4. Testing</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Once again, since OCL is used embedded in a larger environment, testing is not easy to provide for OCL in isolation. The following approaches may be useful.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N100E9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N100EA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the 

+							<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Interactive Xtext OCL</fo:inline></fo:basic-link> console to practice sub-expressions of a problematic expression on a model

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL development uses an extended JUnit framework that allows the Eclipse OCL code to be tested by assertions such as:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N100F3"><fo:inline font-family="Inconsolata,Courier">assertQueryInvalid(null, "let b : Boolean = null in true and b");

+assertQueryResults(null, "Set{'b'}", "Set{'a', 'b', 'c'} - Set{'c', 'a'}");

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(The null first argument may be a context object.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">See the org.eclipse.ocl.xtext.tests plugin for further details.</fo:block></fo:block></fo:block><fo:block id="EclipseOCLisExtensible"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Eclipse OCL is Extensible</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.3. Eclipse OCL is Extensible</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Classic Eclipse OCL is used as a component in a variety of other Eclipse projects such as Acceleo, BIRT, GMF, Modisco, QVTo. Ecore models are used directly, which leads to some internal difficulties.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The new Unified Eclipse OCL exploits Xtext and uses Ecore models indirectly via a UML-aligned Pivot models. This provides a choice between the classic APIs that offer limited forward functionality, and the new APIs that some of which are promoted to non-experimental form in the Mars release. Many remain experimental and internal.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The new code already offers a fully modeled Standard Library that can be extended or replaced. The new OCL grammars are extended internally from Essential OCL to OCLinEcore or Complete OCL, and externally to QVT Core and QVT Relational. The associated Concrete Syntax to Abstract Syntax mapping is not yet model-driven and so harder to extend.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Full model-driven extensibility is planned for a future release.</fo:block></fo:block><fo:block id="WhoUsesOCLandEclipseOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Who Uses OCL and Eclipse OCL?</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.4. Who Uses OCL and Eclipse OCL?</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL specification is defined by the 

+				<fo:inline font-style="italic">OMG</fo:inline>. It originally evolved as part of 

+				<fo:inline font-style="italic">UML</fo:inline> where it is used for the detailed mathematical aspects that are not appropriate for graphical exposition. OCL 2.0 was split off from UML 2.0 in recognition of its greater utility.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Within the OMG context, OCL has been re-used as the foundation for the MOFM2T(Model to Text) Model-to-Text transformation language and the 

+				<fo:inline font-style="italic">QVT</fo:inline> Model-to-Model transformation language. Eclipse implementations of these are available as the Acceleo and QVT Operational projects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL is an implementation of the OCL specification for use in conjunction with EMF and in particular Ecore and UML2 meta-models. As the behavioral extension for EMF, Eclipse OCL can be used wherever EMF can.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As a specification language, OCL is frequently used when the behavior of models is formally specified.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of OCL as an execution language has been hindered by the quality of tool support. Beyond the research domain, many usages have been proprietary. One advanced proprietary usage at SAP has been contributed to Eclipse OCL and is available as the 

+				<fo:basic-link internal-destination="ImpactAnalyzer"><fo:inline color="blue" text-decoration="underline">Impact Analyzer</fo:inline></fo:basic-link>. This supports strategic planning of run-time notifications so that derived model properties can be updated efficiently in response to a change to a model. Thousand-fold speed improvements are achievable on large models using OCL rather than Java because OCL has a formal model-based semantics that is amenable to analysis.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of OCL in general is eased by the provision of good editors exploiting Xtext to provide comprehensive semantic feedback in a familiar editing style.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of OCL for execution is enhanced by providing direct Java code generation for OCL embedded in models. This should alleviate many of the performance concerns for interpreted execution of embedded OCL.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Debugging of OCL execution is now possible using the OCL debugger and the OCL Console can be used for OCL experimentation.</fo:block></fo:block><fo:block id="WhoisBehindEclipseOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Who is Behind Eclipse OCL?</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.5. Who is Behind Eclipse OCL?</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL is an Open Source project. The original code for OCL 1.x was contributed by IBM. It has evolved to support OCL 2.x under the auspices of Eclipse.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is now a significant personnel and corporate overlap between the Eclipse OCL committers and the OMG OCL 

+				<fo:inline font-style="italic">RTF</fo:inline> and so Eclipse OCL is pioneering solutions to many of the under-specification problems in the OCL specification.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can expect future changes in OMG OCL to have an implementation in Eclipse OCL to demonstrate their viability. It is likely that the next version of the OCL specification will use Eclipse OCL and M2T(Model to Text) tooling to eliminate inconsistencies. Eclipse OCL is currently in use to check that the OCL used in the UML 2.5 specification is syntactically and semantically correct.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Direct tooling of the UML 2.5 and OCL 2.5 specifications for a future Eclipse release may demonstrate that the OCL aspects of the specifications is also functionally consistent.</fo:block></fo:block><fo:block id="GettingStarted"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Getting Started</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">1.6. Getting Started</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For a very quick demonstration of OCL, you may follow this very abbreviated version of the 

+				<fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:inline color="blue" text-decoration="underline">OCLinEcore tutorial</fo:inline></fo:basic-link>, where you can find 

+				<fo:basic-link internal-destination="Installation"><fo:inline color="blue" text-decoration="underline">Installation</fo:inline></fo:basic-link> instructions. Once you have the OCL Examples and Editors feature installed you may follow these instructions to get an insight into the capabilities of OCL and the Eclipse OCL tooling.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Invoke 

+				<fo:inline font-weight="bold">File-&gt;New-&gt;Project...</fo:inline> then select 

+				<fo:inline font-weight="bold">Examples</fo:inline> then 

+				<fo:inline font-weight="bold">OCL (Object Constraint Language) Plugins</fo:inline> then 

+				<fo:inline font-weight="bold">OCLinEcore Tutorial</fo:inline> and 

+				<fo:inline font-weight="bold">Finish</fo:inline> to create a small example project called 

+				<fo:inline font-weight="bold">org.eclipse.ocl.examples.project.oclinecoretutorial</fo:inline>. It contains

+			</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10160"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10161"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-weight="bold">model/Tutorial.ecore</fo:inline> - a small Library meta-model

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10168"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-weight="bold">model/Tutorial.xmi</fo:inline> - an even smaller Library model

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1016F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-weight="bold">model/Tutorial.genmodel</fo:inline> - a gebnerator for Java code

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+				<fo:inline font-weight="bold">model/Tutorial.ecore</fo:inline> and use the right button to invoke 

+				<fo:inline font-weight="bold">Open With-&gt;OCLinEcore Editor</fo:inline>. This gives you a textual view of the Ecore file with embedded OCL invariants such as the Book constraint

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N10180"><fo:inline font-family="Inconsolata,Courier">invariant SufficientCopies:

+  library.loans-&gt;select((book = self))-&gt;size() &lt;= copies;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This invariant is named SufficientCopies. It </fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10188"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10189"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>navigates from the implicit self (a Book)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1018C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>via the library </fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1018F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to its loans which it searches</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10192"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to select those loans that satisfy the predicate</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10195"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10196"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>loaned book is equal to the self Book</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10199"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the size (number) of loans is computed</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1019C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>and compared to the number of copies of the self Book</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The invariant is satisfied if it evaluates true; i.e. if the number of loans is less than or equal to the number of copies.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can see this invariant at work, by selecting 

+				<fo:inline font-weight="bold">model/Tutorial.xmi</fo:inline> and using the right button to invoke 

+				<fo:inline font-weight="bold">Open With-&gt;Sample Reflective Ecore Model Editor</fo:inline>. This gives you a tree view of a small library model.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Expand the root element and then select the 

+				<fo:inline font-weight="bold">Library lib</fo:inline> element and use the right button menu to invoke 

+				<fo:inline font-weight="bold">Validate</fo:inline>. You should get a pop-up reporting problems during Validation. Click 

+				<fo:inline font-weight="bold">Details</fo:inline> and you will see that one of the problems is with the 

+				<fo:inline font-weight="bold">SufficientCopies</fo:inline> invariant we have just looked at. If you browse the Properties View for 

+				<fo:inline font-weight="bold">model/Tutorial.xmi</fo:inline>, you can verify that there are three loans but only two copies for the offending Book.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may evaluate custom OCL queries interactively. From the editor for 

+				<fo:inline font-weight="bold">Tutorial.xmi</fo:inline>, invoke 

+				<fo:inline font-weight="bold">OCL-&gt;Show Xtext OCL Console</fo:inline> from the context menu. Select 

+				<fo:inline font-weight="bold">Book b2</fo:inline> in the editor, then in the bottom line of the console enter the OCL expression 

+				<fo:inline font-weight="bold">loans.member</fo:inline> and then Enter. The results are shown in the panel and identify that all three loans are by 

+				<fo:inline font-weight="bold">Member m3</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The expression 

+				<fo:inline font-weight="bold">loans.member</fo:inline> is an abbreviated form of 

+				<fo:inline font-weight="bold">self.loans-&gt;collect(aLoan : Loan | aLoan.member)</fo:inline> and demonstrates OCL’s ability to perform many useful navigations over multi-element properties. The expression

+			</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N101E1"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101E2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>navigates from self, the Book b2 selection</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101E5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to its loans, using Book::loans which is a derived property defined in OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101E8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>for each of the loans, the iterator variable, aLoan, is assigned to the loan and</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N101EB"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101EC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the body, aLoan.member is evaluated to return the member making the loan</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101EF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the resulting members are collected to return a collection result</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N101F2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the result is displayed on three lines in the results panel</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can step through execution using the OCL debugger. In the Console View type PageUp to restore the earlier text entry, then with 

+				<fo:inline font-weight="bold">Book b2</fo:inline> still selected in the editor, click the debug icon in the Console tool bar. The debugger should open automatically, but if it doesn’t, use 

+				<fo:inline font-weight="bold">Window-&gt;Show View-&gt;Debug</fo:inline> from the Eclipse menu bar. The Variables View shows model elemnt values. Click F5 or Step Into a few times to progress execution.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You have now seen</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10201"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10202"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an Xtext editor that embeds OCL directly in Ecore models to provide programmed enrichment</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10205"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>execution of OCL while validating a model using conventional Ecore tooling</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10208"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an interactive Console for custom OCL evaluations</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1020B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>execution of a derived property defined in OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1020E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the ability of OCL to express operations on multi-elements compactly</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10211"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the ability to debug OCL execution and browse data</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You have not</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10216"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10217"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>written any Java code</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1021A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>generated any plugins</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1021D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>needed to start an additional Eclipse session</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please follow the tutorials, examples and reference material for further information.</fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Users Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Users Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="UsersGuide"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 2. Users Guide</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The core functionality of OCL that supports expressions over models is called the Essential OCL. This language is of very limited use by itself since there is no way in which the models can be provided.

+			Essential OCL is therefore extended in various ways to provide this missing context.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+			<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> provides a language for a document in which OCL complements an existing meta-model with invariants, and additional features.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+			<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link> embeds OCL within the annotations of an Ecore model to enrich that model.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">UML supports the use of OCL constraints as a form of OpaqueExpression, and UML tools such as Papyrus support those constraints for UML models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL project provides four OCL languages to support these usages.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10238"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10239"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:basic-link internal-destination="EssentialOCL"><fo:inline color="blue" text-decoration="underline">Essential OCL</fo:inline></fo:basic-link> provides the core extensible capability of specifying expressions for models.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10240"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10241"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> provides the ability to use OCL in a self-standing document to complement an existing meta-model with invariants, and additional features.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10248"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10249"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link> enables OCL to be embedded within an Ecore meta-model to add invariants for classifiers, bodies for operations and computed values for properties.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10250"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10251"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:basic-link internal-destination="OCLstdlib"><fo:inline color="blue" text-decoration="underline">OCLstdlib</fo:inline></fo:basic-link> supports the definition of the standard and custom OCL Standard Libraries.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="EclipseOCLs"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The two Eclipse OCLs</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.1. The two Eclipse OCLs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL project is making a transition to a new underlying infrastructure.</fo:block><fo:block id="TheClassicEclipseOCLmetamodels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Classic Eclipse OCL metamodels</fo:marker><fo:block font-size="14pt">2.1.1. The Classic Eclipse OCL metamodels</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Classic code base emphasized utility for Java programmers. It originally supported Ecore meta-models and evolved to support UML as well. An OCL Console was added to support interactive experimentation with OCL expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Interactions with the QVTd project resulted in a refactoring of the grammars so that they could be extended for use by QVT. At the same time the grammars were migrated to use LPG 2. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The dual support for Ecore and UML was achieved by a shared generic meta-model in which the distinctions between Ecore and UML meta-models were accommodated by substantial (often ten parameter) template parameters lists. Sometimes these lists are hidden by derived bindings, but sometimes the full lists are exposed. This gives rather cumbersome Java code for the OCL developers and OCL consumers alike.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic evaluator is tightly coupled to Ecore which might appear efficient, but the lack of separation of OCL-specification semantics from Java-implementation semantics makes accurate implementation of equality in nested collections hard to achieve.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic code endeavored to comply with OCL specification despite significant ambiguities in the specification, but since the classic code evolved from an OCL 1.x compliance and Ecore utility there are a number of areas where accurate OMG compliance is hard to achieve.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic code is provided primarily by the following plugins</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1026E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1026F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10272"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.ecore</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10275"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.uml</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="TheUnifiedorPivotEclipseOCLmetamodel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Unified or Pivot Eclipse OCL metamodel</fo:marker><fo:block font-size="14pt">2.1.2. The Unified or Pivot Eclipse OCL metamodel</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Unified or Pivot metamodel is a prototype for a resolution of a number of fundamental problems with the OCL 2.4 specification. The Pivot metamodel is derived from the UML metamodels for UML and OCL to provide a unified metamodel for UML with executable semantics.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In practice, when using the Pivot metamodel for Ecore or UML metamodels, a Pivot metamodel instance is created on the fly to provide the unified merged OCL functionality for the Ecore or UML metamodel instances. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From the specification perspective, the Pivot metamodel</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10282"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10283"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>is UML-aligned</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10286"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>supports modeling of the OCL standard library</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10289"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>supports ‘merging’ of additional Complete OCL definitions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1028C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>supports an interchangeable XMI representation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1028F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>supports a fully reflective oclType()</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From the Eclipse perspective, the Pivot metamodel</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10294"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10295"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>hides Ecore differences with respect to EMOF</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10298"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>hides MDT/UML2 differences with respect to UML</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1029B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>allows much of the semantics to be defined by a single library model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1029E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>allows user extension and replacement of the library model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102A1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>allows for exact OMG compliance</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">At the same time, the Values package that forms part of the specification has been partially implemented. This allows a clear separation of OCL-semantics.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The unified code is provided by the</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102A8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102A9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.pivot</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">with additional optional support for UML in</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102AE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102AF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.pivot.uml</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Additional editing functionality using Xtext is provided by plugins sharing the prefix </fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102B4"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102B5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.xtext</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Further functionality that remains of exampe qulaity may be fopund in plugins sharing the prefix</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102BA"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102BB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.examples</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All APIs in Xtext and Examples plugins are preliminary, as are APIS in classes including ‘internal’ in method, class or package name.</fo:block></fo:block><fo:block id="Thetransition"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The transition</fo:marker><fo:block font-size="14pt">2.1.3. The transition</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This transition started in the Helios (3.0) release for which Xtext editors were provided for OCLinEcore, Complete OCL and the OCL Standard Library. There was then no Pivot meta-model and so the editors offered only syntactic validation. It was not possible to persist an AST as XMI or to evaluate code that had been parsed by the Xtext parsers. It was necessary to re-parse with the LPG parsers. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Indigo (3.1) release, the Pivot metamodel prototype was introduced and used to support semantic validation within the Xtext editors. The OCL Standard Library was realised using the Pivot metamodel and a new highly extensible evaluator was implemented. These facilities are used by the new OCL Xtext Console. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Therefore when using the OCL Xtext Console the contributing tools are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102CA"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102CB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Essential OCL Xtext editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102CE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Pivot Metamodel</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102D1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OCL-2.5.oclstdlib library</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102D4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Pivot Evaluator</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102D7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Pivot Debugger</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When using the classic OCL Console the contributing tools are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N102DC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102DD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>LPG parser and hand-coded Syntax Helper</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102E0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Ecore (or UML) metamodel bindings</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102E3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Hand coded library implementation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N102E6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Classic evaluator</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since these tools are different there may be occasions where the increased OMG compliance of the Pivot metamodel gives different behavior to the classic metamodels.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Juno (3.2/4.0) release, there is a preliminary Java code generator for the Pivot metamodel so that all the parsing overheads and significant parts of the execution overheads of OCL embedded in Ecore models occurs at genmodel time rather than during execution.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Kepler (3.3/4.1) release, the code generator was substantially improved and a number of internal APIs have evolved accordingly. UML support was improved to facilitate usage within Papyrus, and extensibility was improved for use by QVTd.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Luna (3.4/5.0) release, further code generation improvements have been made and major new User Interface capabilities added. There is at last an OCL debugger and a Constraint Validity View.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Mars (1.0/6.0) release, the transition is nominally complete and the main org.eclipse.ocl.examples.* plugins have been renamed to org.eclipse.ocl.*. All functionality should use the new Pivot metamodel by default. However the classic Ecore and UML support will remain for compatibility. Unfortunately time ran out and so review and revision hads to be truncated. Documentation is sadly deficient.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Neon (1.1/6.1), Neon++(1.2/6.2), Oxygen (1.3/6.3) and Photon (1.4/6.4) resolve a variety of extensibility issues highlighted by Eclipse QVTd. (The double Neon release was necessiated by SSPI breakage in Xtext 2.9. The Neon release continuing with pre-Xtext 2.9 API, Neon++ migrating.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Hopefully the future (2.0/7.0) release will track the actual OCL 2.5 submission. </fo:block></fo:block><fo:block id="Migration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Migration</fo:marker><fo:block font-size="14pt">2.1.4. Migration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The difficulties of moving from the Ecore/UML-based OCL to the Pivot-based OCL depend on the style of usage.</fo:block><fo:block id="Language"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.4.1. Language</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Concrete Syntax is the same for both Eclipse OCLs and Pivot-based Xtext tooling has been in use for Ecore-based OCL for a few releases.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based OCL supports a number of new prototype facilities such as null-free collections, template types, map types and lambda types that are not available with the Ecore-based tooling.</fo:block></fo:block><fo:block id="ASModels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.4.2. AS Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Abstract Syntax models are superficially similar; both have an OCLExpression, however the details are quite different.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OMG OCL specification requires the AS model to be serializeable in XMI. This is not possible with the current OCL specifications. The intent is partially satisfied for the Ecore/UML-based models using proprietary solutions. The Pivot-based models are fully serializeable and prototype a solution that may be adopted by OCL 2.5.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML-based models extend the Ecore.ecore/UML.ecore models and so use for instance EStructuralFeature/org.eclipse.uml2.uml.Property as the type of a PropertyCallExp.referredProperty.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based models are UML-aligned and self-contained and so a PropertyCallExp.referredProperty is an org.eclipse.ocl.pivot.Property. Property names are derived from UML but made consistent; ‘many’ properties use a plural name; and 'composed; properties use ‘owned’/‘owning’. Thus UML’s Class.ownedAttribute aligns to Pivot’s Class.ownedProperties.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since the Pivot-based models have no dependence on an external model, the Pivot Visitors provide an ability to visit all classes, whereas the Ecore/UML-based visitors are partial; Ecore/UML classes must use an EcoreSwitch instead.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML based models have no support for UML reflection. A form of reflection is available with eClass(), but the result type names are necessarily EClass.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based models support consistent reflection using oclType() which return an ocl.eclipse.ocl.pivot.Class.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML-based OCL does not use models for additional facilities defined by Complete OCL; an irregular Java API is available.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based approach creates an additional Package for the Complete OCL contributions and behaves as if the complementing Package was merged with the complemented Package.</fo:block></fo:block><fo:block id="CSModels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.4.3. CS Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Concrete Syntax models are non-normative and have very little commonality.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML-based models are designed for use with the LPG LALR parser.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based models are designed for use with Xtext and LL ANTLR tooling.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Any user code that uses the CS models is likely to be very tightly coupled to internal APIs and so will need rebuilding and quite possibly updating for each new release.</fo:block></fo:block><fo:block id="TheOCLFacade"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.4.4. The OCL Facade</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The complexities of the underlying OCL support are hidden by an OCL Facade, with similar interfaces in all three variants.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1032D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1032E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.ecore.OCL </fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10331"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.uml.OCL </fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10334"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.ocl.pivot.utilities.OCL</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Contrasting the deliberately similar examples in</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10339"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1033A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Classic Ecore/UML Programmers Guide</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10341"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="PivotProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Unified or Pivot Programmers Guide</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">may be instructive.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot approach is simplified a little by the dual Facade/Handle behavior which ensures that OCL facilities are garbage collected.</fo:block></fo:block><fo:block id="TheOCLArchitecture"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.4.5. The OCL Architecture</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">While many of the internal classes share similar intents and names between the approaches, the details have evolved as the new approach has learned from its predecessor</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10352"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10353"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>long template parameter lists are eliminated</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10356"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>APIs are more strongly typed using e.g. TypedElement rather than String ‘name’ arguments</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10359"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>API compatible extension APIs are folded into a single new API</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1035C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>full auto-generated Visitor hierarchies are exploited</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">and of course Xtext is far from identical to LPG.</fo:block></fo:block></fo:block><fo:block id="APIs"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">APIs</fo:marker><fo:block font-size="14pt">2.1.5. APIs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL has two different styles of APIs</fo:block><fo:block id="ToolAPIs"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.5.1. Tool APIs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The major tool APIs originally provided by the org.eclipse.ocl.OCL class have evolved only slightly to org.eclipse.ocl.ecore.OCL and org.eclipse.ocl.uml.OCL for the classic metamodels and org.eclipse.ocl.pivot.OCL for the Pivot metamodel.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These APIs support the use of OCL as a tool to parse and evaluate constraints and queries.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These APIs will change very little; just the package changes according to the chosen metamodel representation.</fo:block></fo:block><fo:block id="InternalAPIs"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.5.2. Internal APIs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The internal parsing APIs were made public in 1.3.0 to support parser extension by QVT. These APIs are very tightly coupled to a particular LPG implementation of a particular OCL grammar formulation. It is extremely difficult to replicate these APIs for the ANTLR grammar that underlies the Xtext editors. It is also doubtful whether these APIs can be preserved as the OCL specification is clarified to more clearly specify what words are reserved and what is extensible. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is therefore unlikely that the internal APIs for the classic metamodels will be replicated for the Pivot metamodel. However since an LPG grammar is significantly (ten-times) smaller and perhaps a bit faster (two-times) it is planned to provide an automated Xtext to LPG translation so that a smaller LPG grammar can populate the same auto-generated Concrete Syntax structures as the ANTLR grammar.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This functionality is intended to form part of a new grammar extension API that will enable OCL-extending languages such as QVT to re-use and extend not only the grammar but also all the semantic scope resolution and concrete to abstract syntax mappings.</fo:block></fo:block><fo:block id="Versions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.1.5.3. Versions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse version numbering policy requires that a major version change occurs when any re-exported component has a major version number change. Consequently when Eclipse UML moved from to UML 2.4 support (4.0.0) and again to UML 2.5 (5.0.0) a corresponding change was forced on the Classic UML support and this is the number that then applies to the whole of Eclipse OCL. However the Ecore dependencies are unchanged and so Ecore dependent releases have advanced more slowly; 3.2 accompanying 4.0 and now 3.5 accompanying 6.0.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is probably just as confusing for the developers as for consumers. It is however necessary to ensure that the minor changes in the Classic Ecore functionality are not presented as major changes to consumers.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The current OCL version variaously referred to as:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10385"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10386"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>6.0 as the outer version of the OCL master feature</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10389"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>3.5 as the version of the Ecore OCL plugins (compatible with 3.0)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1038C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>1.0 as the version of the new Pivot OCL plugins</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:block></fo:block><fo:block id="EssentialOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Essential OCL Language</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.2. The Essential OCL Language</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The core functionality of OCL that supports expressions over models is called the Essential OCL. This language is of very limited use by itself since there is no way in which the models can be provided.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Essential OCL is extended in various ways to provide this missing context.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> provides a language for a document in which OCL complements an existing meta-model with invariants, and additional features. Complete OCL is part of the OMG OCL specification.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link> embeds OCL within the annotations of an Ecore model to enrich that model. OCLinEcore is defined an Eclipse OCL. It is not part of the OMG OCL specification.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">UML supports the use of OCL constraints as a form of OpaqueExpression, and UML tools such as Papyrus support those constraints for UML models.</fo:block><fo:block id="Syntax"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax</fo:marker><fo:block font-size="14pt">2.2.1. Syntax</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL realization of the Essential OCL grammar is provided in the following subsections, starting with the expression terms and then elaborating the operators.</fo:block><fo:block id="GrammarImplementation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.1. Grammar Implementation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The grammar used by the Xtext editors may be found at:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">/src/org/eclipse/ocl/examples/xtext/essentialocl/EssentialOCL.xtext</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">in the org.eclipse.ocl.xtext.essentialocl plugin.</fo:block></fo:block><fo:block id="GrammarApproach"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.2. Grammar Approach</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL 2.4 grammar is ambiguous and consequently has disambigating rules. How those disambiguating rules are applied is an implementation detail.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The disambiguating approach taken in Eclipse OCL is to parse an unambiguous larger language that unifies all the ambiguities. Subsequent semantic validation distinguishes between the ambiguities and diagnoses expressions from the larger language that are not valid OCL expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From a technical point of view this makes the grammar simpler and more regular, and the implementation more modular and configurable by the library model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From a user’s point of view, slightly wrong expressions may be syntactically valid and so semantic validation may produce a more helpful diagnostic. However completion assist may offer illegal expressions from the larger language.</fo:block></fo:block><fo:block id="EssentialOCL-Exp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.3. OCL Expression</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Exp syntax defines an OCL expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N103C9"><fo:external-graphic src="url(images/1100-exp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Expressions consist of a variety of operators and expression terms that are defined at the top level by an 

+						<fo:basic-link internal-destination="EssentialOCL-InfixedExp"><fo:inline color="blue" text-decoration="underline">InfixedExp</fo:inline></fo:basic-link>. We will first define the terms of an expression and then define the various forms of operators that bind expression terms together.  

+					</fo:block></fo:block><fo:block id="EssentialOCL-PrimaryExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.4. PrimaryExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PrimaryExp syntax identifies the basic building blocks of an OCL expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N103DD"><fo:external-graphic src="url(images/1100-primaryexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Literals such as</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N103E5"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N103E6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-PrimitiveLiteralExp"><fo:inline color="blue" text-decoration="underline">PrimitiveLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">true</fo:inline> or 

+								<fo:inline font-family="Inconsolata,Courier">3.14159</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N103F3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-CollectionLiteralExp"><fo:inline color="blue" text-decoration="underline">CollectionLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">Set{1..5}</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N103FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-TupleLiteralExp"><fo:inline color="blue" text-decoration="underline">TupleLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">Tuple{name:String='me',at:String='here')</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10407"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-TypeLiteralExp"><fo:inline color="blue" text-decoration="underline">TypeLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline> or 

+								<fo:inline font-family="Inconsolata,Courier">Set&lt;Integer&gt;</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context object</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10416"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10417"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-SelfExp"><fo:inline color="blue" text-decoration="underline">SelfExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Compound expressions such as</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10423"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10424"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-NestedExp"><fo:inline color="blue" text-decoration="underline">NestedExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">(x)</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1042E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-IfExp"><fo:inline color="blue" text-decoration="underline">IfExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">if x then y else z endif</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10438"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-LetExp"><fo:inline color="blue" text-decoration="underline">LetExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">let x : Integer in x + x</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Navigation expressions such as</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10444"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10445"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-NavigatingExp"><fo:inline color="blue" text-decoration="underline">NavigatingExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">x</fo:inline> or 

+								<fo:inline font-family="Inconsolata,Courier">x.Y::z-&gt;iterate(a:Integer;acc:Integer|acc+a)</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-SelfExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.5. SelfExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The SelfExp syntax supports the use of the prevailing context object in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1045A"><fo:external-graphic src="url(images/1100-selfexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="EssentialOCL-PrimitiveLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.6. PrimitiveLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PrimitiveLiteralExp syntax supports the use of a known value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10468"><fo:external-graphic src="url(images/1100-primitiveliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value may be </fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10470"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10471"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-NumberLiteralExp"><fo:inline color="blue" text-decoration="underline">NumberLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">4</fo:inline> or 

+								<fo:inline font-family="Inconsolata,Courier">3.14159</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1047E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-StringLiteralExp"><fo:inline color="blue" text-decoration="underline">StringLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">'a string'</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10488"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-BooleanLiteralExp"><fo:inline color="blue" text-decoration="underline">BooleanLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">true</fo:inline> or 

+								<fo:inline font-family="Inconsolata,Courier">false</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10495"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-UnlimitedNaturalLiteralExp"><fo:inline color="blue" text-decoration="underline">UnlimitedNaturalLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">*</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1049F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-InvalidLiteralExp"><fo:inline color="blue" text-decoration="underline">InvalidLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N104A9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-NullLiteralExp"><fo:inline color="blue" text-decoration="underline">NullLiteralExpCS</fo:inline></fo:basic-link> - 

+								<fo:inline font-family="Inconsolata,Courier">null</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-NumberLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.7. NumberLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NumberLiteralExp syntax supports the use of a numeric value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N104BB"><fo:external-graphic src="url(images/1100-numberliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N104C3"><fo:external-graphic src="url(images/1100-numberliteral.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A numeric value is</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N104CB"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N104CC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an integer such as 

+								<fo:inline font-family="Inconsolata,Courier">4</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N104D2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>fixed point number such as 

+								<fo:inline font-family="Inconsolata,Courier">3.1</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N104D8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>floating point number such as 

+								<fo:inline font-family="Inconsolata,Courier">12.8e-5</fo:inline>. 

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A numeric value does not have a leading 

+						<fo:inline font-family="Inconsolata,Courier">-</fo:inline>; negative numbers are parsed as the application of a unary negate operator to a positive number.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A numeric value may not have a trailing decimal point.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A numeric value may not have a redundant leading zero.</fo:block></fo:block><fo:block id="EssentialOCL-StringLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.8. StringLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The StringLiteralExp syntax supports the use of a string value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N104EF"><fo:external-graphic src="url(images/1100-stringliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A string is specified as a character sequence between single quotes.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">e.g. 

+						<fo:inline font-family="Inconsolata,Courier">'This is a string'</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard Java and C backslash escapes can be used for awkward characters such as a single quote.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\b</fo:inline> -- #x08: backspace BS

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\t</fo:inline> -- #x09: horizontal tab HT

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\n</fo:inline> -- #x0a: linefeed LF

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\f</fo:inline> -- #x0c: form feed FF

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\r</fo:inline> -- #x0d: carriage return CR

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\"</fo:inline> -- #x22: double quote "

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\'</fo:inline> -- #x27: single quote '

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\\</fo:inline> -- #x5c: backslash \

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\x</fo:inline> Hex Hex -- #x00 to #xFF

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">\u</fo:inline> Hex Hex Hex Hex -- #x0000 to #xFFFF

+					</fo:block></fo:block><fo:block id="EssentialOCL-BooleanLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.9. BooleanLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The BooleanLiteralExp syntax supports the use of boolean values in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10538"><fo:external-graphic src="url(images/1100-booleanliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Boolean values are 

+						<fo:inline font-family="Inconsolata,Courier">true</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-UnlimitedNaturalLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.10. UnlimitedNaturalLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UnlimitedNaturalLiteralExp syntax supports the use of the non-numeric unlimited value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1054E"><fo:external-graphic src="url(images/1100-unlimitednaturalliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Non-numeric unlimited value is 

+						<fo:inline font-family="Inconsolata,Courier">*</fo:inline>. Other UnlimitedNatural values are 

+						<fo:basic-link internal-destination="EssentialOCL-NumberLiteralExp"><fo:inline color="blue" text-decoration="underline">NumberLiteralExpCS</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-InvalidLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.11. InvalidLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The InvalidLiteralExp syntax supports the use of an invalid value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10565"><fo:external-graphic src="url(images/1100-invalidliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The invalid value is 

+						<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-NullLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.12. NullLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NullLiteralExp syntax supports the use of a null or unspecified value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10578"><fo:external-graphic src="url(images/1100-nullliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The null value is 

+						<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-CollectionLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.13. CollectionLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The CollectionLiteralExp syntax supports the creation of a collection of values for use in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1058B"><fo:external-graphic src="url(images/1100-collectionliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A collection literal comprises the 

+						<fo:basic-link internal-destination="EssentialOCL-CollectionType"><fo:inline color="blue" text-decoration="underline">CollectionType</fo:inline></fo:basic-link> followed by braces enclosing a comma-separated list of zero or more 

+						<fo:basic-link internal-destination="EssentialOCL-CollectionLiteralPart"><fo:inline color="blue" text-decoration="underline">CollectionLiteralParts</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">e.g. 

+						<fo:inline font-family="Inconsolata,Courier">Sequence{1,2,4..6}</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that null, collection and tuple values are permitted in collections but that invalid values are not.

+						A collection ‘containing’ an invalid value is flattened to the invalid value.</fo:block></fo:block><fo:block id="EssentialOCL-CollectionLiteralPart"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.14. CollectionLiteralPart</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The CollectionLiteralPart syntax supports the use of a value or range of values in a collection of values.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N105AA"><fo:external-graphic src="url(images/1100-collectionliteralpart.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A single item collection literal part may be any expression (except invalid). e.g. 

+						<fo:inline font-family="Inconsolata,Courier">1+2</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A multi-item collection literal part comprises the inclusive range of values between two integer limits.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">1..3</fo:inline> is the three values 

+						<fo:inline font-family="Inconsolata,Courier">1</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">2</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">3</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">1..-1</fo:inline> is the three values 

+						<fo:inline font-family="Inconsolata,Courier">1</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">0</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">-1</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-TupleLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.15. TupleLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TupleLiteralExp syntax supports the use of a tuple of named expression values in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N105DB"><fo:external-graphic src="url(images/1100-tupleliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A tuple literal comprises the 

+						<fo:inline font-family="Inconsolata,Courier">Tuple</fo:inline> keyword followed by braces enclosing

+						a comma-separated list of one or more 

+						<fo:basic-link internal-destination="EssentialOCL-TupleLiteralPart"><fo:inline color="blue" text-decoration="underline">TupleLiteralParts</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">Tuple{year:Integer='2000',month:String='January',day:Integer='1'}</fo:inline>

+					</fo:block></fo:block><fo:block id="EssentialOCL-TupleLiteralPart"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.16. TupleLiteralPart</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TupleLiteralPart syntax supports the use of a named expression value in a tuple of such values.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N105F7"><fo:external-graphic src="url(images/1100-tupleliteralpart.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The part comprises the name, an optional type and a value. If the type is omitted, it is inferred from the value.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">leapyear : Boolean = true</fo:inline>

+					</fo:block></fo:block><fo:block id="EssentialOCL-TypeLiteralExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.17. TypeLiteralExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TypeLiteralExp syntax supports the use of types as values in an expression. This is useful for expressions such as 

+						<fo:inline font-family="Inconsolata,Courier">myCollection.oclAsType(Set&lt;MyType&gt;)</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1060F"><fo:external-graphic src="url(images/1100-typeliteralexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A TypeLiteralExp comprises a 

+						<fo:basic-link internal-destination="EssentialOCL-TypeLiteral"><fo:inline color="blue" text-decoration="underline">TypeLiteral</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-NestedExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.18. NestedExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NestedExp syntax supports the use of an inner expression as a term in an outer expression ensuring that

+						the operator precedence of the inner expression is not affected by the outer expression,</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10623"><fo:external-graphic src="url(images/1100-nestedexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A nested expression is just an expression surrounded by parentheses.</fo:block></fo:block><fo:block id="EssentialOCL-IfExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.19. IfExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The IfExp syntax supports the use of a conditional choice of expression value in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10633"><fo:external-graphic src="url(images/1100-ifexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An if expression comprises a condition expression to be tested followed by a then-expression

+						to be evaluated if the condition is true and an else-expression for evaluation if the expression is false.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">if this.size &gt; that.size then this else that endif</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the else-expression is required and so there is no ambiguity when multiple if expressions are nested.</fo:block></fo:block><fo:block id="EssentialOCL-LetExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.20. LetExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The LetExp syntax supports the introduction of local variables to facilitate re-use of intermediate results within an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1064A"><fo:external-graphic src="url(images/1100-letexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A let expression comprises the let keyword followed by one or more comma-separated let variables and then the in keyword and

+						the in-expression to be evaluated with the help of the extra variables.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each let variable comprises a name, an optional type and an expression to initialize the variable. If the type is omitted, it is inferred from the initializer.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N10654"><fo:inline font-family="Inconsolata,Courier">let test : String = 'prefix[contents]suffix',

+    start : Integer = test.indexOf('['),

+    finish : Integer = test.indexOf(']')

+in test.substring(start,finish)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The let syntax has no terminating keyword such as endlet and so there is an ambiguity for for instance 

+						<fo:inline font-family="Inconsolata,Courier">1 + let b : Integer = 2 in b + 4</fo:inline>. The ambiguity is resolved as 

+						<fo:inline font-family="Inconsolata,Courier">1 + let b : Integer = 2 in (b + 4)</fo:inline> by selecting the longest possible in-expression.

+					</fo:block></fo:block><fo:block id="EssentialOCL-NameExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.21. NameExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NameExp syntax supports the use of the name of a model  element such as a property, operation or type in an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1066A"><fo:external-graphic src="url(images/1100-nameexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A name expression comprises a name optionally prefixed by double-colon separate path names.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first name is an 

+						<fo:basic-link internal-destination="EssentialOCL-UnrestrictedName"><fo:inline color="blue" text-decoration="underline">UnrestrictedName</fo:inline></fo:basic-link>, that is a name that does not clash with any OCL reserved words such as 

+						<fo:inline font-family="Inconsolata,Courier">else</fo:inline> or built-in types such as 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline>. Subsequent names are 

+						<fo:basic-link internal-destination="EssentialOCL-UnreservedName"><fo:inline color="blue" text-decoration="underline">UnreservedName</fo:inline></fo:basic-link> allowing the re-use of built-in type names but not reserved words.  

+					</fo:block></fo:block><fo:block id="EssentialOCL-IndexExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.22. IndexExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The IndexExp syntax supports the application of qualifiers to a model property to distinguish the source or select a particular association.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1068A"><fo:external-graphic src="url(images/1100-indexexp1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10692"><fo:external-graphic src="url(images/1100-indexexp2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A 

+						<fo:basic-link internal-destination="EssentialOCL-NameExp"><fo:inline color="blue" text-decoration="underline">NameExp</fo:inline></fo:basic-link> identifying a model property is optionally qualified by a first list of qualifiers and a second list of qualifiers.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This syntax is experimental and the qualifiers are not yet supported for evaluation.</fo:block></fo:block><fo:block id="EssentialOCL-NavigatingExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.23. NavigatingExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NavigatingExp syntax supports the navigation of models using model properties, operations and iterations.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N106A8"><fo:external-graphic src="url(images/1100-navigatingexp1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N106B0"><fo:external-graphic src="url(images/1100-navigatingexp2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N106B8"><fo:external-graphic src="url(images/1100-navigatingexp3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An 

+						<fo:basic-link internal-destination="EssentialOCL-IndexExp"><fo:inline color="blue" text-decoration="underline">IndexExp</fo:inline></fo:basic-link> identifying a potentially qualified model feature is optionally followed by a parenthesized arguments. If the parenthesized arguments are omitted the model feature should be a Property. If the arguments are present the model feature should be an iteration or operation.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The diverse syntaxes specified by OCL 2.4 for OperationCallExpCS and IteratorExpCS create ambiguities that are difficult to parse. The merged grammar used by Eclipse OCL gathers argument

+						contributions without imposing premature validation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The parenthesized arguments may be empty, or may comprise one or more parameters, optional accumulators and optional bodies.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The comma-separated list of parameters starts with a NavigatingArgCS, followed by any number of 

+						NavigatingCommaArgCS.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">simpleCall(simpleArgument)</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional comma-separated list of accumulators are introduced by a semi-colon-prefixed NavigatingSemiArgCS, followed by any number of  NavigatingCommaArgCS. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">some-&gt;iterate(p; anAccumulator : Integer = 0 | p.size())</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional comma-separated list of bodies are introduced by a vertical-bar-prefixed NavigatingBarArgCS, followed by any number of  NavigatingCommaArgCS. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">some-&gt;exists(p | p.size())</fo:inline>

+					</fo:block></fo:block><fo:block id="EssentialOCL-NavigatingArg"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.24. NavigatingArg</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NavigatingArg syntaxes supports the parsing of potential parameters, accumulators and bodies for use in NavigatingExps.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N106E5"><fo:external-graphic src="url(images/1100-navigatingarg.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each syntax supports an optional type and an optional initializer for an expression.</fo:block></fo:block><fo:block id="EssentialOCL-PrefixedExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.25. PrefixedExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PrefixedExp syntax supports the application of zero or more prefix unary operators to an expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N106F5"><fo:external-graphic src="url(images/1100-prefixedexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The prefix operator precedes an expression: 

+						<fo:inline font-family="Inconsolata,Courier">-4</fo:inline> or 

+						<fo:inline font-family="Inconsolata,Courier">not(this or that)</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The unary operators are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10705"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10706"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">-</fo:inline> negate

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1070C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">not</fo:inline> logical complement

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-InfixedExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.26. InfixedExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The InfixedExp syntax supports the application of zero or more infix binary operators between expression terms.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1071A"><fo:external-graphic src="url(images/1100-infixedexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The infix operators separate expression terms: 

+						<fo:inline font-family="Inconsolata,Courier">1 + 2 / 3 * 4 / 5 + 6</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The infix operators are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10727"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10728"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The 

+								<fo:basic-link internal-destination="EssentialOCL-NavigationOperators"><fo:inline color="blue" text-decoration="underline">NavigationOperators</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1072F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">*</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">/</fo:inline> multiply and divide

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10738"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">+</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">-</fo:inline> add and subtract

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10741"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">&lt;</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">&lt;=</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">&gt;=</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">&gt;</fo:inline> relational comparisons

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10750"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">=</fo:inline>, 

+								<fo:inline font-family="Inconsolata,Courier">&lt;&gt;</fo:inline> equality and inequality

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10759"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">and</fo:inline> logical and

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1075F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">or</fo:inline> inclusive or

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10765"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">xor</fo:inline> exclusive or

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1076B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">implies</fo:inline> logical implication

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The precedence and associativity of the operators is defined by the OCL Standard Library model, not by the grammar. The OCL 2.4 library precedence is as presented above with all operators left associative. The example above is therefore interpreted as 

+						<fo:inline font-family="Inconsolata,Courier">(1 + (((2 / 3) * 4) / 5)) + 6</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-NavigationOperators"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.27. NavigationOperators</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NavigationOperators operators are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1077C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1077D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">.</fo:inline> for object navigation

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10783"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> for collection navigation

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-TypeExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.28. TypeExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TypeExp syntax supports the use of types as expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10791"><fo:external-graphic src="url(images/1100-typeexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A type expression may be a</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10799"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1079A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-TypeNameExp"><fo:inline color="blue" text-decoration="underline">TypeNameExpCS</fo:inline></fo:basic-link> - a user-defined type

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N107A1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-TypeLiteral"><fo:inline color="blue" text-decoration="underline">TypeLiteralCS</fo:inline></fo:basic-link> - a built-in or aggregate type

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-TypeNameExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.29. TypeNameExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TypeNameExp syntax supports the use of a user-defined types as a declaration or expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N107B0"><fo:external-graphic src="url(images/1100-typenameexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A name expression comprises the name of a type optionally prefixed by double-colon separate path names.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first name is an 

+						<fo:basic-link internal-destination="EssentialOCL-UnrestrictedName"><fo:inline color="blue" text-decoration="underline">UnrestrictedName</fo:inline></fo:basic-link>, that is a name that does not clash with any OCL reserved words such as 

+						<fo:inline font-family="Inconsolata,Courier">else</fo:inline> or built-in types such as 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline>. Subsequent names are 

+						<fo:basic-link internal-destination="EssentialOCL-UnreservedName"><fo:inline color="blue" text-decoration="underline">UnreservedName</fo:inline></fo:basic-link> allowing the re-use of built-in type names but not reserved words.  

+					</fo:block></fo:block><fo:block id="EssentialOCL-TypeLiteral"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.30. TypeLiteral</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TypeLiteral syntax supports the use of built-in or aggregate types as declarations or expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N107D0"><fo:external-graphic src="url(images/1100-typeliteral.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Type literal may be a</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N107D8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N107D9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-PrimitiveType"><fo:inline color="blue" text-decoration="underline">PrimitiveTypeCS</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N107E0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-CollectionType"><fo:inline color="blue" text-decoration="underline">CollectionTypeCS</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N107E7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="EssentialOCL-TupleType"><fo:inline color="blue" text-decoration="underline">TupleTypeCS</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-PrimitiveType"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.31. PrimitiveType</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PrimitiveType syntax supports the definition of a built-in type for use in a declaration or expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N107F6"><fo:external-graphic src="url(images/1100-primitivetype.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The built-in types are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N107FE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N107FF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Boolean</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10802"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Integer</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10805"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Real</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10808"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>String</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1080B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>UnlimitedNatural</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1080E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OclAny</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10811"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OclInvalid</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10814"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OclVoid</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EssentialOCL-CollectionType"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.32. CollectionType</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The CollectionType syntax supports the definition of a collection type for use in a declaration or expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1081F"><fo:external-graphic src="url(images/1100-collectiontype.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A collection type comprises the CollectionTypeIdentifier followed by a 

+						<fo:basic-link internal-destination="EssentialOCL-TypeExp"><fo:inline color="blue" text-decoration="underline">Type Expression</fo:inline></fo:basic-link> defining the type of the collection elements.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">Set(String)</fo:inline> or 

+						<fo:inline font-family="Inconsolata,Courier">Sequence&lt;Bag&lt;Integer&gt;&gt;</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The built-in CollectionTypeIdentifiers are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10835"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10836"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Collection</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10839"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Bag</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1083C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OrderedSet</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1083F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Sequence</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10842"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Set</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL 2.4 specifies the use of parentheses to surround the element type. Eclipse OCL additionally allows angle brackets as specified by UML and as may be required to support more general templated types.</fo:block></fo:block><fo:block id="EssentialOCL-TupleType"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.33. TupleType</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TupleType syntax supports the definition of a tuple type for use in a declaration or expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1084F"><fo:external-graphic src="url(images/1100-tupletype.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A tuple type comprises the 

+						<fo:inline font-family="Inconsolata,Courier">Tuple</fo:inline> keyword followed by

+						a comma-separated list of one or more 

+						<fo:basic-link internal-destination="EssentialOCL-TuplePart"><fo:inline color="blue" text-decoration="underline">TupleParts</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL 2.4 specifies the use of parentheses to surround the parts. Eclipse OCL additionally allows angle brackets as specified by UML and as may be required to support more general templated types.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">Tuple&lt;year:Integer,month:String,day:Integer&gt;</fo:inline>

+					</fo:block></fo:block><fo:block id="EssentialOCL-TuplePart"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.34. TuplePart</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The TuplePart syntax supports the definition of an element of a TupleType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1086D"><fo:external-graphic src="url(images/1100-tuplepart.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The part comprises the name and a type and a value. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">leapyear : Boolean</fo:inline>

+					</fo:block></fo:block><fo:block id="EssentialOCL-UnreservedName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.35. UnreservedName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Essential OCL reserved words are 

+						<fo:inline font-family="Inconsolata,Courier">and</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">else</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">endif</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">false</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">if</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">implies</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">in</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">let</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">not</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">null</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">or</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">then</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">true</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">xor</fo:inline>. These

+						can only be used as names when escaped as in 

+						<fo:inline font-family="Inconsolata,Courier">_'self'</fo:inline>.

+					</fo:block></fo:block><fo:block id="EssentialOCL-UnrestrictedName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.2.1.36. UnrestrictedName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Essential OCL restricted words are the reserved words above and the OCL reserved type names which are 

+						<fo:inline font-family="Inconsolata,Courier">Bag</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Boolean</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Collection</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Lambda</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OclInvalid</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OclSelf</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OclVoid</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OrderedSet</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Real</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Sequence</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Set</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Tuple</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">UnlimitedNatural</fo:inline>. An UnrestrictedName can be used in any context. The reserved type names can be used following a 

+						<fo:inline font-family="Inconsolata,Courier">::</fo:inline> qualification, Without qualification unrestricted names must be escaped as 

+						<fo:inline font-family="Inconsolata,Courier">_'Boolean'</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">Lambda</fo:inline> is used in experimental syntax that realizes iterator bodies as lambda-expressions.

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="OCLinEcore"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCLinEcore Language</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.3. The OCLinEcore Language</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Ecore Abstract Syntax supports the use of OCL embedded within EAnnotations.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore language provides a textual Concrete Syntax that makes both Ecore and OCL accessible to users. Examples may be found in  

+				<fo:basic-link internal-destination="OCLinEcoreMetamodel"><fo:inline color="blue" text-decoration="underline">OCLinEcore Library Metamodel</fo:inline></fo:basic-link> and

+

+				<fo:basic-link internal-destination="OCLinEcoreTutorialHelpers"><fo:inline color="blue" text-decoration="underline">OCLinEcore Helpers</fo:inline></fo:basic-link>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore tooling provides a rich editing environment based on Xtext with strong semantic checking.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCLinEcore is more than just an editor for OCL in Ecore, it is useful for</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1090B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1090C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>providing a coherent textual view of an Ecore meta-model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1090F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>providing syntax sugar for some Ecore conventions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10912"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>editing and validating OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10915"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>integrating OCL into Ecore</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is planned to take the syntactic sugar further and provide full support for all class-related UML concepts. The language therefore uses UML as its point of reference wherever possible.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore tooling may be used directly on *.ecore files, or on their *.oclinecore textual counterparts.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please follow the 

+				<fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:inline color="blue" text-decoration="underline">OCLinEcore tutorial</fo:inline></fo:basic-link> for an introduction to the language and its tooling.

+			</fo:block><fo:block id="Syntax2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax</fo:marker><fo:block font-size="14pt">2.3.1. Syntax</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore syntax has a consistent structure influenced by the informal definitions in OMG specifications and by the Ecore hierarchy. Most Ecore concepts are represented by a syntax of the form:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10928"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10929"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional primary adjectives</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1092C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>mandatory keyword</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1092F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>mandatory name facet</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10932"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>further facets</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10935"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an optional braced clause of secondary adjectives</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10938"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an optional braced clause of elements</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1093B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1093C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>composed elements</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1093F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>annotations</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10942"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>constraints</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Thus in:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N10947"><fo:inline font-family="Inconsolata,Courier">abstract class Example extends Base { interface } { ... }

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1094D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1094E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">abstract</fo:inline> is a primary adjective

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10954"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">class</fo:inline> is a keyword

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1095A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">Example</fo:inline> is the name facet

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10960"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">extends Base</fo:inline> is a further facet

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10966"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">{ interface }</fo:inline> supports the secondary interface adjective.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1096C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">{ ... }</fo:inline> provides a nested context for class content.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="GrammarImplementation2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.1. Grammar Implementation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The grammar used by the Xtext editors may be found at:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">/src/org/eclipse/ocl/examples/xtext/oclinecore/OCLinEcore.xtext</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">in the org.eclipse.ocl.xtext.oclinecore plugin. The OCLinEcore grammar extends the Essential OCL grammar.</fo:block></fo:block><fo:block id="Module"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.2. Module</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Module syntax supports the overall structure of an Ecore file</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10984"><fo:external-graphic src="url(images/1200-rootpackage.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The definition of the module comprises</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1098C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1098D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional module declaration</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10990"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional specification of the OCL Standard libraries</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10993"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional import of referenced Ecore or UML or OCLinEcore resources</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10996"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a hierarchy of 

+								<fo:basic-link internal-destination="OCLinEcore-Package"><fo:inline color="blue" text-decoration="underline">Packages</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1099F"><fo:external-graphic src="url(images/1200-library.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more external libraries may be imported so that their definitions are merged to form a composite library of basic and extended evaluation capability.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implicit import of the default OCL Standard Library is suppressed, if any library is imported. The default library may be extended by specifying it as the first library import.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N109A9"><fo:inline font-family="Inconsolata,Courier">library ocl : 'http://www.eclipse.org/ocl/3.1.0/OCL.oclstdlib'

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The namespace URI of the first library package defines the namespace URI of the composite library. The namespace URI of subsequent library imports may not conflict, but may be null.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N109B3"><fo:external-graphic src="url(images/1200-import.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more external metamodels may be imported.</fo:block></fo:block><fo:block id="OCLinEcore-Package"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.3. Package</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Package syntax supports a nested hierarchy of packages and classifiers </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N109C3"><fo:external-graphic src="url(images/1200-package1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Package has a name and optionally a namespace prefix and namespace URI.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N109CD"><fo:external-graphic src="url(images/1200-package2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Package may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Package"><fo:inline color="blue" text-decoration="underline">Packages</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLinEcore-Classifier"><fo:inline color="blue" text-decoration="underline">Classifiers</fo:inline></fo:basic-link> and 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Classifier"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.4. Classifier</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Classifier syntax supports the definition of types within a 

+						<fo:basic-link internal-destination="OCLinEcore-Package"><fo:inline color="blue" text-decoration="underline">Package</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N109ED"><fo:external-graphic src="url(images/1200-classifiers.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Classifier may be</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N109F5"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N109F6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:basic-link internal-destination="OCLinEcore-Class"><fo:inline color="blue" text-decoration="underline">Class</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N109FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:basic-link internal-destination="OCLinEcore-DataType"><fo:inline color="blue" text-decoration="underline">DataType</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10A04"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:basic-link internal-destination="OCLinEcore-Enumeration"><fo:inline color="blue" text-decoration="underline">Enumeration</fo:inline></fo:basic-link> with associated 

+								<fo:basic-link internal-destination="OCLinEcore-EnumerationLiteral"><fo:inline color="blue" text-decoration="underline">EnumerationLiterals</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="OCLinEcore-DataType"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.5. DataType</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The DataType syntax supports the definition of an EDataType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A17"><fo:external-graphic src="url(images/1200-datatype1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A DataType has a name and optionally template parameters and an instance class name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A21"><fo:external-graphic src="url(images/1200-datatype2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A DataType may be serializable; by default it is not.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a DataType may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">invariants</fo:inline></fo:basic-link> and 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Enumeration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.6. Enumeration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Enumeration syntax supports the definition of an EEnum.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A3B"><fo:external-graphic src="url(images/1200-enumeration1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Enumeration has a name and optionally template parameters and an instance class name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A45"><fo:external-graphic src="url(images/1200-enumeration2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Enumeration may be serializable; by default it is not.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Enumeration may comprise enumeration literals, 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">invariants</fo:inline></fo:basic-link> and 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-EnumerationLiteral"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.7. EnumerationLiteral</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EnumerationLiteral syntax supports the definition of an EEnumLiteral.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A5F"><fo:external-graphic src="url(images/1200-enumerationliteral.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An EnumerationLiteral has a name and optionally a value.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an EnumerationLiteral may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Class"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.8. Class</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Class syntax supports the definition of an EClass.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10A73"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10A74"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional abstract prefix</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10A77"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional extension of other classifiers</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10A7A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional invariants, annotations, features and operations</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A7F"><fo:external-graphic src="url(images/1200-class1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Class may be abstract has a name and optionally template parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(NB, the ‘abstract’ prefix is optional, even though the figure indicates that it is mandatory.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A8B"><fo:external-graphic src="url(images/1200-class2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Class may extend one or more other 

+						<fo:basic-link internal-destination="OCLinEcore-TypeRef"><fo:inline color="blue" text-decoration="underline">Classes</fo:inline></fo:basic-link> that may be specialized using the template parameters.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10A99"><fo:external-graphic src="url(images/1200-class3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Class may have an instance class name, and may also be declared to be an interface.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10AA3"><fo:external-graphic src="url(images/1200-class4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Class may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLinEcore-Operation"><fo:inline color="blue" text-decoration="underline">Operations</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLinEcore-StructuralFeature"><fo:inline color="blue" text-decoration="underline">StructuralFeatures</fo:inline></fo:basic-link> and 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">invariants</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-StructuralFeature"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.9. StructuralFeature</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The StructuralFeature syntax supports the definition of the StructuralFeatures.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10AC3"><fo:external-graphic src="url(images/1200-features.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A StructuralFeature may be</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10ACB"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10ACC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:basic-link internal-destination="OCLinEcore-Attribute"><fo:inline color="blue" text-decoration="underline">Attribute</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10AD3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:basic-link internal-destination="OCLinEcore-Reference"><fo:inline color="blue" text-decoration="underline">Reference</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="OCLinEcore-Attribute"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.10. Attribute</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Attribute syntax supports the definition of an EAttribute; a Property with a DataType value.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10AE2"><fo:external-graphic src="url(images/1200-attribute1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Attribute may be static and has a name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">static</fo:inline> qualifier supports declaration of static properties which are supported by UML and OCL. Note that Ecore does not support static properties.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">definition</fo:inline> qualifier is an obsolete experimental syntax for Complete OCL definitions.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10AF6"><fo:external-graphic src="url(images/1200-attribute2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Attribute may may have a 

+						<fo:basic-link internal-destination="OCLinEcore-TypeRef"><fo:inline color="blue" text-decoration="underline">Type</fo:inline></fo:basic-link> and multiplicity.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10B04"><fo:external-graphic src="url(images/1200-attribute3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Attribute may a simple initializer and a variety of qualifiers:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10B0C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B0D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">derived</fo:inline> specifies a derived attribute (default 

+								<fo:inline font-family="Inconsolata,Courier">!derived</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B16"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">id</fo:inline> specifies that the attribute provides the identifier if its class (default 

+								<fo:inline font-family="Inconsolata,Courier">!id</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B1F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> specifies that the attribute elements are ordered (default 

+								<fo:inline font-family="Inconsolata,Courier">!ordered</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B28"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">readonly</fo:inline> specifies that the attribute elements are readonly (not changeable) (default 

+								<fo:inline font-family="Inconsolata,Courier">!readonly</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B31"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">transient</fo:inline> specifies that the attribute elements are computed on the fly (default 

+								<fo:inline font-family="Inconsolata,Courier">!transient</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B3A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> specifies that there are no duplicate attribute elements (default 

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B43"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unsettable</fo:inline> specifies that attribute element may have no value (default 

+								<fo:inline font-family="Inconsolata,Courier">!unsettable</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10B4C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">volatile</fo:inline> specifies that the attribute elements are not persisted (default 

+								<fo:inline font-family="Inconsolata,Courier">!volatile</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10B57"><fo:external-graphic src="url(images/1200-attribute4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Attribute may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>, initial and derived 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">constraints</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A simple constant value may be defined using the initializer. A computed value requires the use of a constraint. If both initial and derived constraints are present, the initial constraint is ignored.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The defaults for multiplicity lower and upper bound and for 

+						<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> follow the UML specification and so corresponds to a single element Set that is 

+						<fo:inline font-family="Inconsolata,Courier">[1] {unique,!ordered}</fo:inline>.

+						Note that UML defaults differ from the Ecore defaults which correspond to an optional element OrderedSet, that is 

+						<fo:inline font-family="Inconsolata,Courier">[?] {ordered,unique}</fo:inline>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Reference"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.11. Reference</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Reference syntax supports the definition of an EReference; a Property with a Class value.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10B7F"><fo:external-graphic src="url(images/1200-reference1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Reference may be static and has a name and optionally an opposite name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">static</fo:inline> qualifier supports declaration of static properties which are supported by UML and OCL. Note that Ecore does not support static properties.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">definition</fo:inline> qualifier is an obsolete experimental syntax for Complete OCL definitions.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10B93"><fo:external-graphic src="url(images/1200-reference2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Reference may may have a 

+						<fo:basic-link internal-destination="OCLinEcore-TypeRef"><fo:inline color="blue" text-decoration="underline">Type</fo:inline></fo:basic-link> and multiplicity.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10BA1"><fo:external-graphic src="url(images/1200-reference3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Reference may a simple initializer and a variety of qualifiers:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10BA9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BAA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">composes</fo:inline> specifies a composed (containing) reference (default 

+								<fo:inline font-family="Inconsolata,Courier">!composes</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BB3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">derived</fo:inline> specifies a derived reference (default 

+								<fo:inline font-family="Inconsolata,Courier">!derived</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BBC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> specifies that the reference elements are ordered (default 

+								<fo:inline font-family="Inconsolata,Courier">!ordered</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BC5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">readonly</fo:inline> specifies that the reference elements are readonly (not changeable) (default 

+								<fo:inline font-family="Inconsolata,Courier">!readonly</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BCE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">resolve</fo:inline> specifies that the reference elements proxies may need resolution (default 

+								<fo:inline font-family="Inconsolata,Courier">!resolve</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BD7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">transient</fo:inline> specifies that the reference elements are computed on the fly (default 

+								<fo:inline font-family="Inconsolata,Courier">!transient</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BE0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> specifies that there are no duplicate reference elements (default 

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BE9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unsettable</fo:inline> specifies that reference element may have no value (default 

+								<fo:inline font-family="Inconsolata,Courier">!unsettable</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10BF2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">volatile</fo:inline> specifies that the reference elements are not persisted (default 

+								<fo:inline font-family="Inconsolata,Courier">!volatile</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10BFD"><fo:external-graphic src="url(images/1200-reference4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Reference may comprise keys, 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>, initial and derived 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">constraints</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A simple constant value may be defined using the initializer. A computed value requires the use of a constraint. If both initial and derived constraints are present, the initial constraint is ignored.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The defaults for multiplicity lower and upper bound and for 

+						<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> follow the UML specification and so corresponds to a single element Set that is 

+						<fo:inline font-family="Inconsolata,Courier">[1] {unique,!ordered}</fo:inline>.

+						Note that UML defaults differ from the Ecore defaults which correspond to an optional element OrderedSet, that is 

+						<fo:inline font-family="Inconsolata,Courier">[?] {ordered,unique}</fo:inline>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Operation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.12. Operation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Operation syntax supports the definition of an EOperation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C25"><fo:external-graphic src="url(images/1200-operation1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation may be static and has a name and optionally template parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">static</fo:inline> qualifier supports declaration of static operations which are supported by UML and OCL. Note that Ecore does not support static operations.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">definition</fo:inline> qualifier is an obsolete experimental syntax for Complete OCL definitions.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C39"><fo:external-graphic src="url(images/1200-operation2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation has zero of more 

+						<fo:basic-link internal-destination="OCLinEcore-Parameter"><fo:inline color="blue" text-decoration="underline">Parameters</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C47"><fo:external-graphic src="url(images/1200-operation3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation may have a return 

+						<fo:basic-link internal-destination="OCLinEcore-TypeRef"><fo:inline color="blue" text-decoration="underline">Type</fo:inline></fo:basic-link> and multiplicity.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C55"><fo:external-graphic src="url(images/1200-operation4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation may declare zero or more throw 

+						<fo:basic-link internal-destination="OCLinEcore-TypeRef"><fo:inline color="blue" text-decoration="underline">Exceptions</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C63"><fo:external-graphic src="url(images/1200-operation5.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation may have a variety of qualifiers:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10C6B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10C6C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">derived</fo:inline> specifies a derived operation (default 

+								<fo:inline font-family="Inconsolata,Courier">!derived</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10C75"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> specifies that the returned elements are ordered (default 

+								<fo:inline font-family="Inconsolata,Courier">!ordered</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10C7E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> specifies that there are no duplicate returned elements (default 

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10C89"><fo:external-graphic src="url(images/1200-operation6.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Operation may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>, precondition, postcondition and body 

+						<fo:basic-link internal-destination="OCLinEcore-Constraint"><fo:inline color="blue" text-decoration="underline">constraints</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">static</fo:inline> qualifier supports declaration of static operations which are supported by UML and OCL. Note that Ecore does not support static operations.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">definition</fo:inline> qualifier is an obsolete experimental syntax for Complete OCL definitions.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The defaults for multiplicity lower and upper bound and for 

+						<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> follow the UML specification and so corresponds to a single element Set that is 

+						<fo:inline font-family="Inconsolata,Courier">[1] {unique,!ordered}</fo:inline>.

+						Note that UML defaults differ from the Ecore defaults which correspond to an optional element OrderedSet, that is 

+						<fo:inline font-family="Inconsolata,Courier">[?] {ordered,unique}</fo:inline>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Parameter"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.13. Parameter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Parameter syntax supports the definition of an EParameter.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10CB9"><fo:external-graphic src="url(images/1200-parameter1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Parameter has a name, optional "Type:#OCLinEcore-TypeRef and multiplicity</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10CC3"><fo:external-graphic src="url(images/1200-parameter2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Parameter may have a variety of qualifiers:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10CCB"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10CCC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> specifies that the returned elements are ordered (default 

+								<fo:inline font-family="Inconsolata,Courier">!ordered</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10CD5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> specifies that there are no duplicate returned elements (default 

+								<fo:inline font-family="Inconsolata,Courier">unique</fo:inline>)

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Parameter may comprise 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The defaults for multiplicity lower and upper bound and for 

+						<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">unique</fo:inline> follow the UML specification and so corresponds to a single element Set that is 

+						<fo:inline font-family="Inconsolata,Courier">[1] {unique,!ordered}</fo:inline>.

+						Note that UML defaults differ from the Ecore defaults which correspond to an optional element OrderedSet, that is 

+						<fo:inline font-family="Inconsolata,Courier">[?] {ordered,unique}</fo:inline>.

+					</fo:block></fo:block><fo:block id="OCLinEcore-TypeRef"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.14. Types</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Type syntax supports the definition of EType and EGenericType in conjunction with an ETypedElement. The syntax is very similar to Java.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10CFA"><fo:external-graphic src="url(images/1200-types.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">PrimitiveTypeRefCS</fo:inline> provides access to the built-in OCL types and their corrersponding Ecore counterparts

+					</fo:block><fo:block xmlns:rx="http://www.renderx.com/XSL/Extensions" space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="N10D05"><fo:table border-before-width.conditionality="retain" border-collapse="collapse" width="100%" border-start-style="solid" border-end-style="solid" border-top-style="solid" border-bottom-style="solid" border-start-width="0.5pt" border-end-width="0.5pt" border-top-width="0.5pt" border-bottom-width="0.5pt" border-start-color="black" border-end-color="black" border-top-color="black" border-bottom-color="black"><fo:table-body end-indent="0pt" start-indent="0pt"><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>OCL type</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Ecore type</fo:block></fo:table-cell>

+						</fo:table-row><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boolean</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EBoolean</fo:block></fo:table-cell>

+						</fo:table-row><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Integer</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EBigInteger</fo:block></fo:table-cell>

+						</fo:table-row><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Real</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EBigDecimal</fo:block></fo:table-cell>

+						</fo:table-row><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>String</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EString</fo:block></fo:table-cell>

+						</fo:table-row><fo:table-row>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>UnlimitedNatural</fo:block></fo:table-cell>

+							<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EBigInteger</fo:block></fo:table-cell>

+						</fo:table-row></fo:table-body></fo:table></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">TypedTypeRefCS</fo:inline> provides for user defined types and their template parameterisation.

+					</fo:block></fo:block><fo:block id="OCLinEcore-Annotations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.15. AnnotationElement</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The AnnotationElement syntax supports the definition of an EAnnotation hierarchy with details, references and contents.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10D5B"><fo:external-graphic src="url(images/1200-annotations.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An AnnotationElement may be 

+						<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotation</fo:inline></fo:basic-link> or 

+						<fo:basic-link internal-destination="OCLinEcore-Documentation"><fo:inline color="blue" text-decoration="underline">Documentation</fo:inline></fo:basic-link>.  

+					</fo:block></fo:block><fo:block id="OCLinEcore-Annotation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.16. Annotation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Annotation syntax supports the definition of an EAnnotation hierarchy with details, references and contents.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10D73"><fo:external-graphic src="url(images/1200-annotation1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Annotation has a source URI, which may be specified without quotes if the URI is just a name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10D7D"><fo:external-graphic src="url(images/1200-annotation2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Annotation may have 

+						<fo:basic-link internal-destination="OCLinEcore-Detail"><fo:inline color="blue" text-decoration="underline">Details</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10D8B"><fo:external-graphic src="url(images/1200-annotation3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Annotation may comprise</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10D93"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10D94"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="OCLinEcore-Annotation"><fo:inline color="blue" text-decoration="underline">Annotations</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10D9B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>content elements</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10D9E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>names that reference other elements</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="OCLinEcore-Detail"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.17. Detail</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Detail syntax supports the definition of a detail of an EAnnotation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10DA9"><fo:external-graphic src="url(images/1200-detail.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A detail comprises a detail key and optional value.</fo:block></fo:block><fo:block id="OCLinEcore-Documentation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.18. Documentation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Documentation syntax is an experimental syntactic sugar for a genmodel annotation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10DB9"><fo:external-graphic src="url(images/1200-annotations.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is likely to be replaced by a Javadoc-style comment that will be persisted in Ecore.</fo:block></fo:block><fo:block id="OCLinEcore-Constraint"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.19. Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Constraints syntax supports the embedding of OCL expressions as invariants for classes, as preconditions, postconditions or bodies for operations and initial or derived values for properties.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10DC9"><fo:external-graphic src="url(images/1200-constraints.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The integration occurs through the 

+						<fo:inline font-style="italic">SpecificationCS</fo:inline> rule that invokes an 

+						<fo:basic-link internal-destination="EssentialOCL-Exp"><fo:inline color="blue" text-decoration="underline">ExpCS</fo:inline></fo:basic-link>. (The alternative 

+						<fo:inline font-style="italic">UnquotedString</fo:inline> is an implementation detail that supports the import from Ecore where the OCL is in unparsed textual form rather than an analyzed syntax tree.)

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A class invariant may be 

+						<fo:inline font-family="Inconsolata,Courier">callable</fo:inline> to specify that the Ecore representation is to use the EOperation rather than EAnnotation representation.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A class invariant optionally supports a second OCL expression as a parenthesis on the invariant name. This parenthesized expression is invoked when an invariant fails in order to provide a user-defined failure message. Whether this message is an error or a warning is determined by the evaluation of the invariant:</fo:block></fo:block><fo:block id="Terminals"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.20. Terminals</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore grammar extens the Esstial OCL grammar which should be consulted for definition of INT, and ExpCS.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10DEA"><fo:external-graphic src="url(images/1200-terminals.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="Names"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.21. Names </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Unrestricted name is any name other than the OCL reserved keywords. See 

+						<fo:basic-link internal-destination="EssentialOCL-UnrestrictedName"><fo:inline color="blue" text-decoration="underline">UnrestrictedName</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Unreserved name is any name other than the OCL reserved keywords above or the OCL reserved types. See 

+						<fo:basic-link internal-destination="EssentialOCL-UnreservedName"><fo:inline color="blue" text-decoration="underline">UnreservedName</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you need to use any of these names or non-alphanumeric names, you must use the escaped string syntax for a name: e.g. 

+						<fo:inline font-family="Inconsolata,Courier">_'true'</fo:inline>. The usual Java backslash escapes, with the exception of octal are supported: 

+						<fo:inline font-family="Inconsolata,Courier">_'new-lines\n\x0a\u000a'</fo:inline>

+					</fo:block></fo:block><fo:block id="Comments"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.3.1.22. Comments</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Single line comments are supported by ignoring all text following 

+						<fo:inline font-family="Inconsolata,Courier">--</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Multi line comments are supported by ignoring all text within 

+						<fo:inline font-family="Inconsolata,Courier">/* ... */</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Documentation comments are supported for all text within 

+						<fo:inline font-family="Inconsolata,Courier">/** ... */</fo:inline>. Unfortunately no documentation EAnnotation is currently created.

+					</fo:block></fo:block></fo:block><fo:block id="Limitations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Limitations</fo:marker><fo:block font-size="14pt">2.3.2. Limitations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCLinEcore supports the full capabilities of Ecore, however the support for upper and lower bounds on generic types has not been adequately tested.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCLinEcore provides primary syntaxes for some Ecore conventions such as genmodel annotations and constraints; much more support is needed for feature maps.</fo:block></fo:block></fo:block><fo:block id="CompleteOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Complete OCL Language</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.4. The Complete OCL Language</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL provides a language for a document in which OCL complements an existing meta-model with invariants, and additional features.</fo:block><fo:block id="Syntax3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax</fo:marker><fo:block font-size="14pt">2.4.1. Syntax</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL syntax is defined by the OMG OCL 2.4 specification.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The syntax comprises keywords such as 

+					<fo:inline font-family="Inconsolata,Courier">context</fo:inline> followed by appropriate names and punctuation and OCL expressions.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">With the exception of 

+					<fo:inline font-family="Inconsolata,Courier">endpackage</fo:inline> there is no terminating punctuation and so the consequences of a syntax error can be quite far-reaching while editing a document. Concentrate on the first error.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A substantial example of Complete OCL may be found by installing the 

+					<fo:basic-link internal-destination="RoyalAndLoyalExample"><fo:inline color="blue" text-decoration="underline">RoyalAndLoyal Example Project</fo:inline></fo:basic-link>.

+				</fo:block><fo:block id="GrammarImplementation3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.1. Grammar Implementation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The grammar used by the Xtext editors may be found at:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">/src/org/eclipse/ocl/examples/xtext/completeocl/CompleteOCL.xtext</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">in the org.eclipse.ocl.xtext.completeocl plugin. The Complete OCL grammar extends the Essential OCL grammar.</fo:block></fo:block><fo:block id="CompleteOCL-Document"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.2. Complete OCL Document</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Document syntax defines a Complete OCL document, for which *.ocl is the default extension.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10E51"><fo:external-graphic src="url(images/1300-document.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Complete OCL document may</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10E59"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10E5A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>import meta-models to be complemented</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10E5D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>include additional Complute OCL documents</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10E60"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>specify one or more Standard Library documents</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">and then provide complements for one of more Packages, Classifiers or Features.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The import, include and library declarations are Eclipse OCL extensions. The OCL 2.4 specification provides no mechanism for a Complete OCL document to reference external material.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10E69"><fo:external-graphic src="url(images/1300-import.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The primary definitions of each meta-model may be imported by specifying the URI of a Package and optionally an alias for that Package.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The import may be from a *.ecore, *.uml or *.oclinecore file.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10E75"><fo:external-graphic src="url(images/1300-include.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Additional documents complementing meta-model may be included by specifying the URI of the Complete OCL document.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10E7F"><fo:external-graphic src="url(images/1300-library.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more external libraries may be imported so that their definitions are merged to form a composite library of basic and extended evaluation capability.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implicit import of the default OCL Standard Library is suppressed, if any library is imported. The default library may be extended by specifying it as the first library import.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N10E89"><fo:inline font-family="Inconsolata,Courier">library ocl : 'http://www.eclipse.org/ocl/3.1.0/OCL.oclstdlib'

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The namespace URI of the first library package defines the namespace URI of the composite library. The namespace URI of subsequent library imports may not conflict, but may be null.</fo:block></fo:block><fo:block id="CompleteOCL-PackageDeclaration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.3. PackageDeclaration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PackageDeclaration syntax identifies a Package to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10E99"><fo:external-graphic src="url(images/1300-packagedeclaration1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The package keyword is followed by the optionally qualified name of the package to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10EA3"><fo:external-graphic src="url(images/1300-packagedeclaration2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The name is followed by the 

+						<fo:basic-link internal-destination="CompleteOCL-ContextDecl"><fo:inline color="blue" text-decoration="underline">declaration contexts</fo:inline></fo:basic-link> to be complemented and finally an endpackage keyword.

+					</fo:block></fo:block><fo:block id="CompleteOCL-ContextDecl"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.4. ContextDecl</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ContextDecl syntax identifies a model element to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10EB7"><fo:external-graphic src="url(images/1300-contextdecl.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A complemented context may be a</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10EBF"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10EC0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-ClassifierContextDecl"><fo:inline color="blue" text-decoration="underline">Classifier Context</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10EC7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-OperationContextDecl"><fo:inline color="blue" text-decoration="underline">Operation Context</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10ECE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-PropertyContextDecl"><fo:inline color="blue" text-decoration="underline">Property Context</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="CompleteOCL-ClassifierContextDecl"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.5. ClassifierContextDecl</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ClassifierContextDecl syntax identifies a Classifier to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10EDD"><fo:external-graphic src="url(images/1300-classifiercontextdecl1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context keyword is followed by an optional declaration of the name of the context variable. If omitted the context variable is named 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10EEA"><fo:external-graphic src="url(images/1300-classifiercontextdecl2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Then the optionally qualified name of the classifier to be complemented is defined. Qualification is required if the classifier context is specified directly as part of the document. Qualification may be omitted when the classifier context is specified as part of a package declaration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10EF4"><fo:external-graphic src="url(images/1300-classifiercontextdecl3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Finally the content of the classifier context may comprise</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10EFC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10EFD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-Def"><fo:inline color="blue" text-decoration="underline">Def</fo:inline></fo:basic-link> to define an additional feature

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F04"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-Inv"><fo:inline color="blue" text-decoration="underline">Inv</fo:inline></fo:basic-link> to define an invariant

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="CompleteOCL-Def"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.6. Def</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Def syntax defines an additional Feature for a Classifier.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F13"><fo:external-graphic src="url(images/1300-def1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The definition may define a static feature with a feature name.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A further name may be specified for no very obvious purpose other than symmetry with an invariant. The optional name is not used.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F1F"><fo:external-graphic src="url(images/1300-def2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A parenthesized 

+						<fo:basic-link internal-destination="CompleteOCL-Parameter"><fo:inline color="blue" text-decoration="underline">parameter</fo:inline></fo:basic-link> list must be specified to define an operation and omitted for a property definition.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F2D"><fo:external-graphic src="url(images/1300-def3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Then the property or optional operation return 

+						<fo:basic-link internal-destination="EssentialOCL-TypeExp"><fo:inline color="blue" text-decoration="underline">type</fo:inline></fo:basic-link> is specified followed by the 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link> of the property initializer or operation body.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An additional definition is usable within an OCL expression as if it was defined in the complemented meta-model. For the purposes of reflection the additional appear as part of the complemented meta-model, however they remain complements and are not persisted with that meta-model.</fo:block></fo:block><fo:block id="CompleteOCL-Inv"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.7. Inv</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Inv syntax defines an invariant for a Classifier.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F47"><fo:external-graphic src="url(images/1300-inv.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The inv keyword is followed by an optional invariant name an optional violation message and the 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link> of the invariant.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional name may be used by validation environments to identify the invariant in a control panel and in diagnostic messages.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional violation message provides an OCL expression that may be used by a validation environment to provide a custom message to explain a broken invariant. The severity of the invariant violationm may be controlled by the value of the invariant expression.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10F57"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F58"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>true indicates that the invariant was satisfied</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F5B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>false indicates that the invariant was violated with warning severity</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F5E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>null indicates that the invariant was violated with error severity</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F61"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>invalid indicates that the invariant failed to evaluate</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Indigo release, the local variables of the invariant are not accessible to the violation message expression. This will be changed in a future release.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Indigo release, custom messages are available when a CompleteOCLEObjectValidator is used as the EValidator. This is not the case for validation in the Sample Ecore Editor and so a default message using the invariant name and the failing object is provided. </fo:block></fo:block><fo:block id="CompleteOCL-OperationContextDecl"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.8. OperationContextDecl</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OperationContextDecl syntax identifies an Operation to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F70"><fo:external-graphic src="url(images/1300-operationcontextdecl1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context keyword is followed by the optionally qualified name of the operation to be complemented. Qualification is always required since the operation context may be specified as part of the document or a package declaration but not a classifier.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F7A"><fo:external-graphic src="url(images/1300-operationcontextdecl2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The name is followed by a parenthesized 

+						<fo:basic-link internal-destination="CompleteOCL-Parameter"><fo:inline color="blue" text-decoration="underline">parameter</fo:inline></fo:basic-link> list.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10F88"><fo:external-graphic src="url(images/1300-operationcontextdecl3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Finally an optional return 

+						<fo:basic-link internal-destination="EssentialOCL-TypeExp"><fo:inline color="blue" text-decoration="underline">type</fo:inline></fo:basic-link> and the operation constraints are specified. The operation constraints may comprise 

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N10F94"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F95"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:basic-link internal-destination="CompleteOCL-Body"><fo:inline color="blue" text-decoration="underline">Body</fo:inline></fo:basic-link> to define operation body

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10F9C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-Inv"><fo:inline color="blue" text-decoration="underline">Pre</fo:inline></fo:basic-link> to define a precondition on the operation

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N10FA3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="CompleteOCL-Inv"><fo:inline color="blue" text-decoration="underline">Post</fo:inline></fo:basic-link> to define a postcondition on the operation

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Any number of preconditions and postconditions can be specified. Only one body is permitted.</fo:block></fo:block><fo:block id="CompleteOCL-Parameter"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.9. Parameter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Parameter syntax identifies a Parameter of an Operation to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10FB4"><fo:external-graphic src="url(images/1300-parameter.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A parameter comprises an optional name and Essential OCL 

+						<fo:basic-link internal-destination="EssentialOCL-TypeExp"><fo:inline color="blue" text-decoration="underline">type</fo:inline></fo:basic-link> declaration.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The parameter name may be omitted for 

+						<fo:basic-link internal-destination="CompleteOCL-OperationContextDecl"><fo:inline color="blue" text-decoration="underline">Operation Contexts</fo:inline></fo:basic-link> if the parameter name is not used by any of the constraints.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The parameter name is required for 

+						<fo:basic-link internal-destination="CompleteOCL-Def"><fo:inline color="blue" text-decoration="underline">Operation Definitions</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the type declarations are Essential OCL types such as 

+						<fo:inline font-family="Inconsolata,Courier">Sequence&lt;String&gt;</fo:inline> rather than UML’s and OCLinEcore’s 

+						<fo:inline font-family="Inconsolata,Courier">String[*] {ordered !unique}</fo:inline>. There are plans to unify these syntaxes.

+					</fo:block></fo:block><fo:block id="CompleteOCL-Body"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.10. Body</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Body syntax defines the body for a complemented Operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10FDC"><fo:external-graphic src="url(images/1300-body.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The body keyword is followed by an optional name and the body 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional name is not used.</fo:block></fo:block><fo:block id="CompleteOCL-Post"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.11. Post</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Post syntax defines a postcondition for a complemented Operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N10FF2"><fo:external-graphic src="url(images/1300-post.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The post keyword is followed by an optional name and the postcondition 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional name may be used by a validation environment to identify a failing postcondition.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Indigo release parses and persists postconditions but does not evaluate them.</fo:block></fo:block><fo:block id="CompleteOCL-Pre"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.12. Pre</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pre syntax defines a precondition for a complemented Operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1100A"><fo:external-graphic src="url(images/1300-pre.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The pre keyword is followed by an optional name and the precondition 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The optional name may be used by a validation environment to identify a failing precondition.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Indigo release parses and persists preconditions but does not evaluate them.</fo:block></fo:block><fo:block id="CompleteOCL-PropertyContextDecl"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.13. PropertyContextDecl</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The PropertyContextDecl syntax identifies a Property to be complemented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11022"><fo:external-graphic src="url(images/1300-propertycontextdecl1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context keyword is followed by the optionally qualified name of the property to be complemented. Qualification is always required since the property context may be specified as part of the document or a package declaration but not a classifier.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1102C"><fo:external-graphic src="url(images/1300-propertycontextdecl2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Finally the property 

+						<fo:basic-link internal-destination="EssentialOCL-TypeExp"><fo:inline color="blue" text-decoration="underline">type</fo:inline></fo:basic-link> and the property constraints are specified. The property constraints may comprise 

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11038"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11039"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:basic-link internal-destination="CompleteOCL-Init"><fo:inline color="blue" text-decoration="underline">Init</fo:inline></fo:basic-link> to specify an initialization

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11040"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:basic-link internal-destination="CompleteOCL-Der"><fo:inline color="blue" text-decoration="underline">Der</fo:inline></fo:basic-link> to specify a derivation

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An initialization is specified to define the property value when the property is created.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A derivation is specified to define the property value at all times.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It does not therefore make sense to specify both an an initial and an all-time value. If both are specified the derivation is used.</fo:block></fo:block><fo:block id="CompleteOCL-Init"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.14. Init</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Init syntax defines an initial value for a complemented Property.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11055"><fo:external-graphic src="url(images/1300-init.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The init keyword and colon are followed by the initial value 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="CompleteOCL-Der"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.15. Der</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Der syntax defines a derived value for a complemented Property.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11069"><fo:external-graphic src="url(images/1300-der.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The der keyword and colon are followed by the derived value 

+						<fo:basic-link internal-destination="CompleteOCL-Specification"><fo:inline color="blue" text-decoration="underline">specification</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="CompleteOCL-Specification"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.16. Specification</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Specification syntax provides an OCL expression to specify some aspect of a complemented model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1107D"><fo:external-graphic src="url(images/1300-specification.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The specification comprises and 

+						<fo:basic-link internal-destination="EssentialOCL-Exp"><fo:inline color="blue" text-decoration="underline">Essential OCL Expression</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="CompleteOCL-NavigatingExp"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.17. NavigatingExp</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The NavigatingExp syntax defines enhancements to the 

+						<fo:basic-link internal-destination="EssentialOCL-NavigatingExp"><fo:inline color="blue" text-decoration="underline">Essential OCL NavigatingExp</fo:inline></fo:basic-link> syntax.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11095"><fo:external-graphic src="url(images/1300-navigatingexp.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The name of a model element may have a further @pre qualification for use within an operation postcondition. It allows the postcondition to access the value on entry to an operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1109F"><fo:external-graphic src="url(images/1300-navigatingarg.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">?</fo:inline> may be specified as the argument in a navigating expression to indicate unknown values when testing sent messages.

+					</fo:block></fo:block><fo:block id="CompleteOCL-NavigationOperators"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.18. NavigationOperators</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:basic-link internal-destination="EssentialOCL-NavigationOperators"><fo:inline color="blue" text-decoration="underline">Essential OCL NavigationOperators</fo:inline></fo:basic-link> are extended to support

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N110B4"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N110B5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">^</fo:inline> to test whether a message has been sent message

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N110BB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">^^</fo:inline> to reference the content of a message

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="CompleteOCL-UnreservedName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.19. UnreservedName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL reserved words are unchanged from Essential OCL, consequently a Complete OCL Unreserved name is the same as an 

+						<fo:basic-link internal-destination="EssentialOCL-UnreservedName"><fo:inline color="blue" text-decoration="underline">Essential OCL UnreservedName</fo:inline></fo:basic-link>.

+					</fo:block></fo:block><fo:block id="CompleteOCL-UnrestrictedName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.4.1.20. UnrestrictedName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL has two additional built-in types: 

+						<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">OclState</fo:inline>. These names and the 

+						<fo:basic-link internal-destination="EssentialOCL-UnrestrictedName"><fo:inline color="blue" text-decoration="underline">Essential OCL RestrictedNames</fo:inline></fo:basic-link> are not available without qualification or escaping. 

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="OCLstdlib"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Standard Library Language</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.5. The OCL Standard Library Language</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Standard Library Language is used to define the OCL Standard Library, for which *.oclstdlib is the default extension.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard library can be replaced or extended.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The source for the OCL Standard Library may be found at model/OCL-2.5.oclstdlib in the org.eclipse.ocl.pivot plugin. </fo:block><fo:block id="Syntax4"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax</fo:marker><fo:block font-size="14pt">2.5.1. Syntax</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="GrammarImplementation4"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.1. Grammar Implementation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The grammar used by the Xtext editors may be found at:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">/src/org/eclipse/ocl/examples/xtext/oclstdlib/OCLstdlib.xtext</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">in the org.eclipse.ocl.xtext.oclstdlib plugin. The OCL Standard Library grammar extends the Essential OCL grammar.</fo:block></fo:block><fo:block id="OCLstdlib-Library"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.2. OCL Standard Library Document</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Library syntax defines an OCL Standard Library document, for which *.oclstdlib is the default extension.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N110FB"><fo:external-graphic src="url(images/1400-library1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more library documents may be imported for use within the composite library whose name must be specified.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11105"><fo:external-graphic src="url(images/1400-library2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A namespace prefix and namespace URI may optionally be specified.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1110F"><fo:external-graphic src="url(images/1400-library3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The body of the document comprises</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11117"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11118"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional module declaration</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1111B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional specification of the OCL Standard libraries</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1111E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optional import of referenced Ecore or UML or OCLinEcore resources</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11121"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:basic-link internal-destination="OCLstdlib-Precedence"><fo:inline color="blue" text-decoration="underline">Precedences</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11128"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a hierarchy of 

+								<fo:basic-link internal-destination="OCLstdlib-Package"><fo:inline color="blue" text-decoration="underline">Packages</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1112F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a hierarchy of 

+								<fo:basic-link internal-destination="OCLstdlib-Classifier"><fo:inline color="blue" text-decoration="underline">Classifiers</fo:inline></fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11136"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Annotations</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1113B"><fo:external-graphic src="url(images/1400-library.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more external libraries may be imported so that their definitions are merged to form a composite library of basic and extended evaluation capability.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The default library may be extended by specifying it as the first library import.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11145"><fo:inline font-family="Inconsolata,Courier">library 'http://www.eclipse.org/ocl/3.1.0/OCL.oclstdlib'

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The namespace URI of the first library package defines the namespace URI of the composite library. The namespace URI of subsequent library imports may not conflict, but may be null.</fo:block></fo:block><fo:block id="OCLstdlib-Precedence"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.3. Precedence</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Precedence syntax defines the precedence and associativity of infix operators.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11155"><fo:external-graphic src="url(images/1400-precedence.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each entry in a list of precedences names a precedence level taht can then be used by an infix operator. Each level can be either left or right associative.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Multiple lists of precedence levels can be merged from imported libraries provided the lists are interleaveable with conflict or ambiguity.</fo:block></fo:block><fo:block id="OCLstdlib-Package"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.4. Package</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Package syntax defines a nested hierarchy of packages and classifiers .</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11167"><fo:external-graphic src="url(images/1400-package1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Package has a name and optionally a namespace prefix and namespace URI.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11171"><fo:external-graphic src="url(images/1400-package2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Package may comprise 

+						<fo:basic-link internal-destination="OCLstdlib-Package"><fo:inline color="blue" text-decoration="underline">Packages</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLstdlib-Classifier"><fo:inline color="blue" text-decoration="underline">Classifiers</fo:inline></fo:basic-link> and Annotations.

+					</fo:block></fo:block><fo:block id="OCLstdlib-Classifier"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.5. Class and Classifier</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Class and Classifier syntax define a type within a Package.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11189"><fo:external-graphic src="url(images/1400-classifier.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11191"><fo:external-graphic src="url(images/1400-class1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Class has a name and optionally template parameters. A class may also name the metatype such as 

+						<fo:inline font-family="Inconsolata,Courier">PrimitiveType</fo:inline> that the Class is an instance of.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1119E"><fo:external-graphic src="url(images/1400-class2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Class may extend one or more other Classes that may be specialized using the template parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111A8"><fo:external-graphic src="url(images/1400-class3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Class may comprise 

+						<fo:basic-link internal-destination="OCLstdlib-Operation"><fo:inline color="blue" text-decoration="underline">Operations</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLstdlib-Property"><fo:inline color="blue" text-decoration="underline">Properties</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLstdlib-Inv"><fo:inline color="blue" text-decoration="underline">Invariants</fo:inline></fo:basic-link> and Annotations.

+					</fo:block></fo:block><fo:block id="OCLstdlib-Inv"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.6. Inv</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Inv syntax defines an invariant constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111C4"><fo:external-graphic src="url(images/1400-inv.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Operation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.7. Operation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The general Operation syntax defines a conventional Operation or Iteration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111D2"><fo:external-graphic src="url(images/1400-operation.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-LibOperation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.8. LibOperation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The LibOperation syntax defines a conventional Operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111E0"><fo:external-graphic src="url(images/1400-operation1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation may be static and has a name and optionally template parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111EA"><fo:external-graphic src="url(images/1400-operation2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation has zero of more 

+						<fo:basic-link internal-destination="OCLstdlib-Parameter"><fo:inline color="blue" text-decoration="underline">Parameters</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N111F8"><fo:external-graphic src="url(images/1400-operation3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Operation has a return Type. An infix operation may specify a precedence level. An operation may specify the name of a Java class implementing the org.eclipse.ocl.pivot.library.LibraryOperation interface. This class is used when evaluating the operation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11202"><fo:external-graphic src="url(images/1400-operation4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Operation may comprise 

+						<fo:basic-link internal-destination="OCLstdlib-Pre"><fo:inline color="blue" text-decoration="underline">Preconditions</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLstdlib-Post"><fo:inline color="blue" text-decoration="underline">Postconditions</fo:inline></fo:basic-link> and Annotations.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">static</fo:inline> qualifier supports declaration of static library operations such as 

+						<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline> that are invoked on types rather than objects.

+					</fo:block></fo:block><fo:block id="OCLstdlib-LibIteration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.9. LibIteration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The LibIteration syntax defines an Iteration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11222"><fo:external-graphic src="url(images/1400-iteration1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Iteration has a name and optionally template parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1122C"><fo:external-graphic src="url(images/1400-iteration2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Iteration has one or more comma-separated 

+						<fo:basic-link internal-destination="OCLstdlib-Iterator"><fo:inline color="blue" text-decoration="underline">Iterators</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1123A"><fo:external-graphic src="url(images/1400-iteration3.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Optionally following a semicolon, an Iteration has one or more comma-separated 

+						<fo:basic-link internal-destination="OCLstdlib-Accumulator"><fo:inline color="blue" text-decoration="underline">Accumulators</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11248"><fo:external-graphic src="url(images/1400-iteration4.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Optionally following a bar, an Iteration has one or more comma-separated 

+						<fo:basic-link internal-destination="OCLstdlib-Parameter"><fo:inline color="blue" text-decoration="underline">Parameters</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11256"><fo:external-graphic src="url(images/1400-iteration5.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Iteration has a return Type. An Iteration may specify the name of a Java class implementing the org.eclipse.ocl.pivot.library.LibraryIteration interface. This class is used when evaluating the iteration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11260"><fo:external-graphic src="url(images/1400-iteration6.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of an Iteration may comprise 

+						<fo:basic-link internal-destination="OCLstdlib-Pre"><fo:inline color="blue" text-decoration="underline">Preconditions</fo:inline></fo:basic-link>, 

+						<fo:basic-link internal-destination="OCLstdlib-Post"><fo:inline color="blue" text-decoration="underline">Postconditions</fo:inline></fo:basic-link> and Annotations.

+					</fo:block></fo:block><fo:block id="OCLstdlib-Iterator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.10. Iterator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Iterator syntax defines an Iterator.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11278"><fo:external-graphic src="url(images/1400-iterator.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Accumulator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.11. Accumulator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Accumulator syntax defines an Accumulator.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11286"><fo:external-graphic src="url(images/1400-accumulator.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Parameter"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.12. Parameter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Parameter syntax defines a Parameter.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11294"><fo:external-graphic src="url(images/1400-parameter.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Pre"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.13. Pre</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pre syntax defines a precondition constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N112A2"><fo:external-graphic src="url(images/1400-pre.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Post"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.14. Post</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Post syntax defines a postcondition constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N112B0"><fo:external-graphic src="url(images/1400-post.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLstdlib-Property"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.15. LibProperty</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The LibProperty syntax defines an Property.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N112BE"><fo:external-graphic src="url(images/1400-property1.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An Property may be static and has a name and a Type.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N112C8"><fo:external-graphic src="url(images/1400-property2.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Property may specify the name of a Java class implementing the org.eclipse.ocl.pivot.library.LibraryProperty interface. This class is used when evaluating the iteration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Property may comprise Annotations.</fo:block></fo:block><fo:block id="OCLstdlib-Specification"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.5.1.16. Specification</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Specification syntax integrates an OCL Expression as the specification of a constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N112DA"><fo:external-graphic src="url(images/1400-specification.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="Editors"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editors</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.6. Editors</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The four editors are all generated using 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../../org.eclipse.xtext.doc/contents/xtext.html)">Xtext</fo:basic-link>, and so exhibit similar behavior to  other Eclipse editors.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard facilities are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N112EC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112ED"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>syntax coloring</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112F0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>folding</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112F3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>outline view</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112F6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>hover text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112F9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>syntax validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N112FC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>semantic validation</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following facilities have partial functionality</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11301"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11302"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>go to definition</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11305"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>content assist</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11308"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>templates</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1130B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>quick fixes</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1130E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>find references</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following facilities have little or no functionality</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11313"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11314"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>rename element</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11317"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>final validation</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="Syntaxcoloring"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax coloring</fo:marker><fo:block font-size="14pt">2.6.1. Syntax coloring</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The editors use similar colors to JDT.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11320"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11321"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>green for comments</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11324"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>bold purple for keywords</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11327"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>grey for numbers</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1132A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>blue for strings</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Additionally</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1132F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11330"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>italics for text referencing a definition</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">References for which the name of the definition matches a keyword use italics in the same way as other cross references. Names of a definition matching a keyword use bold purple in the same way as keywords.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The syntax coloring may be changed using the 

+					<fo:inline font-weight="bold">Window-&gt;Preferences-&gt;OCL</fo:inline> pages.

+				</fo:block></fo:block><fo:block id="Validation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validation</fo:marker><fo:block font-size="14pt">2.6.2. Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Syntax errors are detected and offending text is underlined with accompanying annotations and problem markers.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If there are no syntax errors, semantic validation is performed with similar feedback of problems. Semantic validation is not performed when there are syntax errors since a single syntax error may provoke many hundreds of semantic errors. These can make the original syntax error difficult to resolve.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of the well-formedness rules for a final validation of the Abstract Syntax is only partially implemented,

+					since correction of the OCL in the OMG specifiucation is still work in progress.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default, the Xtext nature is not added to projects using OCL editors and so no builder runs in the background creating problem markers for OCL files. This is generally beneficial when you have many files for which the over-enthusiastic rebuilds waste build time, or experimental files for which the many errors clutter the Problem View. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If your OCL is good quality, you may activate the Xtext nature and builder by selecting the project and then invoking 

+					<fo:inline font-weight="bold">Configure-&gt;Add Xtext Nature</fo:inline>.

+				</fo:block></fo:block><fo:block id="HoverText"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Hover Text</fo:marker><fo:block font-size="14pt">2.6.3. Hover Text</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Hover text has been implemented to provide feedback on the usage and type of expression terms. For instance hovering over the size operation in the example below reveals that it is an Operation for the Loan specialization of Collection . </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N11355"><fo:external-graphic src="url(images/1510-hovertext.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(Note that the Class specialization for Loan is incorrectly shown again as an Operation specialization.)</fo:block></fo:block><fo:block id="ContentAssist"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Content Assist</fo:marker><fo:block font-size="14pt">2.6.4. Content Assist</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Typing 

+					<fo:inline font-weight="bold">Ctrl</fo:inline> and 

+					<fo:inline font-weight="bold">Space</fo:inline> activates the Content Assist pop-up to offer suggestions as to what might be typed to the right of the cursor.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1136D"><fo:external-graphic src="url(images/1510-contentassist.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block></fo:block><fo:block id="CodeTemplates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Code Templates</fo:marker><fo:block font-size="14pt">2.6.5. Code Templates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Code templates are provided for many of the major constructs and some expression elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may define your own templates. If you would like to contribute them, please raise a Bugzilla.</fo:block></fo:block><fo:block id="OpenDeclaration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Open Declaration</fo:marker><fo:block font-size="14pt">2.6.6. Open Declaration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is possible to navigate to a definition provided an editor is already open for the definition. </fo:block></fo:block></fo:block><fo:block id="NatureAndBuilder"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Nature and Builder Auto-Validation</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.7. OCL Nature and Builder Auto-Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The build of an OCL or OCL-containing source file validates the ource file and updates markers in the Problems View to identify issues that the user may care to address. Double-clicking on the Problems View Marker opens an

+				editor to faciltate fixing the problem.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The build validation occurs whenever a source file changes or is ‘cleaned’ and when the containing project

+				has the OCL nature configured.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the Eclipse Workspace is configured to auto-build, the OCL builder runs automatically and so auto-validation occurs.</fo:block><fo:block id="OCLbuilderConfiguration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Configuring the OCL Nature and Builder</fo:marker><fo:block font-size="14pt">2.7.1. Configuring the OCL Nature and Builder</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Nature may be added or removed from a Project by selecting the project in an Explorer View and

+					invoking 

+					<fo:inline font-weight="bold">Configure-&gt;Convert to OCL Project</fo:inline> or 

+					<fo:inline font-weight="bold">Configure-&gt;Unconfigure OCL</fo:inline> from the context menu. Alternatively

+					the new Project Natures page may be used from the Project Properties page.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Configuing the OCL nature modifies the 

+					<fo:inline font-weight="bold">.project</fo:inline> file to add the 

+					<fo:inline font-weight="bold">org.eclipse.ocl.pivot.ui.oclnature</fo:inline> nature

+					and 

+					<fo:inline font-weight="bold">org.eclipse.ocl.pivot.ui.oclbuilder</fo:inline>. The builder has an argument dictionaries to select file extensions

+					and file paths that are included or excluded by the builder.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N113A7"><fo:inline font-family="Inconsolata,Courier">&lt;arguments&gt;

+	&lt;dictionary&gt;

+		&lt;key&gt;disabledExtensions&lt;/key&gt;

+		&lt;value&gt;*,essentialocl&lt;/value&gt;

+	&lt;/dictionary&gt;

+	&lt;dictionary&gt;

+		&lt;key&gt;disabledPaths&lt;/key&gt;

+		&lt;value&gt;bin/**,target/**&lt;/value&gt;

+	&lt;/dictionary&gt;

+	&lt;dictionary&gt;

+		&lt;key&gt;enabledExtensions&lt;/key&gt;

+		&lt;value&gt;ecore,ocl,oclinecore,oclstdlib,uml&lt;/value&gt;

+	&lt;/dictionary&gt;

+	&lt;dictionary&gt;

+		&lt;key&gt;enabledPaths&lt;/key&gt;

+		&lt;value&gt;**&lt;/value&gt;

+	&lt;/dictionary&gt;

+&lt;/arguments&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The default configuration enables validation of 

+					<fo:inline font-weight="bold">ecore,ocl,oclinecore,oclstdlib,uml</fo:inline> extensions and disables all other extensions, redundantly adding an explicit 

+					<fo:inline font-weight="bold">essentialocl</fo:inline> exclusion to make the syntax more obvious to a

+					casual reader. (*.essentialocl files may contain a single OCL expression, but since they lack any embedding within a model, they are not generally useful.)

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The default configuration enables all paths except the 

+					<fo:inline font-weight="bold">bin</fo:inline> and 

+					<fo:inline font-weight="bold">target</fo:inline> paths where the Java builder or Maven builders may place copies of files that are not usually worth revalidating as distinct files.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The configuration in the 

+					<fo:inline font-weight="bold">.project</fo:inline> file may be edited with a text editor; there is currently no dedicated user interface.

+				</fo:block></fo:block><fo:block id="EcoreAndUMLautoValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Ecore and UML Auto-Validation</fo:marker><fo:block font-size="14pt">2.7.2. Ecore and UML Auto-Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EMF and UML projects provide no nature or builder and so Problems View markers for *.ecore and *.uml files

+					are dependent on the problems in the prevailing selection at the time of the preceding manual validation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since OCL may be embedded with *.ecore or *.uml files, the OCL nature and builder provide the option to auto-validate these files.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default, your project has no OCL nature so no Ecore or UML auto-validation occurs.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you choose to add the OCL nature, the default settings that enable *.ecore and *.uml auto-validation apply. The Problems View markers resulting from auto-validation are updated after a file is saved; any markers that the Ecore or UML editors created are replaced.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you find that the auto-validation of some *.ecore and *.uml causes problems, perhaps because the reported

+					errors are not a concern for your usage, you may edit the 

+					<fo:inline font-weight="bold">.project</fo:inline> file configuration.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may remove 

+					<fo:inline font-weight="bold">ecore</fo:inline> and/or 

+					<fo:inline font-weight="bold">uml</fo:inline> from the 

+					<fo:inline font-weight="bold">enabledExtensions</fo:inline> to suppress Ecore and/or UML auto-validation completely.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may add individual files or file patterns to the 

+					<fo:inline font-weight="bold">disabledPaths</fo:inline> to be more selective about disabling

+					auto-validation.

+				</fo:block></fo:block><fo:block id="NoNature"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Building on pre-Photon / 2018 releases</fo:marker><fo:block font-size="14pt">2.7.3. Building on pre-Photon / 2018 releases</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL builder and nature are new in the Eclipse OCL 2018 release (Photon). They comply with the standard Eclipse idiom.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In earlier releases, the EMF idiom was followed whereby Problems View markers were created by their save action

+					of an appropriate editor. Problems in files that had not been saved were often not visible and so diagnosis

+					only occurred when some consuming application complained..</fo:block></fo:block></fo:block><fo:block id="InteractiveOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Console</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.8. Console</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There are two interactive OCL consoles that enable OCL expressions to be evaluated on a model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic 

+				<fo:inline font-weight="bold">Interactive Console</fo:inline> may be created by invoking 

+				<fo:inline font-weight="bold">OCL-&gt;Show OCL Console</fo:inline> from the right button menu of some model editors such as the 

+				<fo:inline font-weight="bold">Sample Ecore Model Editor</fo:inline>. Alternatively the 

+				<fo:inline font-weight="bold">Console</fo:inline> view may be created by 

+				<fo:inline font-weight="bold">Window-&gt;Show View-&gt;Console</fo:inline> followed by selecting 

+				<fo:inline font-weight="bold">Interactive OCL</fo:inline> from the 

+				<fo:inline font-weight="bold">Open Console</fo:inline> pull-down in the 

+				<fo:inline font-weight="bold">Console</fo:inline> View tool bar. See the 

+				<fo:basic-link internal-destination="OCLinEcoreTutorial-Console"><fo:inline color="blue" text-decoration="underline">OCLinEcore Tutorial</fo:inline></fo:basic-link> for detailed step-by-step pictures.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot 

+				<fo:inline font-weight="bold">Interactive Xtext Console</fo:inline> may be similarly created by 

+				<fo:inline font-weight="bold">OCL-&gt;Show Xtext OCL Console</fo:inline> from the menu or 

+				<fo:inline font-weight="bold">Interactive Xtext OCL</fo:inline> from the pull-down.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The two consoles should exhibit similar behaviors, however not all facilities of the classic console have yet been reproduced on the new.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N11433"><fo:external-graphic src="url(images/1520-console.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Console, shown in the bottom half of the figure, comprises a combined Title and Tool Bar, Results Panel and Entry Panel.</fo:block><fo:block id="ContextObjectSelection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Context Object Selection</fo:marker><fo:block font-size="14pt">2.8.1. Context Object Selection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Expressions are evaluated with respect to a context object 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> that has a corresponding metamodel type. This object is defined by selecting any widget whose implementation is adaptable to an EObject. Therefore selecting an EAttribute in the Sample Ecore Editor will make the selected EAttribute 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and EAttribute the metamodel type. In the figure selecting the Member named m1 in the Sample Reflective Ecore Model Editor has made Member the select type of 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and m1 the selected context object. For the Pivot Console there is additional support to use selections from the Outline of an Xtext editor or Variables View of the OCL Debugger as the context object.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot Console displays the selected object and type in the Console title.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Console relies on the platform selection mechanism to show the selected object in the overall Eclipse Status display at the bottom left of the workspace window. This display may be lost when the selection is changed to a non-EObject selection.</fo:block></fo:block><fo:block id="Editing2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editing</fo:marker><fo:block font-size="14pt">2.8.2. Editing</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bottom panel supports entry and evaluation of a multi-line expression. The expression is evaluated when 

+					<fo:inline font-weight="bold">Enter</fo:inline> is entered.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Console has hand-coded syntax highlighting and context assist that may be activated by typing 

+					<fo:inline font-weight="bold">Ctrl</fo:inline> + 

+					<fo:inline font-weight="bold">Space</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot Console uses the Xtext EssentialOCL editor and largely auto-generated syntax highlighting, error indications, hover text, quick fixes and context assist that may be activated by typing 

+					<fo:inline font-weight="bold">Ctrl</fo:inline> + 

+					<fo:inline font-weight="bold">Space</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content assist for the Pivot Console has not yet been customized, so the classic Console content assist is probably more comprehensive, however the Pivot Console shares the same library definitions as the other editors and so is more consistent.</fo:block></fo:block><fo:block id="EditorKeys"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editor Keys</fo:marker><fo:block font-size="14pt">2.8.3. Editor Keys</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">Page-Up</fo:inline> and 

+					<fo:inline font-weight="bold">Page-Down</fo:inline> keys may be used to scroll through the history of input commands enabling previous commands to be re-used. Use of the Page keys is necessary since the input is potentially multi-line and so 

+					<fo:inline font-weight="bold">Up</fo:inline> and 

+					<fo:inline font-weight="bold">Down</fo:inline> navigate over the multiple lines.

+				</fo:block></fo:block><fo:block id="Results"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Results</fo:marker><fo:block font-size="14pt">2.8.4. Results</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The larger middle panel displays the results of each evaluation in a scrolling window.</fo:block></fo:block><fo:block id="ToolBar"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Tool Bar</fo:marker><fo:block font-size="14pt">2.8.5. Tool Bar</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="EcoreUMLbinding"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.1. Ecore/UML binding</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Console provides a selection to determine whether the context object has a type defined by an Ecore or UML metamodel. This selection is not required for the Pivot Console which automatically converts Ecore or UML models to Pivot models.</fo:block></fo:block><fo:block id="M1M2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.2. M1/M2</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Console provides a selection to determine whether the selected metamodel binding is that for objects (M2) or types (M1). This selection is not needed for the Pivot Console since the Pivot metamodel is an instance of itself.</fo:block></fo:block><fo:block id="ClearConsole"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.3. Clear Console</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard clear console functionality clears the results pane.</fo:block></fo:block><fo:block id="CloseConsole"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.4. Close Console</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard close console functionality closes the current console.</fo:block></fo:block><fo:block id="Debug"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.5. Debug</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Starts the 

+						<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">OCL Debugger</fo:inline></fo:basic-link> using the current mouse selection as self and the text in the Console input as the exopression to execute.

+					</fo:block></fo:block><fo:block id="LoadSaveanexpression"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.8.5.6. Load/Save an expression</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Console provides an ability to save and reload edited expressions as XMI files. The XMI is a pragmatic Eclipse Ecore realisation of the OCL specification for which XMI interchange is not realisable.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot Console provides a similar ability to save and reload edited expressions as XMI files. The XMI is a prototype that might evolve and be adopted by a future version of the OCL specification. 

+						<fo:inline font-style="italic">This functionality has not been properly tested.</fo:inline>

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="ValidityView"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validity View (new in Luna)</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.9. Validity View (new in Luna)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard EMF validation capabilities provide a useful overview of problems:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N114C2"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N114C3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>as markers in the source model,</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N114C6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>as markers in the Problems View,</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N114C9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>in Pop-up dialogs.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:inline font-weight="bold">Validity View</fo:inline> provides a much more detailed view of the problems and so assists in debugging bad models and/or bad constaints.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:inline font-weight="bold">Validity View</fo:inline> may be shown by invoking 

+				<fo:inline font-weight="bold">OCL-&gt;Show Validity View</fo:inline> from the right button menu of some model editors such as the 

+				<fo:inline font-weight="bold">Sample Ecore Model Editor</fo:inline>. Alternatively the 

+				<fo:inline font-weight="bold">Validity View</fo:inline> view may be created by 

+				<fo:inline font-weight="bold">Window-&gt;Show View-&gt;Other... OCL-&gt;Validity View</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N114EA"><fo:external-graphic src="url(images/1530-validity-view.png)" width="auto" height="auto" content-width="55.00000000000001%" content-height="55.00000000000001%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The left-hand pane titled Model Elements provides a tree view of the Resources in a ResourceSet in a similar fashion to the Sample Ecore Editor. However an additional child element (in blue italics) is added for each constraint applicable to its parent element. Checkboxes enable or disable the element from re-validations and JUnit-like status icons show the status of the most recent validation. Hovertext provides further detail.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The right-hand pane titled Metamodel Constraints provides a tree view of the model hierarchies that contribute constraints. An additional child element is added for each model element to which the constraint applies.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The displays track the mouse selection in other views. Whenever the mouse selection can be resolved to an EObject, that EObject’s ResourceSet populates the left hand pane and constraints affecting the left hand pane populate the right hand pane. Tracking the mouse selection is quite expensive, and probably irritating. It can be inhibited by pinning the view to the current selection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is generally much too much detail if all elements and constraints are considered and so the view provides many facilities to facilitate focusing on the interesting combinations.</fo:block><fo:block id="ValidityViewToolBar"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">View Tool Bar</fo:marker><fo:block font-size="14pt">2.9.1. View Tool Bar</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The View Tool Bar is at the top and right of the view following the Validity View title. It provides facilities common to both Model Elements and Metamodel Constraints.</fo:block><fo:block id="ExpandAll"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.1. Expand All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The plus icon causes the Model Elements and Metamodel Constraints to be fully expanded to display all their contents. Beware that for large models this may result in slow screen updates. </fo:block></fo:block><fo:block id="CollapseAll"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.2. Collapse All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minus icon causes the Model Elements and Metamodel Constraints to collapse to display only their top level elements. </fo:block></fo:block><fo:block id="Pin"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.3. Pin</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The pin icon toggles the track current cursor selection. When unpinned, the default, any change in mouse selection may cause recomputation of Model Elements and Metamodel Constraints contents. When pinned the contents are stable.</fo:block></fo:block><fo:block id="Refresh"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.4. Refresh</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The double arrow icon causes the Model Elements and Metamodel Constraints to be recomputed. This may be necessary for a metamodel change to be used.</fo:block></fo:block><fo:block id="Run"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.5. Run</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The white triangle in green circle icon runs a validation on all enabled model element/constraint combinations updating the status indications for constraints in the left hand Model Element and model elements in right hand Constraint pane.</fo:block></fo:block><fo:block id="Filter"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.6. Filter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Filtering menu hides unwanted contributions to the display. Each of the validation result statuses can be individually enabled.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11522"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11523"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Show all errors</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11526"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Show all infos</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11529"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Show all failures</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1152C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Show all warnings</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1152F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Show all successes</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default none of the selections are enabled so everything is shown. As soon as a specific status is enabled all display elements with other non-enabled statuses are hidden. Thus selecting just *Show all warnings" hides error/info/failure/success results.</fo:block></fo:block><fo:block id="Save"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.1.7. Save</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The floppy disk icon supports export of the validation results.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The available export formats are extensible through the org.eclipse.ocl.examples.emf.validation.validity.validity_exporter extension point.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The default exporters support</fo:block><fo:block id="html"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">html</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An HTML file summarising the results.</fo:block></fo:block><fo:block id="model"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An XMI model conforming to validity.ecore containing all results with references to the model elements and constraints.</fo:block></fo:block><fo:block id="text"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">text</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A text file summarising the results.</fo:block></fo:block></fo:block></fo:block><fo:block id="ValidityViewModelElementsPane"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Model Elements Pane</fo:marker><fo:block font-size="14pt">2.9.2. Model Elements Pane</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Model Elements Pane is the left hand pane of the Validity View. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It comprises a title and tool bar, text filter and scrollable tree of model elements and their constraints.</fo:block><fo:block id="ValidityViewModelElementsToolBar"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.2.1. Model Elements Tool Bar</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Model Elements Tool Bar is at the top and right of the left hand pane following the Model Elements title. It provides facilities specific to the Model Elements.</fo:block><fo:block id="ExpandAll2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Expand All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The plus icon causes the Model Elements to be fully expanded to display all their contents. Beware that for large models this may result in slow screen updates. </fo:block></fo:block><fo:block id="CollapseAll2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Collapse All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minus icon causes the Model Elements to collapse to display only their top level elements. </fo:block></fo:block><fo:block id="EnableAll"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Enable All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The tick icon causes all Model Elements to be enabled and so included in the next validation.</fo:block></fo:block><fo:block id="DisableAll"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Disable All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The no-tick icon causes all Model Elements to be disabled and so excluded from the next validation.</fo:block></fo:block><fo:block id="ShowHidedisabled"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Show/Hide disabled </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The document icon with a query controls whether disabled Model Element selections are visible. A diagonal strikethrough shows when selections are hidden.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default disabled selections are hidden, which allows the unwanted root elements of large models to be unchecked and so hidden before a slow attempt is made to display them.</fo:block></fo:block></fo:block><fo:block id="TextFilter"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.2.2. Text Filter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The text filter takes a StringMatcher pattern that selects which elements are visible. The pattern may contain</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11584"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11585"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a * to match zero or more characters</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11588"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a ? to match exactly one character</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1158B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a \ to escape the following character</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="ModelElementstree"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.2.3. Model Elements tree</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The scrollable tree shows the containment hierarchy of all elements in the ResourceSet containing the model element identified by the mouse selection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The +/- collapse/expand icons preceding each element enable interesting elements to be shown and others folded away.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each element is preceded by a check box that enables its usage within the next validation run. All elements may be enabled or disabled using the icons in the Model Elements Tool Bar. Enabling/disabling individual elements enables/disables the element’s descendants and propagates a partial enable/disable to the element’s ancestors.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The checkbox is followed by a validation status icon.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1159A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1159B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>tick for validation successful</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1159E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>red cross for validation unsuccessful but incomplete</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N115A1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>blue cross for validation failure (incomplete)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N115A4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>amber warning for a validation warning</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N115A7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>question mark for no validation performed</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The status icon is followed by an element-specific icon identifying its type and label.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double-clicking a leaf Constraint in the left-hand pane makes the corresponding constraint and parent model-element visible in the right-hand pane.</fo:block></fo:block><fo:block id="ModelElementsContextMenu"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.2.4. Model Elements Context Menu</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context menu in the model elements tree offers the following facilities in addition to those also available in the toolbar.</fo:block><fo:block id="ValidateSelection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Validate Selection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Revalidates all constraints applicable to the selected Model Element and its children.</fo:block></fo:block><fo:block id="DebugSingleEnabledSelection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Debug Single Enabled Selection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Launches the debugger for the selected Model Element and associated Constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The entry is greyed out if more than one Constraint is selected, so the invocation should normally be made from a leaf Constraint result.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							<fo:inline font-style="italic">Debug launching is only available for OCL constraints in Luna SR0.</fo:inline>

+						</fo:block></fo:block><fo:block id="ShowinEditor"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Show in Editor</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Opens an editor for the selected Model Element or Metamodel Constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							<fo:inline font-style="italic">Opening is not available for all forms of constraint in Luna SR0.</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block><fo:block id="ValidityViewMetamodelConstraintsPane"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Metamodel Constraints Pane</fo:marker><fo:block font-size="14pt">2.9.3. Metamodel Constraints Pane</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Metamodel Constraints Pane is the right hand pane of the Validity View. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It comprises a title and tool bar, text filter and scrollable tree of metamodel constraints and the model elements to which they apply.</fo:block><fo:block id="ValidityViewMetamodelConstraintsToolBar"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.3.1. Metamodel Constraints Tool Bar</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Metamodel Constraints Tool Bar is at the top and right of the right hand pane following the Metamodel Constraints title. It provides facilities specific to the Metamodel Constraints.</fo:block><fo:block id="ExpandAll3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Expand All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The plus icon causes the Metamodel Constraints to be fully expanded to display all their contents. Beware that for large models this may result in slow screen updates. </fo:block></fo:block><fo:block id="CollapseAll3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Collapse All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minus icon causes the Metamodel Constraints to collapse to display only their top level elements. </fo:block></fo:block><fo:block id="EnableAll2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Enable All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The tick icon causes all Metamodel Constraints to be enabled and so included in the next validation.</fo:block></fo:block><fo:block id="DisableAll2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Disable All</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The no-tick icon causes all Metamodel Constraints to be disabled and so excluded from the next validation.</fo:block></fo:block><fo:block id="ShowHidedisabled2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Show/Hide disabled </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The document icon with a query controls whether disabled Metamodel Constraints selections are visible. A diagonal strikethrough shows when selections are hidden.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default disabled selections are hidden, which allows the unwanted root elements of large metamodels to be unchecked and so hidden before a slow attempt is made to display them. </fo:block></fo:block></fo:block><fo:block id="TextFilter2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.3.2. Text Filter</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The text filter takes a StringMatcher pattern that selects which elements are visible. The pattern may contain</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11608"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11609"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a * to match zero or more characters</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1160C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a ? to match exactly one character</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1160F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a \ to escape the following character</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="MetamodelConstraintstree"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.3.3. Metamodel Constraints tree</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The scrollable tree shows the containment hierarchy of all constraints applicable to model elements in the ResourceSet containing the model element identified by the mouse selection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The +/- collapse/expand icons preceding each element enable interesting elements to be shown and others folded away.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each element is preceded by a check box that enables its usage within the next validation run. All elements may be enabled or disabled using the icons in the Model Elements Tool Bar. Enabling/disabling individual elements enables/disables the element’s descendants and propagates a partial enable/disable to the element’s ancestors.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The checkbox is followed by a validation status icon.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1161E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1161F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>tick for validation successful</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11622"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>red cross for validation unsuccessful but incomplete</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11625"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>blue cross for validation failure (incomplete)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11628"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>amber warning for a validation warning</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1162B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>question mark for no validation performed</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The status icon is followed by an element-specific icon identifying its type and label.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double-clicking a leaf Model Element in the right-hand pane makes the corresponding Model Element and parent Metamodel Constraint visible in the left-hand pane.</fo:block></fo:block><fo:block id="MetamodelConstraintsContextMenu"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.3.4. Metamodel Constraints Context Menu</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context menu in the metamodel constraints tree offers the following facilities in addition to those also available in the toolbar.</fo:block><fo:block id="ValidateSelection2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Validate Selection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Revalidates all model elements applicable to the selected constraint and its children.</fo:block></fo:block><fo:block id="DebugSingleEnabledSelection2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Debug Single Enabled Selection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Launches the debugger for the selected Model Element and associated Constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The entry is greyed out if more than one Constraint is selected, so the invocation should normally be made from a leaf Model Element result.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							<fo:inline font-style="italic">Debug launching is only available for OCL constraints in Luna SR0.</fo:inline>

+						</fo:block></fo:block><fo:block id="ShowinEditor2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Show in Editor</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Opens an editor for the selected Model Element or Metamodel Constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							<fo:inline font-style="italic">Opening is not available for all forms of constraint in Luna SR0.</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block><fo:block id="ConstraintLocators"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Constraint Locators</fo:marker><fo:block font-size="14pt">2.9.4. Constraint Locators</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The constraints displayed in the right hand pane are located by constraint locators that are registered with the org.eclipse.ocl.examples.emf.validation.validity.constraint_locator extension point. A constraint locator implements org.eclipse.ocl.examples.emf.validation.validity.locator.ConstraintLocator or the org.eclipse.ocl.examples.emf.validation.validity.ui.locator.ConstraintUILocator to define location, presentation, execution and debug launching of a particular kind of constraint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Constraint locators are associated with metamodel namespaces which are determined by the nsURI of the EPackage that contains the EClass of a Model Element EObject. Constraint locators may be registered for a particular metamodel namespace or for no namespace. Those registered for no namespace are activated whenever a namespace is encountered for which no specific constraint locators are registered.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following Constraint Locators are available by default.</fo:block><fo:block id="org.eclipse.ocl.examples.emf.validation.validity.locator.EClassConstraintLocator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.4.1. org.eclipse.ocl.examples.emf.validation.validity.locator.EClassConstraintLocator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This constraint locator supports discovery of constraints realized by invariant EOperations in the Java code generated by an EMF genmodel.</fo:block></fo:block><fo:block id="org.eclipse.ocl.examples.emf.validation.validity.locator.EValidatorConstraintLocator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.4.2. org.eclipse.ocl.examples.emf.validation.validity.locator.EValidatorConstraintLocator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This constraint locator supports reflective discovery of validateXXXX methods in the Java code generated by an EMF genmodel using the EValidatorRegistry to identify the relevant Java code.</fo:block></fo:block><fo:block id="org.eclipse.ocl.examples.validity.locator.DelegateUIConstraintLocator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.4.3. org.eclipse.ocl.examples.validity.locator.DelegateUIConstraintLocator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This constraint locator supports OCL constraints represented as EAnnotations in Ecore metamodels.</fo:block></fo:block><fo:block id="org.eclipse.ocl.examples.validity.locator.PivotUIConstraintLocator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.4.4. org.eclipse.ocl.examples.validity.locator.PivotUIConstraintLocator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This constraint locator supports discovery of org.eclipse.ocl.pivot.Constraint classes in Pivot metamodels.</fo:block></fo:block><fo:block id="org.eclipse.ocl.examples.validity.locator.UMLUIConstraintLocator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.9.4.5. org.eclipse.ocl.examples.validity.locator.UMLUIConstraintLocator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This constraint locator supports discovery of org.eclipse.uml2.uml.Constraint classes in UML metamodels.</fo:block></fo:block></fo:block></fo:block><fo:block id="Debugger"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Debugger (new in Luna)</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.10. Debugger (new in Luna)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL debugger supports debugging OCL constraints. It is a customization of the standard Eclipse debugger and so most of the facilities should be familiar to users of the Eclipse Java debugger.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N11689"><fo:external-graphic src="url(images/1540-debugger-image.png)" width="auto" height="auto" content-width="45%" content-height="45%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The screenshot shows</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11691"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11692"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Debug Stack Trace showing the context of nested evaluation environments </fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11695"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Variables View showing intermediate and local variables</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11698"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Editor showing input and context after a couple of steps</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1169B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Outline showing the Concrete Syntax Tree context</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-style="italic">The OCL Debugger is very new, there are no doubt many opportunities for ergonomic improvements and bug fixes. Please raise a 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://bugs.eclipse.org/bugs/enter_bug.cgi?product=MDT.OCL)">Bugzilla</fo:basic-link> .

+				</fo:inline>

+			</fo:block><fo:block id="Launching"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Launching</fo:marker><fo:block font-size="14pt">2.10.1. Launching</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Launching the debugger for an OCL constraint requires the user to provide two pieces of information</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N116AE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N116AF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the expression or constraint to evaluate</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N116B2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the self object upon which to operate</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These may be provided in a variety of ways</fo:block><fo:block id="Selectedmodelobjectandmanuallyenteredexpression"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.1.1. Selected model object and manually entered expression</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An arbitrary OCL expression may be entered in the Xtext OCL Console and evaluated on a model object selected using a mouse selection. The Debugger is invoked from the debug icon on the Console Tool Bar.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N116BF"><fo:external-graphic src="url(images/1540-debugger-console-launch.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Clicking the debug icon creates a dummy Complete OCL file and then launches the debugger. The expression is encapsulated as an oclDebugExpression operation extension to the type of the selected object. The file provides the source for source level debugging. The console may be re-used while debugging.</fo:block></fo:block><fo:block id="Selectedmodelobjectconstraintcombination"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.1.2. Selected model object/constraint combination</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Validity View provides fine-grained display of the evaluation of each constraint applicable to a model element and vice-versa. One of these model element/constraint combinations may be selected and the debugger launched using 

+						<fo:inline font-weight="bold">Debug Single Enabled Selection</fo:inline> to investigate why validation is producing unexpected results.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N116D3"><fo:external-graphic src="url(images/1540-debugger-validity-view-launch.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block></fo:block><fo:block id="Selectedmodelobjectandselectedconstraint"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.1.3. Selected model object and selected constraint</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OCL Expression launch configuration may be created to select a model element and a constraint for execution or debugging.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The launch configuration may be created using 

+						<fo:inline font-weight="bold">Run-&gt;Run Configurations...</fo:inline> or 

+						<fo:inline font-weight="bold">Debug-&gt;Debug Configurations...</fo:inline> from the Eclipse Menu Bar. This requires both Model Element and Constraint to be selected separately.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N116EB"><fo:external-graphic src="url(images/1540-debugger-run-configuration-launch.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Alternatively the context menu in model editors offers an 

+						<fo:inline font-weight="bold">OCL-&gt;Debug...</fo:inline> option that creates a Debug Configuration in which the Model Element is pre-selected from the invoking context.

+					</fo:block></fo:block></fo:block><fo:block id="Stepping"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Stepping</fo:marker><fo:block font-size="14pt">2.10.2. Stepping</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL expressions can be very compact and generally occur embedded in a larger application. The debugger is therefore optimized for this usage.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Rather than the line-based stepping typical of the Java debugger, the OCL debugger supports term by term stepping, highlighting the next term to be evaluated and showing the intermediate results as $-prefixed names in the Variables View. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL debugger interpretation of the Step functionalities is adjusted to facilitate stepping to many points in a complex expression without needing to reformat the source with line breaks..</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">Example Debugger View</fo:inline></fo:basic-link> shows the imminent execution of “.size()” after stepping into “self” and “.name”.

+				</fo:block><fo:block id="StepInto"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.2.1. Step Into</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A single OCL AST node is executed. The results can be inspected as inputs of a subsequent AST node.</fo:block></fo:block><fo:block id="StepOver"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.2.2. Step Over</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Execution proceeds until the next OCL AST node is associated with a new source line number.</fo:block></fo:block><fo:block id="StepReturn"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.2.3. Step Return</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Execution proceeds until the next OCL AST node is associated with a reduced stack depth. Iterations introduce nested stack entries so step return can step out of an iteration. let expressions and nested OCL calls also introduce additional stack nesting.</fo:block></fo:block><fo:block id="Resume"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.10.2.4. Resume</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Execution proceeds until the next breakpoint.</fo:block></fo:block></fo:block><fo:block id="VariablesView"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Variables View</fo:marker><fo:block font-size="14pt">2.10.3. Variables View</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Variables View enables the local variables and intermediate results to be examined using OCL syntaxes such as single quotes for Strings.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">Example Debugger View</fo:inline></fo:basic-link> shows the “self” variable, which is an “ecore::Package” instance, opened to show its fields, amongst which the name is ‘tutorial’.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Intermediate variables are named using the property name of the subsequent AST node’s input. Thus “$source” shows the OperationCallExp.source input already computed as “self.name”. Multiple inputs are diasmbiguated by suffixing as in “$argument[0]”.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">“$pc” identifies the next instruction, which can be examined in just the same way as any other variable.</fo:block></fo:block><fo:block id="BreakpointsView"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Breakpoints View</fo:marker><fo:block font-size="14pt">2.10.4. Breakpoints View</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Line breakpoints can be set in the Complete OCL editor and examined in the Breakpoints View. Execution stops when an OCL AST node has been executed that is associated with the line of a breakpoint.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-style="italic">No filtering facilities are yet available.</fo:inline>

+				</fo:block></fo:block><fo:block id="OutlineView"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Outline View</fo:marker><fo:block font-size="14pt">2.10.5. Outline View</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Outline currently shows the OCL Concrete Syntax Tree which is structurally similar to the Abstract Syntax Tree that is executed. .</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-style="italic">It would be more useful to show the AST and support Node breakpoints on it.</fo:inline>

+				</fo:block></fo:block></fo:block><fo:block id="Integration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Integration</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.11. OCL Integration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore Editor</fo:inline></fo:basic-link> editor enables OCL to be embedded in Ecore. This section explains how that OCL is executed.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> editor enables OCL to be provided as a complementing document. This section explains how that complement is installed to become part of the complemented model.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Interactive OCL</fo:inline></fo:basic-link> console allows you to load OCL and execute OCL expression interactively.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Java API</fo:inline></fo:basic-link> explains how you can take control of the OCL installation and activation.

+			</fo:block><fo:block id="Integration-OCLinEcore"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL execution in Ecore / EMF Delegates</fo:marker><fo:block font-size="14pt">2.11.1. OCL execution in Ecore / EMF Delegates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EMF delegate mechanisms and EAnnotations that enable EMF to delegate to OCL to support</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11769"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1176A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>validation of invariants</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1176D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>execution of operation bodies</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11770"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>evaluation of property initial and derived values</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">are described in the 

+					<fo:basic-link internal-destination="Delegates"><fo:inline color="blue" text-decoration="underline">Delegates</fo:inline></fo:basic-link> section of the Programmers Guide.

+				</fo:block></fo:block><fo:block id="Integration-Messages"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Custom Validation Messages</fo:marker><fo:block font-size="14pt">2.11.2. Custom Validation Messages</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL supports the production of custom messages by defining a String-valued message expression as a parenthesized clause on an invariant.</fo:block><fo:block id="Underlyingsupport"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.11.2.1. Underlying support</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OCL invariant is an expression that returns a true or false value.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In Juno and Kepler, Eclipse OCL supported an extension whereby a null return indicated an ‘error’ rather than a ‘warning’, and an invalid return was ‘fatal’.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Luna supports a rich-invariant idiom whereby an invariant can compute a tuple of results, only one of which is actually returned by tooling that does not understand the idiom. Rather than</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11789"><fo:inline font-family="Inconsolata,Courier">invariant InvariantName:

+	boolean-valued-invariant-expression;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can code additional information by recoding</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">ocl-status-expression</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">as</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11795"><fo:inline font-family="Inconsolata,Courier">invariant InvariantName:

+	Tuple{

+	    status=boolean-valued-invariant-expression,

+	    message=string-valued-message-expression,

+	    severity=integer-valued-severity-expression, -- -ve error,0 ok,+ve warn

+	    ...                          -- more custom fields as desired

+	}.status;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The idiom is a little verbose, but compatible with all OCL tooling. Eclipse OCL provides some editor enhancements to make the usage more acceptable.</fo:block></fo:block><fo:block id="Editorsyntax"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.11.2.2. Editor syntax</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the OCLinEcoreTutorial Example there is an alternative syntax for custom messages.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N117A3"><fo:inline font-family="Inconsolata,Courier">invariant SufficientCopies:

+	library.loans-&gt;select((book = self))-&gt;size() &lt;= copies;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">may be changed to</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N117AB"><fo:inline font-family="Inconsolata,Courier">invariant SufficientCopies('There are '

+	+ library.loans-&gt;select((book = self))-&gt;size().toString()

+	+ ' loans for the ' + copies.toString() + ' copies of \'' + name + '\''):

+	library.loans-&gt;select((book = self))-&gt;size() &lt;= copies;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">to replace the default diagnostic:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N117B3"><fo:inline font-family="Inconsolata,Courier">The 'SufficientCopies' constraint is violated on 'Book b2'.

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">by</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N117BB"><fo:inline font-family="Inconsolata,Courier">There are 3 loans for the 2 copies of 'b2'.

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Unfortunately, in the Photon release, EMF does not support this customization. This must be activated explicitly using an EValidator that is aware of the ValidationDelegateExtension extended API. This is available by using the 

+						<fo:basic-link internal-destination="OCLinEcoreEObjectValidator"><fo:inline color="blue" text-decoration="underline">OCLinEcoreEObjectValidator</fo:inline></fo:basic-link>.

+					</fo:block></fo:block></fo:block><fo:block id="Integration-CompleteOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">CompleteOCL Validation</fo:marker><fo:block font-size="14pt">2.11.3. CompleteOCL Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Integration of Complete OCL documents is harder because Complete OCL complements pre-existing models. These cannot always be aware of the existence of that complement, since the author of a model cannot know what complements may be added by its users.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The complete model formed from the primary models and the OCL complements is application-specific and so applications must gather the contributions together. Prior to the Indigo release, this restricted Complete OCL usage to Java applications that could gather the complements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link internal-destination="CompleteOCLEObjectValidator"><fo:inline color="blue" text-decoration="underline">CompleteOCLEObjectValidator</fo:inline></fo:basic-link> may be used to install a Complete OCL document.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In many editors an 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> is available in the context menu to facilitate loading a complementary Complete OCL document.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N117DD"><fo:external-graphic src="url(images/1600-load-document.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may drag and drop one or more files from within Eclipse or outside Eclipse into the dialog, or use one of the browser buttons to locate a Complete OCL document.</fo:block><fo:block id="BrowseRegisteredOCLFiles..."><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.11.3.1. Browse Registered OCL Files...</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The org.eclipse.ocl.xtext.completeocl.complete_ocl_registry may be used to register Complete OCL files against the nsURIs that they complement. These extension points may be defined in plugins or projects. In either case clicking 

+						<fo:inline font-weight="bold">Browse Registered OCL Files...</fo:inline> presents a list of registered Complete OCL documents applicable to the context from which the dialog was invoked.

+					</fo:block></fo:block><fo:block id="BrowseFileSystem..."><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.11.3.2. Browse File System...</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-weight="bold">Browse File System...</fo:inline> button present a file system explorer so that a Complete OCL document file can found anywhere.

+					</fo:block></fo:block><fo:block id="BrowseWorkspace..."><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.11.3.3. Browse Workspace...</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-weight="bold">Browse Workspace...</fo:inline> button present a workspace explorer so that a Complete OCL document file can found within the workspace.

+					</fo:block></fo:block></fo:block><fo:block id="OCLinEcoreforXtextValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCLinEcore for Xtext Validation</fo:marker><fo:block font-size="14pt">2.11.4. OCLinEcore for Xtext Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use OCLinEcore as a validation language for Xtext you must:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Use a manually maintained Ecore model to define your parsed grammar model, otherwise your embedded OCL will be lost each time you regenerate the editor. For non-trivial models, switching from auto-generated to manual maintenance is a good idea, since you may need to control changes carefully to maintain upward compatibility for existing models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Modify the Validator class generated by genmodel to extend OCLinEcoreEObjectValidator rather than EObjectValidator. See 

+					<fo:basic-link internal-destination="OCLinEcoreEObjectValidator"><fo:inline color="blue" text-decoration="underline">OCLinEcoreEObjectValidator</fo:inline></fo:basic-link> for details.

+				</fo:block></fo:block><fo:block id="CompleteOCLforXtextValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL for Xtext Validation</fo:marker><fo:block font-size="14pt">2.11.5. Complete OCL for Xtext Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use Complete OCL as a validation language for Xtext, you may use the 

+					<fo:basic-link internal-destination="CompleteOCLEObjectValidator"><fo:inline color="blue" text-decoration="underline">CompleteOCLEObjectValidator</fo:inline></fo:basic-link> to register the Complete OCL for EMF Validation. This may readily be achieved by reusing the empty example JavaValidator created by Xtext to install the Complete OCL. If your Xtext language is 

+					<fo:inline font-style="italic">States</fo:inline>, and your Complete OCL is 

+					<fo:inline font-style="italic">model/States.ocl</fo:inline> in 

+					<fo:inline font-style="italic">StatesProject</fo:inline> you should change your StatesJavaValidator to:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11824"><fo:inline font-family="Inconsolata,Courier">public class StatesJavaValidator extends AbstractStatesJavaValidator

+{

+    @Override

+    public void register(EValidatorRegistrar registrar) {

+        super.register(registrar);

+        StatesPackage ePackage = StatesPackage.eINSTANCE;

+        URI oclURI = URI.createPlatformResourceURI(

+            "/StatesProject/model/States.ocl", true);

+        registrar.register(ePackage,

+            new CompleteOCLEObjectValidator(ePackage, oclURI));

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="OCLinPapyrus"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL in UML (using Papyrus)</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.12. OCL in UML (using Papyrus)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(This documentation applies to Papyrus 1.0.0.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The behaviour of a UML model may be elaborated using OCL to define</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11832"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11833"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>operation bodies</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11836"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>property derivations/initializers</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11839"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>class invariants to be observed by user model instances</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1183C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>stereotype invariants to be observed by user model elements</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1183F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>guards for state machines </fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="OCLinPapyrus-UML-integration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">UML Integration</fo:marker><fo:block font-size="14pt">2.12.1. UML Integration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Although the UML metamodel makes extensive use of OCL to specify its own well-formedness, there is no explicit ability to use OCL within UML. Usage of OCL, or any other language, is enabled by the flexibility of the ValueSpecification class and the OpaqueExpression extension.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The metamodel specifies the usage of a ValueSpecification wherever a value can sensibly be provided by a variety of technologies. Simple values can be provided by, for instance, a LiteralString or LiteralInteger. More interesting values

+					by an OpaqueExpression that has two interesting list features, one of language names and the other of string bodies in the corresponding language. The lists provide an ability to provide implementations in a variety of languages. In practice only

+					one is used and if the language name is omitted, an implementation default of OCL is assumed.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Specification of a behaviour such as “name.toUpper()” can be achieved by an OpaqueExpression in which the language is Sequence(‘OCL’) and the body is Sequence(‘name.toUpper()’). The OCL is therefore embedded in a textual form that has no knowledge of the classes in the OCL metamodel.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Users of the OCL Java API may avoid the need to incur OCL parsing costs by exploiting OCL’s ExpressionInOCL class that extends ValueSpecification and delegates functionality to an OCLExpression.</fo:block></fo:block><fo:block id="OCLinPapyrus-Class-Diagram"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Class Diagram</fo:marker><fo:block font-size="14pt">2.12.2. Class Diagram</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="OCLinPapyrus-Class-Invariant"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.2.1. Class Invariant</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A class invariant specifies a constraint that must be true for all well-formed instances of the class. It is specified in Papyrus, by:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11858"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11859"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>create a Constraint Node on a Class Diagram</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1185C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1185D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select Constraint on palette</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11860"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on diagram where you want it</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11863"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on the Class you want as the Constraint context</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11866"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optionally replace the auto-generated Constraint name</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11869"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1186A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1186D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type a new name in the Properties View</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11870"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Specification of the Constraint with OCL text</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11873"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11874"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11877"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type F2 (or click again) to open the Essential OCL editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1187A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enter the required constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1187D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click outside the editor to close</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11882"><fo:external-graphic src="url(images/1710-class-invariant.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The «Context» link provides a graphical view of the Context selection in the Properties View. It is the context that defines the type of OCL’s 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and so defines what is constrained.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may edit the OCL text using direct edit as described above or from The Properties View. (Note that the editor has a significant start up time on the first usage, so be patient).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Your OCL text entry is validated automatically; an error or warning marker will be shown on the Constraint if it is not satisfactory. Once you have corrected the errors you may need to invoke 

+						<fo:inline font-weight="bold">Validate-&gt;Model Tree</fo:inline> to make the marker go away.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11897"><fo:external-graphic src="url(images/1710-class-invariant-error.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block></fo:block><fo:block id="OCLinPapyrus-Operation-Constraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.2.2. Operation Precondition, Postcondition and Body</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Preconditions specify constraints that must be satisfied before operation execution starts. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Postconditions specify constraints that must be satisfied after operation execution finishes. Postconditions may use the reserved parameter name 

+						<fo:inline font-family="Inconsolata,Courier">result</fo:inline> to refer to the one result permitted by OCL. The @pre suffix may be used to refer to the state of variables prior to execution of the operation.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In OCL, a body-expression defines the functionality of a query operation as a result-type-valued expression such as 

+						<fo:inline font-family="Inconsolata,Courier">some-computation</fo:inline>. In contrast in UML, a body-condition defines the functionality of the operation as a Boolean-valued constraint on the result such as 

+						<fo:inline font-family="Inconsolata,Courier">result = (some-computation)</fo:inline>. Papyrus supports the OCL interpretation and so the 

+						<fo:inline font-family="Inconsolata,Courier">result = (...)</fo:inline> wrapper may be omitted.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In Papyrus, once the operation has been defined, preconditions, postconditions and a body-condition are all drawn by</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N118B5"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118B6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>create a Constraint Node on a Class Diagram</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N118B9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118BA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select Constraint on palette</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118BD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on diagram where you want it</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118C0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type Esc since context links cannot be drawn to operations</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118C3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optionally replace the auto-generated Constraint name</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N118C6"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118C7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118CA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type a new name in the Properties View</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118CD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Constraint Context</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N118D0"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118D1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Operation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118D4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the appropriate Add Elements (+ icon) for Precondition or Postcondition, or the Body condition 

+										<fo:inline font-weight="bold">...</fo:inline> browser to locate the constraint

+									</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118DB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Specification of the Constraint with OCL text</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N118DE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118DF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118E2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type F2 (or click again) to open the Essential OCL editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118E5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enter the required constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N118E8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click outside the editor to close</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the context of Operation Constraints must be specified by assigning a Constraint to one of the precondition/postcondition/bodycondition roles. Assignment of the context of the constraint directly fails to allocate the constraint to its role.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N118EF"><fo:external-graphic src="url(images/1710-operation-constraints.png)" width="auto" height="auto" content-width="45%" content-height="45%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that in Papyrus 1.0, there is no stereotype display to indicate the precondition/postcondition/body-condition role.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the OCL expressions for preconditions and postconditions should be Boolean-valued. The result-valued body-expression form should be used for a body-condition.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The owning type of the Operation is used as OCL’s 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Operation should be a query if a body-condition is provided.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">In Luna, use of 

+							<fo:inline font-family="Inconsolata,Courier">result</fo:inline> within postconditions incorrectly reports an unknown property. The error can be ignored.

+						</fo:inline>

+					</fo:block></fo:block><fo:block id="OCLinPapyrus-Property-Initializers"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.2.3. Property Initializers</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OpaqueExpression whose value is an OCL expression string can be used to define the default or derived value of a Property initializer.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1190F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11910"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Property to make the Properties View relevant</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11913"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click the Create a new Object (+ icon) for the Default value</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11916"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Select OpaqueExpression from the menu</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11919"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click the Add elements (+ icon) for the Language</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1191C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select OCL in the left pane and click the right arrow to move to the right pane</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1191F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click OK</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11922"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enter the OCL text in the large pane</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11925"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click OK</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1192A"><fo:external-graphic src="url(images/1710-property-constraint.png)" width="auto" height="auto" content-width="45%" content-height="45%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">Unfortunately, in Luna, the context does not appear to be correctly set for editor, so there is an error on 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and no syntax help.

+						</fo:inline>

+					</fo:block></fo:block><fo:block id="OCLinPapyrus-Profile-Constraint"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.2.4. Profile Constraint</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Profile Constraint is very similar to a Class Invariant. However since the Profile is Constraint is drawn at M2, it may be evaluated at M1 to check a UML Class Diagram for consistency. In contrast a Class Invariant drawn at M1, may be evaluated by user tooling at M0 to validate user models. It is specified in Papyrus, by:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1193F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11940"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>create a Constraint Node on a Profile Diagram</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11943"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11944"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select Constraint on palette</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11947"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on diagram where you want it</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1194A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on the Stereotype you want as the Constraint context</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1194D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optionally replace the auto-generated Constraint name</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11950"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11951"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11954"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type a new name in the Properties View</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11957"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Specification of the Constraint with OCL text</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1195A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1195B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1195E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type F2 (or click again) to open the Essential OCL editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11961"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enter the required constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11964"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click outside the editor to close</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11969"><fo:external-graphic src="url(images/1710-profile-constraint.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL text can also be edited within the Properties View.</fo:block></fo:block></fo:block><fo:block id="OCLinPapyrus-StateMachine-Diagram"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">State Machine Diagram</fo:marker><fo:block font-size="14pt">2.12.3. State Machine Diagram</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The primary element of a StateMachine diagram is the StateMachine, which is a Type, but does not normally have Properties.

+					A StateMachine should therefore be defined as a nested type of a containing type. This may be achieved within Papyrus Model Explorer

+					by dragging the StateMachine to be a child of a Class.</fo:block><fo:block id="OCLinPapyrus-State-Constraint"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.3.1. Statemachine Constraint</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Constraint may be applied to a Statemachine in the same way as for a Class to specify an invariant of the Statemachine.</fo:block></fo:block><fo:block id="OCLinPapyrus-Transition-Guard"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.12.3.2. Statemachine Transition Guard</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The guard condition of a Statemachine Transition may be specified by associating a Constraint with a Transition. The Transition should already exist and the Statemachine should be a nested type of a suitable type for OCL’s 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. 

+						The guard condition is drawn in Papyrus by

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11986"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11987"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>create a Constraint Node on a StateMachine Diagram</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1198A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1198B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select Constraint on palette</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1198E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click on diagram where you want it</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11991"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optionally enter the required constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11994"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type Esc to close editor</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11997"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optionally replace the auto-generated Constraint name</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1199A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1199B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint, if not already selected</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1199E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type a new name in the Properties View</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119A1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Constraint Context</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N119A4"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119A5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint, if not already selected</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119A8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use the Context 

+										<fo:inline font-weight="bold">...</fo:inline> browser in the Properties View to locate the transition

+									</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119AF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>define the Specification of the Constraint with OCL text</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N119B2"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119B3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select the Constraint, if not already selected</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119B6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>type F2 (or click again) to open the Essential OCL editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119B9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enter the required constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119BC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>click outside the editor to close</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N119C1"><fo:external-graphic src="url(images/1710-transition-guard.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The required Transition is specified as the Guard of the Transition.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The owning type of the Statemachine defines OCL’s 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. In the absence of an owning type 

+						<fo:inline font-family="Inconsolata,Courier">self</fo:inline> will be undefined and OCL constraint validation will fail. You must therefore ensure that the StateMachine has a Class parent and that the Class has the required properties; 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline> for this example. Once Class and properties are defined using a Class diagram. The 

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="OCLExamplesforUML"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Constraint Examples for UML (using Papyrus)</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.13. OCL Constraint Examples for UML (using Papyrus)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(This documentation applies to Papyrus 3.0.0 and Eclipse Oxygen.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link internal-destination="OCLinPapyrus"><fo:inline color="blue" text-decoration="underline">OCL in UML (using Papyrus)</fo:inline></fo:basic-link> section shows how Papyrus may be used to create and maintain OCL expressions that enrich a UML model or profile.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this section we show how some simple and not so simple OCL examples can solve useful specification problems.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL Constraints may be specified at any meta-level. A class-level defines the types and properties that are used by the instance-level. The OCL constraints validate that the instances are compliant. The OCL therefore executes on instances of the instance-level using the types and properties of the class-level.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Constraint may be used just to document the design intent, but given an appropriate environment a constraint may be tested and/or used to verify the consistency of models. This may be</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N119E6"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119E7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a test model defined by using UML InstanceSpecification to instantiate the UML model.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119EA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a live model created by instantiating the Ecore equivalent of the UML model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N119ED"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a UML model that conforms to a UML profile</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In all cases when a validation of the model is requested, the validator attempts to execute each possible constraint on each possible instance to which it applies. When executing the constraint, the validator binds the 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> variable to the instance to be validated. The type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is determined by the context of the Constraint. In Papyrus this context is determined by the non-Constraint end of the 

+				<fo:inline font-family="Inconsolata,Courier">&lt;&lt;context&gt;&gt;</fo:inline> link from Constraint. The result of evaluating a Constraint should 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>. If 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>, the constraint is satisfied. If 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> the constraint is violated and some diagnostic should be shown to the user.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In 

+				<fo:basic-link internal-destination="OCLM1Constraints"><fo:inline color="blue" text-decoration="underline">Model Constraints</fo:inline></fo:basic-link>, we provide examples that apply to the elements of UML model. The Constraints are evaluated on the instances of the model. How violations are diagnosed depends on the synthesis of model instances and the corresponding run-time environment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In 

+				<fo:basic-link internal-destination="OCLM2Constraints"><fo:inline color="blue" text-decoration="underline">Profile Constraints</fo:inline></fo:basic-link>, we provide examples that apply to the elements of a UML profile. The Constraints are evaluated to verify consistent usage of the elements in the model. Violations are diagnosed within the UML editor.

+			</fo:block><fo:block id="OCLM1Constraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Model Constraints</fo:marker><fo:block font-size="14pt">2.13.1. Model Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="SimpleMetamodel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.13.1.1. Simple Metamodel</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11A1D"><fo:external-graphic src="url(images/1720-persons-metamodel.png)" width="auto" height="auto" content-width="85%" content-height="85%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure shows a metamodel specified in UML as a Papyrus Class Diagram. The upper half shows a simple metamodel comprising just a 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> class. A 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> has a 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline>-valued 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline> and may have a 

+						<fo:inline font-family="Inconsolata,Courier">partner</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">parents</fo:inline> and/or 

+						<fo:inline font-family="Inconsolata,Courier">children</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Some constraints such as the 

+						<fo:inline font-family="Inconsolata,Courier">parents[0..2]</fo:inline> limitation on the the number of parents to 2 may be specified directly using UML capabilities without any use of OCL. But many more challenging restrictions require OCL constraints, for which five examples are provided in the lower half of the figure.

+					</fo:block></fo:block><fo:block id="ScalarConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.13.1.2. Scalar Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To help understand the way in which OCL evaluates, it is helpful to consider some instances that conform to the constrained model</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11A47"><fo:external-graphic src="url(images/1720-persons-scalars.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure shows a model comprising three persons whose names are 

+						<fo:inline font-family="Inconsolata,Courier">father</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">mother</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">baby</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The notation in the figure is similar to a UML Object Diagram. 

+						<fo:inline font-style="italic">This should be drawable in Papyrus, unfortunately a number of bugs prevent this in the Oxygen release of Papyrus</fo:inline>. The notation deviates slightly from UML by only underlining type name, and by using rounded rectangles to distinguish DataType values from Class instances.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The three instances of 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> are shown as three rectangles, with an instance name such as 

+						<fo:inline font-family="Inconsolata,Courier">pa</fo:inline> and underlined type 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline>. The three names are shown as rounded rectangles with values such as 

+						<fo:inline font-family="Inconsolata,Courier">father</fo:inline> and type 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline>. The association between a 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> instance and their 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline> is shown by a directed link from the 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> instance to the value. The link is labelled with the relationship role which is 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">partner</fo:inline> relationship role is similarly shown by a directed link from 

+						<fo:inline font-family="Inconsolata,Courier">pa</fo:inline> to 

+						<fo:inline font-family="Inconsolata,Courier">ma</fo:inline> and vice-versa.

+					</fo:block><fo:block id="NameIsAlphabetic"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">NameIsAlphabetic</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The simplest example constraint uses a regular expression to specify that the 

+							<fo:inline font-family="Inconsolata,Courier">name</fo:inline> must consist of just alphabetic characters.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11A91"><fo:inline font-family="Inconsolata,Courier">self.name.matches('[a-zA-Z]*')

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">.</fo:inline> is the OCL Object navigation operator. It separates a cascade of navigation steps each of which returns a result value.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluation starts at 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, which rather like 

+							<fo:inline font-family="Inconsolata,Courier">this</fo:inline> in Java, is bound to an object whose type is the context of the Constraint. The result is therefore a 

+							<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> object such as 

+							<fo:inline font-family="Inconsolata,Courier">pa</fo:inline>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The property navigation step 

+							<fo:inline font-family="Inconsolata,Courier">name</fo:inline>, traverses the relationship whose role is 

+							<fo:inline font-family="Inconsolata,Courier">name</fo:inline>. The navigation steps from 

+							<fo:inline font-family="Inconsolata,Courier">pa</fo:inline> to the 

+							<fo:inline font-family="Inconsolata,Courier">father</fo:inline> value. The result is a String comprising 

+							<fo:inline font-family="Inconsolata,Courier">father</fo:inline>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The operation call step 

+							<fo:inline font-family="Inconsolata,Courier">matches('[a-zA-Z]*')</fo:inline>, executes the regular expression matching function using the provided regex. The final result is 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> or 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+						</fo:block></fo:block><fo:block id="NoSelfPartnership"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">NoSelfPartnership</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Another very simple example constraint checks that the 

+							<fo:inline font-family="Inconsolata,Courier">partner</fo:inline> relationship does not have the same 

+							<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> as both its source and target.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11AD4"><fo:inline font-family="Inconsolata,Courier">self.partner &lt;&gt; self

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL comprises two navigation expressions separated by the infix 

+							<fo:inline font-family="Inconsolata,Courier">&lt;&gt;</fo:inline> operator.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first, 

+							<fo:inline font-family="Inconsolata,Courier">self.partner</fo:inline>, navigates from 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to compute a result comprising the 

+							<fo:inline font-family="Inconsolata,Courier">partner</fo:inline> of the 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context instance.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The second, 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> just returns the context instance.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The not-equals 

+							<fo:inline font-family="Inconsolata,Courier">&lt;&gt;</fo:inline> infix operator compares its preceding and following arguments and provides a 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> result when the arguments are not-equal, 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> when equal.

+						</fo:block></fo:block></fo:block><fo:block id="CollectionConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.13.1.3. Collection Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The one-to-one relationships between objects and values have a simple implementation typically involving a pointer. One-to-many and many-to-many relationships are more complex since a collection of values is involved.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11B04"><fo:external-graphic src="url(images/1720-persons-collections.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure above elaborates the earlier figure to show the to-many relationships. The figure also uses a simpler representation of the object to value relationships by embedding each 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline> value within its 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> instance. One-to-one object relationships such as 

+						<fo:inline font-family="Inconsolata,Courier">partner</fo:inline> are unaffected. To-many relationships such as 

+						<fo:inline font-family="Inconsolata,Courier">parents</fo:inline> are shown using a multi-object drawn as three overlaid rectangles. Each multi-object is typically a collection owned by the relationship source and shown by a solid arrow labelled with the relationship name. Each element of the collection is identified by a dashed arrow. 

+						<fo:inline font-family="Inconsolata,Courier">child</fo:inline> therefore has two 

+						<fo:inline font-family="Inconsolata,Courier">parents</fo:inline>; 

+						<fo:inline font-family="Inconsolata,Courier">pa</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">ma</fo:inline>. Many-to-many relationships are convently realized as independent one-to-many relationships in each direction. The 

+						<fo:inline font-family="Inconsolata,Courier">children</fo:inline> opposite of 

+						<fo:inline font-family="Inconsolata,Courier">parents</fo:inline> is therefore shown by a 

+						<fo:inline font-family="Inconsolata,Courier">children</fo:inline> multi-object for each parent identifying the one child.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When Ecore is used to implement UML, the multi-object is realized in exactly this way by an 

+						<fo:inline font-family="Inconsolata,Courier">EList</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL provides an ability to use these multi-objects within expressions. The multi-object is a 

+						<fo:inline font-family="Inconsolata,Courier">Collection</fo:inline>, or more specifically a 

+						<fo:inline font-family="Inconsolata,Courier">Bag</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">OrderedSet</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">Sequence</fo:inline> or 

+						<fo:inline font-family="Inconsolata,Courier">Set</fo:inline> depending on whether the to-many-relationship is specified to be 

+						<fo:inline font-family="Inconsolata,Courier">ordered</fo:inline> and/or 

+						<fo:inline font-family="Inconsolata,Courier">unique</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In OCL, 

+						<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> is the collection navigation operator that enables an evaluation to exploit all the target objects.

+					</fo:block><fo:block id="EachChildHasTwoParents"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">EachChildHasTwoParents</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each child should have two parents, but in any finite model there must be some 

+							<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> instances for which the parents are omitted. Hence the model specifies a [0..2] multiplicity rather than precisely [2..2]. We may remedy this deficiency with an OCL constraint.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11B57"><fo:inline font-family="Inconsolata,Courier">self.children-&gt;forAll(child | child.parents-&gt;size() = 2)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and 

+							<fo:inline font-family="Inconsolata,Courier">children</fo:inline> navigate from the context object to locate the collection of all children of the context instance as the navigation result.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> collection operator and the subsequent 

+							<fo:inline font-family="Inconsolata,Courier">forAll(child | ...)</fo:inline> iteration cause an iteration to be performed over the children, assigning each child in turn to the 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline> iterator variable. The 

+							<fo:inline font-family="Inconsolata,Courier">...</fo:inline> iterator body is evaluated for each child and accumulated so that the result of the 

+							<fo:inline font-family="Inconsolata,Courier">forAll</fo:inline> is only 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the body evaluation for each 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline> is also 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The iteration body navigates from each 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline> to select the collection of all of its 

+							<fo:inline font-family="Inconsolata,Courier">parents</fo:inline>. Then the 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> collection navigation operator invokes the collection operation 

+							<fo:inline font-family="Inconsolata,Courier">size()</fo:inline> to compute the size of the collection. This size is compared using the 

+							<fo:inline font-family="Inconsolata,Courier">=</fo:inline> (equals) operator to the constant 

+							<fo:inline font-family="Inconsolata,Courier">2</fo:inline>. The iteration body therefore returns 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> unless the number of parents is equal to 2.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example can be written more compactly as</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11B97"><fo:inline font-family="Inconsolata,Courier">children-&gt;forAll(parents-&gt;size() = 2)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">since an implicit iterator is the default source for navigation within an iteration body, and 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the default outside.

+						</fo:block></fo:block><fo:block id="AcyclicAncestry"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">AcyclicAncestry</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The instances of a user model often form an acyclic graph. It is therefore desirable to specify this as an OCL constraint so that any cycles are detected by an OCL model validator. This is fairly easy to specify with the help of the OCL transitive closure iteration.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11BA7"><fo:inline font-family="Inconsolata,Courier">self.parents-&gt;closure(parent | parent.parents)-&gt;excludes(self)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Once again the 

+							<fo:inline font-family="Inconsolata,Courier">self.parents</fo:inline> navigation returns the collection of all parents of the context instance. This collection is used as a seed from which  the 

+							<fo:inline font-family="Inconsolata,Courier">closure(parent | ... )</fo:inline> collection iteration grows the final result by repeatedly aggregating the result of the 

+							<fo:inline font-family="Inconsolata,Courier">...</fo:inline> body evaluation. Each element of the interim result is bound to the 

+							<fo:inline font-family="Inconsolata,Courier">parent</fo:inline> iterator until there are no values left in the result for which the iteration body has not been evaluated.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">parent.parents</fo:inline> iteration body just returns all parents of a given parent so that the closure progressively aggregates the grandparents then great-grandparents, then ...

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Once the 

+							<fo:inline font-family="Inconsolata,Courier">closure</fo:inline> completes, it returns a 

+							<fo:inline font-family="Inconsolata,Courier">Set</fo:inline> (or 

+							<fo:inline font-family="Inconsolata,Courier">OrderedSet</fo:inline>) of all ancestors which is passed to the the 

+							<fo:inline font-family="Inconsolata,Courier">excludes</fo:inline> Collection operator to confirm that the 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> instance is not an ancestor of itself.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example can be written more compactly as</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11BD2"><fo:inline font-family="Inconsolata,Courier">parents-&gt;closure(parents)-&gt;excludes(self)

+</fo:inline></fo:block></fo:block><fo:block id="EachChildsParentsArePartners"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">EachChildsParentsArePartners</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A user model may not always allow arbitrary relationships between its instances. An OCL constraint can impose discipline, and within a more complex OCL constraint one or more let-variables may provide structure that aids readability.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In our example we may wish to impose a requirement that the two parents of a child are partners.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11BDF"><fo:inline font-family="Inconsolata,Courier">let selfAndPartner = self.oclAsSet()-&gt;including(self.partner) in

+self.children-&gt;forAll(child | selfAndPartner-&gt;includesAll(child.parents))

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">let selfAndPartner ... in ...</fo:inline> assigns the value of a first 

+							<fo:inline font-family="Inconsolata,Courier">...</fo:inline> expression to the 

+							<fo:inline font-family="Inconsolata,Courier">selfAndPartner</fo:inline> let-variable so that 

+							<fo:inline font-family="Inconsolata,Courier">selfAndPartner</fo:inline> can then be used in the evaluation of the second 

+							<fo:inline font-family="Inconsolata,Courier">...</fo:inline> expression that provides the final result. The let-variable allows a sub-computation to be re-used many times, or just to be assigned to a readable name.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The let-variable is computed by first using 

+							<fo:inline font-family="Inconsolata,Courier">self.oclAsSet()</fo:inline> to compute a single element Set containing 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> It then uses the collection operation 

+							<fo:inline font-family="Inconsolata,Courier">including(self.partner)</fo:inline> to compute another set containing all (one) elements of the original set and also including another element. The result is therefore a set of the two elements, 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and 

+							<fo:inline font-family="Inconsolata,Courier">self.partner</fo:inline>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As before 

+							<fo:inline font-family="Inconsolata,Courier">self.children-&gt;forAll(child | ...)</fo:inline> binds each child to the 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline> iterator and requires that the 

+							<fo:inline font-family="Inconsolata,Courier">...</fo:inline> body evaluates to 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> for all values of 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline>. The body verifies that the pair of persons cached in the 

+							<fo:inline font-family="Inconsolata,Courier">selfAndPartner</fo:inline> includes each person identified by 

+							<fo:inline font-family="Inconsolata,Courier">child.parents</fo:inline>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example can be written more compactly as</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11C1F"><fo:inline font-family="Inconsolata,Courier">let selfAndPartner = self-&gt;including(partner) in

+children-&gt;forAll(selfAndPartner = parents)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The more compact form exploits an implicit invocation of 

+							<fo:inline font-family="Inconsolata,Courier">oclAsSet()</fo:inline> that occurs when a 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> collection navigation operator has a non-collection as its source.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eliminating the explicit 

+							<fo:inline font-family="Inconsolata,Courier">child</fo:inline> iterator from the 

+							<fo:inline font-family="Inconsolata,Courier">forAll</fo:inline> iteration is permissible but perhaps unwise since an occasional OCL user may struggle to understand whether the final 

+							<fo:inline font-family="Inconsolata,Courier">parents</fo:inline> is 

+							<fo:inline font-family="Inconsolata,Courier">self.parents</fo:inline> or 

+							<fo:inline font-family="Inconsolata,Courier">child.parents</fo:inline>.

+						</fo:block></fo:block></fo:block></fo:block><fo:block id="OCLM2Constraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Profile Constraints</fo:marker><fo:block font-size="14pt">2.13.2. Profile Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A UML Profile provides an ability to extend an existing metamodel by defining Stereotypes that may be added to elements of the metamodel. The 

+					<fo:inline font-family="Inconsolata,Courier">Ecore.profile.uml</fo:inline> which annotates 

+					<fo:inline font-family="Inconsolata,Courier">UML.uml</fo:inline> to define the Eclipse UML support is a good example of such usage. The contrived example here that extends a single class metamodel would be much better realized by a new metamodel.

+				</fo:block><fo:block id="ExampleProfile"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.13.2.1. Example Profile</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Our contrived example provides two forms of extension, 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> intended for a 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> element, but since we are defining a profile we must define the extension for 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline>'s metaclass which is 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>. We also define another extension, 

+						<fo:inline font-family="Inconsolata,Courier">Vehicle</fo:inline>, that is sensible for a 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> but clearly stupid for a 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11C69"><fo:external-graphic src="url(images/1720-persons-profile.png)" width="auto" height="auto" content-width="75%" content-height="75%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> may have a 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> defined as an abstract stereotype from which the concrete 

+						<fo:inline font-family="Inconsolata,Courier">Male</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Female</fo:inline> stereotypes derive.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> may have one or more 

+						<fo:inline font-family="Inconsolata,Courier">Role</fo:inline>'s defined as an abstract stereotype from which the concrete 

+						<fo:inline font-family="Inconsolata,Courier">Astronaut</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> stereotypes derive. A 

+						<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> provides an additional 

+						<fo:inline font-family="Inconsolata,Courier">priesthood</fo:inline> enumeration property that identifies the religious affiliation of the priest.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These definitions are drawn as an extension link from a base stereotype such as 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline>, to a metaclass, such as 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>. The link is a UML 

+						<fo:inline font-family="Inconsolata,Courier">Extension</fo:inline> that is a form of 

+						<fo:inline font-family="Inconsolata,Courier">Association</fo:inline> and so has two automatically synthesized 

+						<fo:inline font-family="Inconsolata,Courier">Property</fo:inline> elements for its ends. The property role names are derived by applying 

+						<fo:inline font-family="Inconsolata,Courier">base_</fo:inline> or 

+						<fo:inline font-family="Inconsolata,Courier">extension_</fo:inline> prefixes to the target class/metaclass names. The 

+						<fo:inline font-family="Inconsolata,Courier">base_Class</fo:inline> property therefore identifies the 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> metaclass end of the 

+						<fo:inline font-family="Inconsolata,Courier">Extension</fo:inline>, and the 

+						<fo:inline font-family="Inconsolata,Courier">extension_Gender</fo:inline> identifies the 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> end.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">extension_</fo:inline> property has a multiplicity for which [0..1] specifies that at most one application of the 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> stereotype is permissible. Alternatively a [0..*] multiplicity specifies that zero or more applications of the 

+						<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> stereotype are possible; a priest may also be an astronaut. Specification of non-zero lowerbounds is possible but not generally appropriate since the application is to the metaclass. Mandating that a 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> is always applied leads to stupidities if a completely independent class such as an 

+						<fo:inline font-family="Inconsolata,Courier">Road</fo:inline> are also modeled.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The extension multiplicity provides a very limited imposition of design rules on the use of the stereotypes. Generally much more complex rules requiring OCL constraints are required. Four examples are shown and explained later.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">(The Oxygen release of Papyrus provides a misleading editing interface for stereotype multiplicities. Use only the advanced properties after selecting the extension in the Model Explorer View)</fo:inline>.

+					</fo:block></fo:block><fo:block id="ExampleProfiledModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.13.2.2. Example Profiled Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The application of stereotypes is relatively straightforward and not the topic of this section. A profile is applied to the model, so that its stereotypes can be applied to the elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11CD7"><fo:external-graphic src="url(images/1720-persons-profiled.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Applied stereotypes are shown within guilemets. The example above shows definition of a derived 

+						<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> class named 

+						<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> to which the 

+						<fo:inline font-family="Inconsolata,Courier">Female</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> stereotypes have been applied. Not shown in the diagram, is the definition of the 

+						<fo:inline font-family="Inconsolata,Courier">Priest::priesthood</fo:inline> metaproperty with the 

+						<fo:inline font-family="Inconsolata,Courier">RABBI</fo:inline> value.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML representation is deceptively simple and consequently rather confusing when writing OCL constraints. We need to look at the equivalent object model that the OCL evaluation uses.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11CF5"><fo:external-graphic src="url(images/1720-persons-applied.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure shows just the 

+						<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> class. In the centre, an instance of the 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> metaclass is instantiated as a 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> named 

+						<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> with the inherited String-valued 

+						<fo:inline font-family="Inconsolata,Courier">Property</fo:inline> named 

+						<fo:inline font-family="Inconsolata,Courier">name</fo:inline>. Each 

+						<fo:inline font-family="Inconsolata,Courier">Stereotype</fo:inline> metaclass is instantiated as an element without a type specification. The elements are named 

+						<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Female</fo:inline>. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-style="italic">The type specification is missing because the UML specification has no primary need for the concept of a stereotype instance. This omission leads to a complexity in the XMI serialization for UML. The omitted type is indicated by the guilemets surrounding the names.</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The relationships between 

+						<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">«Female»</fo:inline> show the synthesized 

+						<fo:inline font-family="Inconsolata,Courier">base_Class</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">extension_Gender</fo:inline> relationships. Note that it is 

+						<fo:inline font-family="Inconsolata,Courier">extension_Gender</fo:inline> rather than 

+						<fo:inline font-family="Inconsolata,Courier">extension_Female</fo:inline> since the profile defined 

+						<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> as an extension of the 

+						<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> metaclass. 

+						<fo:inline font-family="Inconsolata,Courier">Female</fo:inline> is a derivation of the defined extension.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The relationships between 

+						<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">«Priest»</fo:inline> are more complex since more than one 

+						<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> may be applied. The 

+						<fo:inline font-family="Inconsolata,Courier">extension_Role</fo:inline> therefore identifies a collection of zero or more 

+						<fo:inline font-family="Inconsolata,Courier">Role</fo:inline>'s. The example shows that the collection contains just the one 

+						<fo:inline font-family="Inconsolata,Courier">«Priest»</fo:inline> element.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We may now examine some example constraints to see how this model is used by constraint evaluation.</fo:block><fo:block id="MaleOrFemale"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">MaleOrFemale</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A simple example constraint on an abstract 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> stereotype confirms that only one of the 

+							<fo:inline font-family="Inconsolata,Courier">«Female»</fo:inline> or 

+							<fo:inline font-family="Inconsolata,Courier">«Male»</fo:inline> stereotypes is applied.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11D62"><fo:inline font-family="Inconsolata,Courier">let gender = self.base_Class.extension_Gender in 

+gender.oclIsKindOf(Male) &lt;&gt; gender.oclIsKindOf(Female)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The navigation starts with 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> bound to a 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> instance since that is the 

+							<fo:inline font-family="Inconsolata,Courier">«context»</fo:inline> of the Constraint definition. Navigation to 

+							<fo:inline font-family="Inconsolata,Courier">base_Class</fo:inline> locates the instance of 

+							<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> to which the stereotype is provided. The further navigation to 

+							<fo:inline font-family="Inconsolata,Courier">extension_Gender</fo:inline> locates a 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> instance for any corresponding application of the stereotype. This instance is saved in the 

+							<fo:inline font-family="Inconsolata,Courier">gender</fo:inline> let-variable.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The subsequent operation navigation from 

+							<fo:inline font-family="Inconsolata,Courier">gender</fo:inline> using 

+							<fo:inline font-family="Inconsolata,Courier">oclIsKindOf(Male)</fo:inline> returns 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+							<fo:inline font-family="Inconsolata,Courier">gender</fo:inline> is a 

+							<fo:inline font-family="Inconsolata,Courier">Male</fo:inline> stereotype instance, 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise. The similar test for 

+							<fo:inline font-family="Inconsolata,Courier">oclIsKindOf(Female)</fo:inline> is compared so that the constraint is only 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> when the applied stereotypes differ.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This Constraint is somewhat redundant since the at-most-one multiplicity on a 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> stereotype inhibits any double application. The let-variable 

+							<fo:inline font-family="Inconsolata,Courier">gender</fo:inline> is therefore always the same as 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. This constraint can therefore be written more compactly as:

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11DA6"><fo:inline font-family="Inconsolata,Courier">true

+</fo:inline></fo:block></fo:block><fo:block id="GenderIsRequired"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">GenderIsRequired</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A more useful constraint mandates that every non-abstract class to which a 

+							<fo:inline font-family="Inconsolata,Courier">«Role»</fo:inline> is applied also has an application of the 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> stereotype.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11DBA"><fo:inline font-family="Inconsolata,Courier">not self.base_Class.isAbstract implies

+self.base_Class.extension_Gender &lt;&gt; null

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When this is evaluated for our single instance example model, evaluation starts with 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> bound to the 

+							<fo:inline font-family="Inconsolata,Courier">«Priest»</fo:inline> stereotype instance since the 

+							<fo:inline font-family="Inconsolata,Courier">«context»</fo:inline> of the constraint definition is the 

+							<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> from which 

+							<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> derives.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							<fo:inline font-family="Inconsolata,Courier">self.base_Class</fo:inline> navigates from the 

+							<fo:inline font-family="Inconsolata,Courier">«Priest»</fo:inline> stereotype instance to the 

+							<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> class instance, where the 

+							<fo:inline font-family="Inconsolata,Courier">isAbstract</fo:inline> navigation is used to test the 

+							<fo:inline font-family="Inconsolata,Courier">UML::Class::isAbstract</fo:inline> property to determine whether 

+							<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> is abstract or not.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">x implies y</fo:inline> infix operator is often more readable that 

+							<fo:inline font-family="Inconsolata,Courier">(not x) or y</fo:inline>; it conveniently short-circuits evaluation of a garbage second expression when the first expression is 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline>. In this example the subsequent evaluation is bypassed for instances of abstract classes.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Gender</fo:inline> navigates first to the 

+							<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> class instance and then on to a 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> stereotype instance. This navigation returns a non-null object if there is such an instance, or 

+							<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if there is not. The 

+							<fo:inline font-family="Inconsolata,Courier">&lt;&gt; null</fo:inline> comparison therefore returns 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> when a 

+							<fo:inline font-family="Inconsolata,Courier">Gender</fo:inline> stereotype has been applied; or 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> when not-applied.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the examples specify a relevant stereotype as the 

+							<fo:inline font-family="Inconsolata,Courier">«context»</fo:inline>. It is possible to write an identical constraint when the 

+							<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> metaclass is specified as the 

+							<fo:inline font-family="Inconsolata,Courier">«context»</fo:inline>.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11E14"><fo:inline font-family="Inconsolata,Courier">not isAbstract implies 

+extension_Role-&gt;notEmpty() implies

+extension_Gender &lt;&gt; null

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">However this is inefficient since it must be executed for all possible classes where it performs a double test ‘any Role’ then ‘check Gender’. By defining the constraint on the 

+							<fo:inline font-family="Inconsolata,Courier">Role</fo:inline>, the first test is performed for free. Redundant evaluations for e.g. 

+							<fo:inline font-family="Inconsolata,Courier">Road</fo:inline> elements are avoided. Of course a separate constraint that 

+							<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> should only be applied to 

+							<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> may be desirable.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11E27"><fo:inline font-family="Inconsolata,Courier">base_Class.oclIsKindOf(Person)

+</fo:inline></fo:block></fo:block><fo:block id="CatholicPriestsAreMale"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">CatholicPriestsAreMale</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Stronger constraints may mandate a business rule such as requiring that 

+							<fo:inline font-family="Inconsolata,Courier">CATHOLIC</fo:inline> priests are male.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11E38"><fo:inline font-family="Inconsolata,Courier">self.priesthood = Priesthood::CATHOLIC implies

+self.base_Class.extension_Gender.oclIsKindOf(Male)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The left hand side of the 

+							<fo:inline font-family="Inconsolata,Courier">implies</fo:inline> restricts the constraint to the case where the 

+							<fo:inline font-family="Inconsolata,Courier">priesthood</fo:inline> meta-property has been assigned the 

+							<fo:inline font-family="Inconsolata,Courier">CATHOLIC</fo:inline> enumeration value. In our single class example, a 

+							<fo:inline font-family="Inconsolata,Courier">Priestess</fo:inline> is assigned the value 

+							<fo:inline font-family="Inconsolata,Courier">RABBI</fo:inline> and so the test always fails. If a further 

+							<fo:inline font-family="Inconsolata,Courier">CatholicPriest</fo:inline> class is defined, this constraint then becomes useful, since the right hand side of the 

+							<fo:inline font-family="Inconsolata,Courier">implies</fo:inline> expression checks that the 

+							<fo:inline font-family="Inconsolata,Courier">«Gender»</fo:inline> stereotype instance is present and is a 

+							<fo:inline font-family="Inconsolata,Courier">«Male»</fo:inline> stereotype instance.

+						</fo:block></fo:block><fo:block id="AtMostOnePriesthood"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">AtMostOnePriesthood</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since multiple 

+							<fo:inline font-family="Inconsolata,Courier">«Role»</fo:inline> stereotype instances are permitted, we may require a business rule to prohibit the application of two 

+							<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> stereotypes.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11E69"><fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Role-&gt;selectByKind(Priest)-&gt;size() = 1

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As before 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is a 

+							<fo:inline font-family="Inconsolata,Courier">«Role»</fo:inline> stereotype instance so that navigation to 

+							<fo:inline font-family="Inconsolata,Courier">base_Class</fo:inline> identifies the 

+							<fo:inline font-family="Inconsolata,Courier">Person</fo:inline> class that has been stereotyped. The 

+							<fo:inline font-family="Inconsolata,Courier">extension_Role</fo:inline> identifies the collection of all applied 

+							<fo:inline font-family="Inconsolata,Courier">Role</fo:inline> stereotypes since multiple applications are permitted.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> collection navigation operator and the collection operation 

+							<fo:inline font-family="Inconsolata,Courier">selectByKind(Priest)</fo:inline> returns a filtered  collection that selects only those stereotype instances that are, or derive from, the 

+							<fo:inline font-family="Inconsolata,Courier">Priest</fo:inline> stereotype. The further 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline> collection navigation operator and the 

+							<fo:inline font-family="Inconsolata,Courier">size()</fo:inline> collection operation compute the size of this collection. The constraint result is 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the size equals 1; 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+						</fo:block></fo:block><fo:block id="notEmpty"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">

+							<fo:inline font-family="Inconsolata,Courier">-&gt;notEmpty()</fo:inline>

+						</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;notEmpty()</fo:inline> collection navigation and operation is convenient to test whether one or more applications of a stereotype are present.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11EA5"><fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Role-&gt;notEmpty()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not uncommon to see 

+							<fo:inline font-family="Inconsolata,Courier">-&gt;notEmpty()</fo:inline> used when at most one application is possible.

+						</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11EAF"><fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Gender-&gt;notEmpty()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is not wrong, but is slightly inefficient since it provokes the following automatic non-collection to set conversion.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11EB6"><fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Gender.oclAsSet()-&gt;notEmpty()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is more efficient to write</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N11EBD"><fo:inline font-family="Inconsolata,Courier">self.base_Class.extension_Gender &lt;&gt; null

+</fo:inline></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="UserInterface"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">User Interface</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">2.14. User Interface</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The user interface comprises</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11EC8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11EC9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="Editors"><fo:inline color="blue" text-decoration="underline">Editors</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11ED0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="InteractiveOCL"><fo:inline color="blue" text-decoration="underline">Console</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11ED7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">Debugger</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11EDE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="ValidityView"><fo:inline color="blue" text-decoration="underline">Validity View</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11EE5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="PreferencePages"><fo:inline color="blue" text-decoration="underline">Workspace Preference Pages</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11EEC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="PropertyPages"><fo:inline color="blue" text-decoration="underline">Project Property Pages</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11EF3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:basic-link internal-destination="LoadCompleteOCLResource"><fo:inline color="blue" text-decoration="underline">OCL-&gt;Load Document Menu Action</fo:inline></fo:basic-link>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="PropertyPages"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Project Property Pages</fo:marker><fo:block font-size="14pt">2.14.1. Project Property Pages</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Project Property Pages are accessible by invoking 

+					<fo:inline font-weight="bold">Properties</fo:inline> from the right button context menu of a project.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N11F06"><fo:external-graphic src="url(images/1800-property-pages.png)" width="auto" height="auto" content-width="55.00000000000001%" content-height="55.00000000000001%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In principle, it is possible to specify project-specific settings, however in practice is not often possible for application code to determine the prevailing project. Project-specific properties are therefore often ignored and may be removed in a future release.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Property pages are:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11F10"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F11"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="OverallOptions"><fo:inline color="blue" text-decoration="underline">Overall Options</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F18"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="OCLinEcoreOptions"><fo:inline color="blue" text-decoration="underline">OCLinEcore editor Options</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F1F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="EcoreUMLOptions"><fo:inline color="blue" text-decoration="underline">Options applicable to the Ecore and UML bindings</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F26"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="UMLOptions"><fo:inline color="blue" text-decoration="underline">Options applicable to just the UML bindings</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F2D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="ModelRegistry"><fo:inline color="blue" text-decoration="underline">The Model Registry</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="PreferencePages"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Workspace Preference Pages</fo:marker><fo:block font-size="14pt">2.14.2. Workspace Preference Pages</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Workspace Preference Pages are accessible by invoking 

+					<fo:inline font-weight="bold">Preferences</fo:inline> from the 

+					<fo:inline font-weight="bold">Window</fo:inline> menu on the toolbar.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N11F44"><fo:external-graphic src="url(images/1800-preference-pages.png)" width="auto" height="auto" content-width="55.00000000000001%" content-height="55.00000000000001%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Preference pages are:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11F4C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F4D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="OverallOptions"><fo:inline color="blue" text-decoration="underline">Overall Options</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F54"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="OCLinEcoreOptions"><fo:inline color="blue" text-decoration="underline">OCLinEcore editor Options</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F5B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="EcoreUMLOptions"><fo:inline color="blue" text-decoration="underline">Options applicable to the Ecore and UML bindings</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F62"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="UMLOptions"><fo:inline color="blue" text-decoration="underline">Options applicable to just the UML bindings</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F69"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="SyntaxColoring"><fo:inline color="blue" text-decoration="underline">Editor Syntax Coloring</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11F70"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="EditorTemplates"><fo:inline color="blue" text-decoration="underline">Editor Templates</fo:inline></fo:basic-link>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="OverallOptions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Overall Options</fo:marker><fo:block font-size="14pt">2.14.3. Overall Options</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The two overall options are independent of the Ecore/UML/Pivot bindings.</fo:block><fo:block id="DefaultDelegationMode"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.14.3.1. Default Delegation Mode</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL project provides two execution engines which may be used to support EMF Delegates.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11F85"><fo:external-graphic src="url(images/1810-default-delegation-mode.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block id="LPGDelegation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">http://www.eclipse.org/emf/2002/Ecore/OCL/LPG</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF Delegate annotations referencing the 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/LPG</fo:inline> URI are serviced by the classic evaluator that uses the LPG parser.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This URI was introduced in the Indigo release.</fo:block></fo:block><fo:block id="PivotDelegation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF Delegate annotations referencing the 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:inline> URI are serviced by the new experimental evaluator that uses the UML-aligned Pivot model.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This URI was introduced in the Indigo release and was imposed by the Indigo OCLinEcore editor.</fo:block></fo:block><fo:block id="DefaultDelegation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF Delegate annotations referencing the 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> URI are serviced by the evaluator selected on the preference page by the 

+							<fo:basic-link internal-destination="DefaultDelegationMode"><fo:inline color="blue" text-decoration="underline">Default Delegation Mode</fo:inline></fo:basic-link>.

+						</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This URI was introduced in the Helios release and was imposed by the Helios OCLinEcore editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Use of an Indigo or Juno editor converts the URI to use the Pivot evaluator.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In Kepler, a prevailing URI in the input file is preserved, unless changed by the context menu setting. If no prevailing URI exists a default is determined by an OCLinEcore preference setting that defaults to the Pivot evaluator.</fo:block></fo:block></fo:block><fo:block id="CodeGenerationMode"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">2.14.3.2. Code Generation Mode</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Juno introduced an experimental ability to replace the delegated interpreted execution of OCL by direct execution of compiled Java code. This facility has been substantially improved and tested for the Kepler release.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Optimisations for Luna included inlining the bodies directly into the EMF Impl classes. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Mars has useful fixes and benefits from safe navigation analyses.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Further optimisations are scheduled for future releases.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N11FC2"><fo:external-graphic src="url(images/1810-code-generation-mode.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This option may be selected to change the realization of OCL option.</fo:block><fo:block id="CodeGenerationMode-DELEGATED"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Delegate for interpretation at run-time</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Selecting the default delegation mode retains the Helios and Indigo functionality whereby 

+							<fo:inline font-weight="bold">genmodel</fo:inline> generates Java code that encodes the OCL expressions as text strings. Each expression is lazily compiled at run-time with the result being cached to reduce overheads for repeated execution.

+						</fo:block></fo:block><fo:block id="CodeGenerationMode-GENERATED"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">Generate Java code in xxxBodies classes</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Selecting Java code generation causes 

+							<fo:inline font-weight="bold">genmodel</fo:inline> to run Xtend templates that generate

+						</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N11FDE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11FDF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+									<fo:inline font-style="italic">Package</fo:inline> Tables.java file

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N11FE5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>inline OCL implementations within the 

+									<fo:inline font-style="italic">Class</fo:inline> Impl.java files

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The tables file contains an optimised model representation allowing polymorphic operations to be dispatched in constant time.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implementation files contain Java code corresponding to each OCL expression defining operation bodies or property initializers.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Disclaimer: the generated code is experimental has yet to be optimized and so is only about five times faster than the interpreted execution. </fo:block></fo:block></fo:block></fo:block><fo:block id="EcoreUMLOptions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Ecore and UML Options</fo:marker><fo:block font-size="14pt">2.14.4. Ecore and UML Options</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The options for the Ecore and UML bindings.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N11FF9"><fo:external-graphic src="url(images/1820-ecore-uml-options.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block></fo:block><fo:block id="UMLOptions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">UML Options</fo:marker><fo:block font-size="14pt">2.14.5. UML Options</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The options for the UML binding.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N12007"><fo:external-graphic src="url(images/1830-uml-options.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block></fo:block><fo:block id="ModelRegistry"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Model Registry</fo:marker><fo:block font-size="14pt">2.14.6. Model Registry</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Model Registry is now deprecated.</fo:block></fo:block><fo:block id="SyntaxColoring"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax Coloring</fo:marker><fo:block font-size="14pt">2.14.7. Syntax Coloring</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard Xtext syntax coloring facilities are provided for each of the OCL editors.</fo:block></fo:block><fo:block id="EditorTemplates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editor Templates</fo:marker><fo:block font-size="14pt">2.14.8. Editor Templates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard Xtext editor template facilities are provided for each of the OCL editors.</fo:block></fo:block><fo:block id="OCLinEcoreOptions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCLinEcore Options</fo:marker><fo:block font-size="14pt">2.14.9. OCLinEcore Options</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The options for the OCLinEcore editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N12027"><fo:external-graphic src="url(images/1870-oclinecore-options.png)" width="auto" height="auto" content-width="45%" content-height="45%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL embedded in Ecore can be executed with either the Classic evaluator or the new Pivot evaluator depending on the URI used to define the embedded EAnnotations. This preference determines the URI written to Ecore files when no URI was previously in use.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Selecting 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> makes no choice and so defers to the user’s 

+					<fo:basic-link internal-destination="DefaultDelegation"><fo:inline color="blue" text-decoration="underline">run-time delegation choice</fo:inline></fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Selecting 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:inline> is recommended since the OCLinEcore editor and Pivot evaluator both use the Xtext parser. This should avoid problems whereby not all facilities of the new Pivot grammar are supported by the Classic grammic or LPG evaluator.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Selecting 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/LPG</fo:inline> may be appropriate if evaluation using the classic LPG evaluator is important.

+				</fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>The OCL Standard Library</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>The OCL Standard Library</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="StandardLibrary"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 3. The OCL Standard Library</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This documentation on the OCL Standard Library is auto-generated from the

+			org.eclipse.ocl.pivot/model/OCL-2.5.oclstdlib that defines

+			the behaviour of the Pivot evaluator and the Xtext editors. It is similar to the OCL 2.4 functionality.

+			It is a prototype of functionality for OCL 2.5 where the use of models may eliminate ambiguities.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The library support for the Ecore and UML bindings in Luna has been upgraded so that the available operations

+			are similar to those documented here for the Pivot binding.</fo:block><fo:block id="Precedences"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">Precedences</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.1. 

+				<fo:inline font-weight="bold">Precedences</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">NAVIGATION</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">UNARY</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">MULTIPLICATIVE</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">AND</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">OR</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">XOR</fo:inline> &gt; 

+				<fo:inline font-family="Inconsolata,Courier">IMPLIES</fo:inline>

+			</fo:block></fo:block><fo:block id="Bag"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Bag(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.2. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Bag(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A bag is a collection with duplicates allowed. That is, one object can be an element of a bag many times.

+				There is no ordering defined on the elements in a bag.

+				Bag is itself an instance of the metatype BagType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="Collection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and bag contain the same elements, the same number of times.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(object : OclAny[?]) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bag containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(objects : Collection(OclAny)) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bag containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of all objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">flatten(T2)() : Bag(T2)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Redefines the Collection operation. If the element type is not a collection type, this results in the same bag as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				If the element type is a collection type, the result is the bag containing all the elements of all the recursively flattened elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(object : T[?]) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bag containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingAll(objects : Collection(T)) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bag containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByKind(TT)(type : TT[?]) : Bag(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByType(TT)(type : TT[?]) : Bag(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">closure(i : T[1] | lambda : Lambda T() : Set(T)[?]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The closure of applying body transitively to every distinct element of the source collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collect(V)(i : T[?] | lambda : Lambda T() : V[?]) : Bag(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collectNested(V)(i : T[?] | lambda : Lambda T() : V[?]) : Bag(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Bag of elements which results from applying body to every member of the source nonordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reject(i : T[?] | lambda : Lambda T() : Boolean[1]) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-bag of the source bag for which body is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12105"><fo:inline font-family="Inconsolata,Courier">self-&gt;reject(iterator | body) = self-&gt;select(iterator | not body)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">select(i : T[?] | lambda : Lambda T() : Boolean[1]) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-bag of the source bag for which body is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12117"><fo:inline font-family="Inconsolata,Courier">self-&gt;select(iterator | body) =

+self-&gt;iterate(iterator; result : Bag(T) = Bag{} |

+if body then result-&gt;including(iterator)

+else result

+endif)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the Sequence containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c then a &lt; c).</fo:block></fo:block><fo:block id="Boolean"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Boolean</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.3. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Boolean</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type Boolean represents the common true/false values.

+				Boolean is itself an instance of the metatype PrimitiveType (from UML).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the logical value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the same as the numeric value of object2, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the logical value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the not same as the numeric value of object2, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">Set{false, true}</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">and(b : Boolean[?]) : Boolean[?] invalidating validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">AND</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> .

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N121A1"><fo:inline font-family="Inconsolata,Courier">body: if self.oclIsInvalid() then

+		        if b.oclIsInvalid() then self

+		        elseif b = false then false

+		        else self

+		        endif

+		      elseif self = false then false

+		      elseif b.oclIsInvalid() then b

+		      elseif b = false then false

+		      elseif self = null then null

+		      elseif b = null then null

+		      else true

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">and2(b : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N121BD"><fo:inline font-family="Inconsolata,Courier">body: if self = false then false

+		      elseif b = false then false

+		      else true

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">implies(b : Boolean[?]) : Boolean[?] invalidating validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">IMPLIES</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>, or if 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N121F7"><fo:inline font-family="Inconsolata,Courier">body: if self.oclIsInvalid() then

+		        if b.oclIsInvalid() then self

+		        elseif b = true then true

+		        else self

+		        endif

+		      elseif self = false then true

+		      elseif b.oclIsInvalid() then b

+		      elseif b = true then true

+		      elseif self = null then null

+		      elseif b = null then b

+		      else false

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">implies2(b : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>, or if 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12216"><fo:inline font-family="Inconsolata,Courier">body: if self = false then true

+		      elseif b = true then true

+		      else false

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">not() : Boolean[?] validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">UNARY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12244"><fo:inline font-family="Inconsolata,Courier">body: if self.oclIsInvalid() then self

+		      elseif self = null then null

+		      else self = false

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">not2() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1225D"><fo:inline font-family="Inconsolata,Courier">body: if self then false else true endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">or(b : Boolean[?]) : Boolean[?] invalidating validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">OR</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12294"><fo:inline font-family="Inconsolata,Courier">body: if self.oclIsInvalid() then

+		        if b.oclIsInvalid() then self

+			    elseif b = true then true

+		        else self

+		        endif

+		      elseif self = true then true

+			  elseif b.oclIsInvalid() then b

+			  elseif b = true then true

+			  elseif self = null then null

+			  elseif b = null then null

+		      else false

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">or2(b : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N122B0"><fo:inline font-family="Inconsolata,Courier">body: if self = true then true

+			  elseif b = true then true

+		      else false

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to a string value.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">xor(b : Boolean[?]) : Boolean[?]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">XOR</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>, or if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>, or if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if either 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1230F"><fo:inline font-family="Inconsolata,Courier">body: if self.oclIsInvalid() then self

+		      elseif b.oclIsInvalid() then b

+		      elseif self = null then null

+		      elseif b = null then null

+		      else self &lt;&gt; b

+		      endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">xor2(b : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> &lt;&gt; 

+				<fo:inline font-family="Inconsolata,Courier">b</fo:inline>

+				Otherwise 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12328"><fo:inline font-family="Inconsolata,Courier">body: self &lt;&gt; b

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="Class"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.4. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block></fo:block><fo:block id="Collection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.5. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Collection is the abstract supertype of all collection types in the OCL Standard Library.

+				Each occurrence of an object in a collection is called an element.

+				If an object occurs twice in a collection, there are two elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This sub clause defines the properties on Collections that have identical semantics for all collection subtypes.

+				Some operations may be defined within the subtype as well,

+				which means that there is an additional postcondition or a more specialized return value.

+				Collection is itself an instance of the metatype CollectionType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The definition of several common operations is different for each subtype.

+				These operations are not mentioned in this sub clause.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The semantics of the collection operations is given in the form of a postcondition that uses the IterateExp of the IteratorExp construct.

+				The semantics of those constructs is defined in Clause 10 (“Semantics Described using UML”).

+				In several cases the postcondition refers to other collection operations,

+				which in turn are defined in terms of the IterateExp or IteratorExp constructs.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Well-formedness rules</fo:block>A collection cannot contain 

+			<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> values.

+			<fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">context Collection

+				inv: self-&gt;forAll(not oclIsInvalid())</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">lower : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the lower bound on the number of collection elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">upper : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the upper bound on the number of collection elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Associations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">elementType : T[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the type of the collection elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if c is a collection of the same kind as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and contains the same elements in the same quantities and in the same order,

+				in the case of an ordered collection type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if c is not equal to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">asBag() : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Bag that contains all the elements from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">asOrderedSet() : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OrderedSet that contains all the elements from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, with duplicates removed,

+				in an order dependent on the particular concrete collection type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">asSequence() : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Sequence that contains all the elements from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, in an order dependent on the particular concrete collection type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">asSet() : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Set containing all the elements from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, with duplicates removed.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">count(object : OclAny[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of times that object occurs in the collection 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludes(object : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if object is not an element of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludesAll(T2)(c2 : Collection(T2)) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Does 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> contain none of the elements of c2 ?

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(object : OclAny[?]) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The collection containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(objects : Collection(OclAny)) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The collection containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of all objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">flatten(T2)() : Collection(T2)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the element type is not a collection type, this results in the same collection as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				If the element type is a collection type, the result is a collection containing all the elements of all the recursively flattened elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includes(object : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if object is an element of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includesAll(T2)(c2 : Collection(T2)) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Does 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> contain all the elements of c2 ?

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(object : T[?]) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The collection containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingAll(objects : Collection(T)) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The collection containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">intersection(u : UniqueCollection(T)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The intersection of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and a unique collection; the set of all elements that are in both 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and u.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">intersection(c : Collection(T)) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The intersection of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and bag; the bag of all elements that are in both 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and c.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">isEmpty() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Is 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> the empty collection?

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note: 

+				<fo:inline font-family="Inconsolata,Courier">null-&gt;isEmpty()</fo:inline> returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> in virtue of the implicit casting from 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> to 

+				<fo:inline font-family="Inconsolata,Courier">Bag{}</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">max() : T[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The element with the maximum value of all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				Elements must be of a type supporting the max operation.

+				The max operation – supported by the elements – must take one parameter of type T and be both associative and commutative.

+				UnlimitedNatural, Integer and Real fulfill this condition.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">min() : T[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The element with the minimum value of all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				Elements must be of a type supporting the min operation.

+				The min operation – supported by the elements – must take one parameter of type T and be both associative and commutative.

+				UnlimitedNatural, Integer and Real fulfill this condition.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">notEmpty() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Is 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> not the empty collection?

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">null-&gt;notEmpty()</fo:inline> returns 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> in virtue of the implicit casting from 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> to 

+				<fo:inline font-family="Inconsolata,Courier">Bag{}</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">product(T2)(c2 : Collection(T2)) : Set(Tuple(first:T[1], second:T2[1]))</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The cartesian product operation of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and c2.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByKind(TT)(type : TT[?]) : Collection(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByType(TT)(type : TT[?]) : Collection(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">size() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of elements in the collection 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sum() : T[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The addition of all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				Elements must be of an 

+				<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline> type to provide the zero() and sum() operations.

+				The 

+				<fo:inline font-style="italic">sum</fo:inline> operation must be both associative: a.sum(b).sum© = a.sum(b.sum©), and commutative: a.sum(b) = b.sum(a).

+				Integer and Real fulfill this condition.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the 

+				<fo:inline font-style="italic">sum</fo:inline> operation is not both associative and commutative, the 

+				<fo:inline font-style="italic">sum</fo:inline> expression is not well-formed,

+				which may result in unpredictable results during evaluation.

+				If an implementation is able to detect a lack of associativity or commutativity,

+				the implementation may bypass the evaluation and return an 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> result.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">union(c : Collection(T)) : Bag(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bag consisting of all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and all elements in c.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">any(i : T[?] | body : Lambda T() : Boolean[1]) : T[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns any element in the 

+				<fo:inline font-style="italic">source</fo:inline> collection for which 

+				<fo:inline font-style="italic">body</fo:inline> evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				Returns 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if the 

+				<fo:inline font-style="italic">body</fo:inline> evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> for any element,

+				otherwise if there are one or more elements for which the 

+				<fo:inline font-style="italic">body</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>,

+				an indeterminate choice of one of them is returned, otherwise the result is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">let source : Collection(T) = ..., body : Lambda T() : Boolean = ... in

+				source-&gt;any(iterator | body) = source-&gt;select(iterator | body)

+				<fo:inline font-style="italic">&gt;asSequence()</fo:inline>&gt;first()

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collect(V)(i : T[?] | lambda : Lambda T() : V[?]) : Collection(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Collection of elements that results from applying body to every member of the source set.

+				The result is flattened. Notice that this is based on collectNested, which can be of different type depending on the type of source.

+				collectNested is defined individually for each subclass of CollectionType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collectNested(V)(i : T[?] | lambda : Lambda T() : V[?]) : Collection(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Collection of elements which results from applying body to every member of the source collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">exists(i : T[?] | lambda : Lambda T() : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if body evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> for at least one element in the source collection.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">exists(i : T[?], j : T[?] | lambda : Lambda T() : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">forAll(i : T[?] | lambda : Lambda T() : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the body expression evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> for each element in the source collection; otherwise, result is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">forAll(i : T[?], j : T[?] | lambda : Lambda T() : Boolean[?]) : Boolean[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">isUnique(i : T[?] | lambda : Lambda T() : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if body evaluates to a different value for each element in the source collection; otherwise, result is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">iterate(Tacc)(i : T[?]acc : ; Tacc[?] | lambda : Lambda T() : Tacc[?]) : Tacc[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">one(i : T[?] | lambda : Lambda T() : Boolean[1]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if there is exactly one element in the source collection for which body is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reject(i : T[?] | lambda : Lambda T() : Boolean[1]) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-collection of the source collection for which body is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">select(i : T[?] | lambda : Lambda T() : Boolean[1]) : Collection(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-collection of the source collection for which body is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the Collection containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c then a &lt; c).</fo:block></fo:block><fo:block id="Enumeration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Enumeration</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.6. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Enumeration</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">@Deprecated: Use OclEnumeration

+				The Enumeration type is the type of an OrderedSet of EnumerationLiteral.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allLiterals : OrderedSet(EnumerationLiteral)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the literals of the enumeration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a set of all enumeration values of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block></fo:block><fo:block id="EnumerationLiteral"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">EnumerationLiteral</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.7. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">EnumerationLiteral</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type EnumerationLiteral represents a named constant value of an Enumeration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">Enumeration : Bag(Enumeration[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">OclEnumeration : Bag(OclEnumeration[*|?])</fo:inline>

+			</fo:block></fo:block><fo:block id="Integer"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.8. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type Integer represents the mathematical concept of integer.

+				Integer is itself an instance of the metatype PrimitiveType (from UML).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="Real"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">Real</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">*(i : OclSelf[?]) : Integer[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">MULTIPLICATIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the multiplication of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">+(i : OclSelf[?]) : Integer[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the addition of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-() : Integer[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">UNARY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The negative value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-(i : OclSelf[?]) : Integer[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the subtraction of i from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">/(i : OclSelf[?]) : Real[1] invalidating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">MULTIPLICATIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> divided by i.

+				Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if r is equal to zero.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">abs() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The absolute value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">div(i : Integer[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of times that i fits completely within 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">max(i : OclSelf[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The maximum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> an i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">min(i : OclSelf[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minimum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> an i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">mod(i : Integer[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The result is 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> modulo i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to a string value.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toUnlimitedNatural() : UnlimitedNatural[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts a non-negative 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to an UnlimitedNatural value. A negative 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is converted to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+				An automatic coersion may be synthesized if the coercion enables an operation reference to be resolved

+				in an expression where no operation was available without coercion.

+			</fo:block></fo:block><fo:block id="Map"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Map(K, V)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.9. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Map(K, V)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Map provides a Set of key values, each of which has an associated value.

+				Keys and values may be null, but neither may be invalid.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Associations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">keyType : K[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The key type of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">valueType : V[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value type of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and s contain the same elements.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">at(key : OclAny[?]) : V[?] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the map at 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludes(key : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> is not one of the keys of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludes(key : OclAny[?], value : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline> are not a key-value pair of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludesAll(K2)(coll : Collection(K2)) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if none of the elements of 

+				<fo:inline font-family="Inconsolata,Courier">coll</fo:inline> are keys of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludesMap(K2, V2)(map : Map(K2, V2)[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if none of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">map</fo:inline> are also key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludesValue(value : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline> is not one of the values of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(key : OclAny[?]) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> except any whose key is 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(key : OclAny[?], value : OclAny[?]) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> except any whose key is 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> and whose value is 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(keys : Collection(OclAny)) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> except any whose key is included in 

+				<fo:inline font-family="Inconsolata,Courier">keys</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingMap(K2, V2)(map : Map(K2, V2)[?]) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> except any which is also included in 

+				<fo:inline font-family="Inconsolata,Courier">map</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includes(key : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> is one of the keys of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includes(key : OclAny[?], value : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline> are a key-value pair of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includesAll(K2)(coll : Collection(K2)) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if all the elements of 

+				<fo:inline font-family="Inconsolata,Courier">coll</fo:inline> are keys of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includesMap(K2, V2)(map : Map(K2, V2)[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if all of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">map</fo:inline> are also key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includesValue(value : OclAny[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline> is one of the values of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(key : K[?], value : V[?]) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and an additional key-value pair for 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline>.

+				If 

+				<fo:inline font-family="Inconsolata,Courier">key</fo:inline> is already a key of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, the old value pair is replaced by 

+				<fo:inline font-family="Inconsolata,Courier">value</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingMap(K2, V2)(map : Map(K2, V2)[?]) : Map(K, V)[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The map containing all of the key-value pairs of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and 

+				<fo:inline font-family="Inconsolata,Courier">map</fo:inline>.

+				The values associated with key-value pairs in 

+				<fo:inline font-family="Inconsolata,Courier">map</fo:inline> replace those in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> where the same key is used by both maps.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">isEmpty() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the empty map, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">keys() : Set(K)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Set comprising all the keys of the key-value pairs in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">notEmpty() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> not the empty map, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">size() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of key-value pairs in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">values() : Bag(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Bag comprising all the values of the key-value pairs in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block></fo:block><fo:block id="OclAny"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.10. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of elements in the collection 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.essions.

+				OclAny is itself an instance of the metatype AnyType.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All classes in a UML model inherit all operations defined on OclAny.

+				To avoid name conflicts between properties in the model and the properties inherited from OclAny,

+				all names on the properties of OclAny start with ‘ocl.’

+				Although theoretically there may still be name conflicts, they can be avoided.

+				One can also use qualification by OclAny (name of the type) to explicitly refer to the OclAny properties.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Operations of OclAny, where the instance of OclAny is called object.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">OclInvalid : Bag(OclInvalid[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the same object as object2. Infix operator.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1284A"><fo:inline font-family="Inconsolata,Courier">post: result = self = object2

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is a different object from object2. Infix operator.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1285D"><fo:inline font-family="Inconsolata,Courier">post: result = not (self = object2)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsSet() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns a Set with 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> as the sole content, unless 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> in which case returns an empty set,

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsType(TT)(type : TT[?]) : TT[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, where 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of the type identified by 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline>.

+				The type 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline> may be any classifier defined by OCL or a user metamodel;

+				if the actual type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> at evaluation time does not conform to 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline>,

+				then the oclAsType operation evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is a multiply classified instance, the current classification used for OCL navigation

+				is changed to the classification to which 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline> conforms. The oclAsType call is not well-formed if

+				the classification is ambiguous.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the case of feature redefinition, casting an object to a supertype of its actual type

+				does not access the supertype’s definition of the feature;

+				according to the semantics of redefinition, the redefined feature simply does not exist for the object.

+				However, when casting to a supertype, any features additionally defined by the subtype are suppressed.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12899"><fo:inline font-family="Inconsolata,Courier">post IsSelf: result = self

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsInState(statespec : OclState[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is in the state identified by statespec.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsInvalid() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is equal to OclInvalid.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsKindOf(type : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> conforms to 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline>.

+				That is, 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of type 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline> or a subtype of 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsNew() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Can only be used in a postcondition.

+				Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is created during performing the operation (for instance, it didn’t exist at precondition time).

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsTypeOf(type : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of the type 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline> but not a subtype of 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsUndefined() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is equal to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> or equal to 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclLog() : OclSelf[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the self, with the side effect of generating a log message comprising self.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclLog(message : String[?]) : OclSelf[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the self, with the side effect of generating a log message comprising message followed by self.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclType() : OclSelf[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the most derived type of which 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is currently an instance. If 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance of a multiply

+				classified type, the return is the most derived type of the current classification which is established when the instance is

+				passed to OCL, or re-established by an 

+				<fo:inline font-family="Inconsolata,Courier">oclAsType()</fo:inline> call.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclTypes() : Set(OclSelf[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to all of the most derived type of which 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance. The return from 

+				<fo:inline font-family="Inconsolata,Courier">oclTypes()</fo:inline>

+				is normally equivalent to that from 

+				<fo:inline font-family="Inconsolata,Courier">oclType()</fo:inline> unless 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance of multiply classified type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns a string representation of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block></fo:block><fo:block id="OclComparable"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.11. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclComparable defines the compareTo operation used by the sortedBy iteration. Only types that provide a derived

+				compareTo implementation may be sorted.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;(that : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is less than 

+				<fo:inline font-family="Inconsolata,Courier">that</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;=(that : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is less than or equal to 

+				<fo:inline font-family="Inconsolata,Courier">that</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&gt;=(that : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is greater than or equal to 

+				<fo:inline font-family="Inconsolata,Courier">that</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&gt;(that : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is greater than 

+				<fo:inline font-family="Inconsolata,Courier">that</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">compareTo(that : OclSelf[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return -ve, 0, +ve according to whether self is less than, equal to , or greater than that.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The compareTo operation should be commutative.</fo:block></fo:block><fo:block id="OclElement"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclElement</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.12. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclElement</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclElement is the implicit supertype of any user-defined type that has no explicit supertypes. Operations defined

+				for OclElement are therefore applicable to all user-defined types.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">OclElement : Bag(OclElement[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">OclElement : Bag(OclElement[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclContents : Set(OclElement)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The composed contents of self.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Associations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclContainer : OclElement[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The object for which self is a composed content or null if there is no such object.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a set of all instances of the type and derived types of self.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsModelType(TT)(type : TT[?]) : TT[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, where 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of the model type identified by 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Most model elements have metamodel types for use with oclAsType, but no model type and so the return is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Model elements such as UML’s InstnaceSpecification that do support distinct model and metamodel types return 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+				with the cast type 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline> that may be used for further navigation.

+				If the actual model type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> at evaluation time does not conform to 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline>,

+				then the oclAsType operation evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is a multiply classified instance, the current classification used for OCL navigation

+				is changed to the classification to which 

+				<fo:inline font-family="Inconsolata,Courier">TT</fo:inline> conforms. The oclAsModelType call is not well-formed if

+				the classification is ambiguous.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12A1A"><fo:inline font-family="Inconsolata,Courier">post IsSelf: result = self

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclContainer() : OclElement[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns the object for which self is a composed content or null if there is no such object.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclContents() : Set(OclElement)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns the composed contents of self.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsModelKindOf(type : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> conforms to the model type 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline>.

+				That is, 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of type 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline> or a subtype of 

+				<fo:inline font-family="Inconsolata,Courier">type</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The return is normally 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> since few model elements have model types. UML’s InstanceSpecification::classifier provides

+				a multiple classification for a model type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclModelType() : OclSelf[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the most derived model type of which 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is currently an instance. If 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance of a multiply

+				classified model type, the return is the most derived type of the current classification which is established

+				by an 

+				<fo:inline font-family="Inconsolata,Courier">oclAsModelType()</fo:inline> call.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The return is normally 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> since few model elements have model types. UML’s InstanceSpecification::classifier provides

+				a multiple classification for a model type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclModelTypes() : Set(OclSelf[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to all of the most derived model types of which 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance. The return from 

+				<fo:inline font-family="Inconsolata,Courier">oclModelTypes()</fo:inline>

+				is normally equivalent to that from 

+				<fo:inline font-family="Inconsolata,Courier">oclModelType()</fo:inline> unless 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is an instance of multiply classified model type.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The return is normally 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> since few model elements have model types. UML’s InstanceSpecification::classifier provides

+				a multiple classification for a model type.

+			</fo:block></fo:block><fo:block id="OclEnumeration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclEnumeration</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.13. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclEnumeration</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OclEnumeration type is the implicit supertype of any user Enumeration type.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclType"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Attributes</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allLiterals : OrderedSet(EnumerationLiteral)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to the literals of the enumeration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a set of all enumeration values of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block></fo:block><fo:block id="OclInvalid"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclInvalid</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.14. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclInvalid</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclInvalid is a type that conforms to all other types.

+				It has one single instance, identified as  

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+				Any property call applied on invalid results in 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>, except for the operations oclIsUndefined() and oclIsInvalid().

+				OclInvalid is itself an instance of the metatype InvalidType.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclVoid"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclVoid</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Associations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclBadProperty : OclAny[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An oclBadProperty may be used as a placeholder in an unsuccessfully created OCLExpression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">and(b : Boolean[?]) : Boolean[?] validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">AND</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">implies(b : Boolean[?]) : Boolean[?] validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">IMPLIES</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsSet() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsType(TT)(type : TT[?]) : TT[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclBadOperation() : OclAny[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An oclBadOperation may be used as a placeholder in an unsuccessfully created OCLExpression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsInvalid() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsKindOf(type : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsTypeOf(type : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsUndefined() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclType() : OclSelf[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">or(b : Boolean[?]) : Boolean[?] validating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">OR</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns ‘invalid’.</fo:block></fo:block><fo:block id="OclLambda"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclLambda</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.15. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclLambda</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclLambda is the implicit supertype of all Lambda types. The operations defined for OclLambda

+				therefore apply to all lambda expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block></fo:block><fo:block id="OclMessage"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.16. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OclMessage

+				This sub clause contains the definition of the standard type OclMessage.

+				As defined in this sub clause, each ocl message type is actually a template type with one parameter.

+				‘T’ denotes the parameter.

+				A concrete ocl message type is created by substituting an operation or signal for the T.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The predefined type OclMessage is an instance of MessageType.

+				Every OclMessage is fully determined by either the operation, or signal given as parameter.

+				Note that there is conceptually an undefined (infinite) number of these types,

+				as each is determined by a different operation or signal.

+				These types are unnamed. Every type has as attributes the name of the operation or signal,

+				and either all formal parameters of the operation, or all attributes of the signal.

+				OclMessage is itself an instance of the metatype MessageType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OclMessage has a number of predefined operations, as shown in the OCL Standard Library.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">hasReturned() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if type of template parameter is an operation call, and the called operation has returned a value.

+				This implies the fact that the message has been sent. False in all other cases.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">isOperationCall() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the OclMessage represents the sending of a UML Operation call.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">isSignalSent() : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the OclMessage represents the sending of a UML Signal.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">result() : OclAny[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns the result of the called operation, if type of template parameter is an operation call,

+				and the called operation has returned a value. Otherwise the 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> value is returned.

+			</fo:block></fo:block><fo:block id="OclSelf"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSelf</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.17. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSelf</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The pseudo-type OclSelf denotes the statically determinate type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> in Operation

+				and Iteration signatures. Instances of OclSelf are never created.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block></fo:block><fo:block id="OclState"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclState</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.18. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclState</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block></fo:block><fo:block id="OclStereotype"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclStereotype</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.19. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclStereotype</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclStereotype is the implicit supertype of any UML stereotype. Operations defined

+				for OclStereotype are therefore applicable to all UML stereotypes.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclType"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a set of all instances of the stereotype and derived types of self.</fo:block></fo:block><fo:block id="OclSummable"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.20. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclSummable defines the sum and zero operations used by the Collection::sum iteration. Only types that provide derived

+				sum and zero implementations may be summed.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sum(that : OclSelf[?]) : OclSelf[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return the sum of self and that.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sum operation should be associative.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">zero() : OclSelf[?]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return the ‘zero’ value of self to initialize a summation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">zero().sum(self) = self.</fo:block></fo:block><fo:block id="OclTuple"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclTuple</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.21. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclTuple</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclTuple is the implicit supertype of all Tuple types. The operations defined for OclTuple

+				therefore apply to all tuples.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block></fo:block><fo:block id="OclType"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.22. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclType is the implicit supertype of any UML type. Operations defined

+				for OclType are therefore applicable to all UML types.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclElement"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclElement</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">conformsTo(type2 : OclType[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns true if type2 conforms to self.</fo:block></fo:block><fo:block id="OclVoid"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclVoid</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.23. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OclVoid</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The type OclVoid is a type that conforms to all other types except OclInvalid.

+				It has one single instance, identified as 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>, that corresponds with the UML LiteralNull value specification.

+				Any property call applied on 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> results in 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>, except for the

+				oclIsUndefined(), oclIsInvalid(), =(OclAny) and &lt;&gt;(OclAny) operations.

+				However, by virtue of the implicit conversion to a collection literal,

+				an expression evaluating to 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> can be used as source of collection operations (such as ‘isEmpty’).

+				If the source is the 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline> literal, it is implicitly converted to Bag{}.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OclVoid is itself an instance of the metatype VoidType.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclAny"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Redefines the OclAny operation, returning 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if object is 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>

+				if object is 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">allInstances() : Set(OclSelf[*|?])</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">Set{null}</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">and(b : Boolean[?]) : Boolean[?]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">AND</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">implies(b : Boolean[?]) : Boolean[?]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">IMPLIES</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsSet() : Set(OclSelf)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsInvalid() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclIsUndefined() : Boolean[1] validating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">or(b : Boolean[?]) : Boolean[?]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">OR</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">null</fo:inline>.

+			</fo:block></fo:block><fo:block id="OrderedCollection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.24. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OrderedCollection type provides the shared functionality of the OrderedSet and Sequence

+				collections for which the elements are ordered.

+				The common supertype of OrderedCollection is Collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="Collection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">at(index : Integer[?]) : T[?] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The i-th element of ordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">first() : T[?] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first element in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">indexOf(obj : OclAny[?]) : Integer[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The index of object obj in the ordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">last() : T[?] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The last element in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block></fo:block><fo:block id="OrderedSet"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedSet(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.25. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">OrderedSet(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OrderedSet is a Set, the elements of which are ordered.

+				It contains no duplicates. OrderedSet is itself an instance of the metatype OrderedSetType.

+				An OrderedSet is not a subtype of Set, neither a subtype of Sequence.

+				The common supertype of Sets and OrderedSets is Collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OrderedCollection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OrderedCollection(T)</fo:inline>

+				</fo:inline></fo:basic-link>, 

+				<fo:basic-link internal-destination="UniqueCollection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">UniqueCollection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-(s : UniqueCollection(OclAny)) : OrderedSet(T)</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, which are not in s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">append(object : T[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set of elements, consisting of all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, followed by object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">appendAll(objects : OrderedCollection(T)) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set of elements, consisting of all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, followed by objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(object : OclAny[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set  containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The order of the remaining elements is not changed.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(objects : Collection(OclAny)) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of all objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">flatten(T2)() : OrderedSet(T2)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(object : T[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus object added as the last element if not already present.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingAll(objects : Collection(T)) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus objects added as the last elements.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">insertAt(index : Integer[?], object : T[?]) : OrderedSet(T) invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set consisting of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> with object present at position index.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">prepend(object : T[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence consisting of object, followed by all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12DCE"><fo:inline font-family="Inconsolata,Courier">post IsAtStart: result-&gt;at(1) = object

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12DD4"><fo:inline font-family="Inconsolata,Courier">post IsShiftedAlong: Sequence{1..self-&gt;size()}-&gt;forAll(index | self-&gt;at(index) = result-&gt;at(index + 1))

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N12DDA"><fo:inline font-family="Inconsolata,Courier">post IsSizePlusOne: result-&gt;size() = self-&gt;size() + 1

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">prependAll(objects : OrderedCollection(T)) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence consisting of objects, followed by all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reverse() : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set of elements with same elements but with the opposite order.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByKind(TT)(type : TT[?]) : OrderedSet(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByType(TT)(type : TT[?]) : OrderedSet(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">subOrderedSet(lower : Integer[?], upper : Integer[?]) : OrderedSet(T) invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-set of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> starting at number lower, up to and including element number upper.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">closure(i : T[1] | lambda : Lambda T() : OrderedSet(T)[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The closure of applying body transitively to every distinct element of the source collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collect(V)(i : T[?] | lambda : Lambda T() : V[?]) : Sequence(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collectNested(V)(i : T[?] | lambda : Lambda T() : V[?]) : Sequence(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence of elements that results from applying body to every member of the source ordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reject(i : T[?] | lambda : Lambda T() : Boolean[1]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set of the source ordered set for which body is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">select(i : T[?] | lambda : Lambda T() : Boolean[1]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ordered set of the source ordered set for which body is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the ordered set containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c, then a &lt; c).</fo:block></fo:block><fo:block id="Real"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Real</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.26. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Real</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type Real represents the mathematical concept of real.

+				Note that Integer is a subclass of Real,

+				so for each parameter of type Real, you can use an integer as the actual parameter.

+				Real is itself an instance of the metatype PrimitiveType (from UML).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclComparable"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline></fo:basic-link>, 

+				<fo:basic-link internal-destination="OclSummable"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the numeric value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the same as the numeric value of object2, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if the numeric value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the not the same as the numeric value of object2, 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline> otherwise.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">*(r : OclSelf[?]) : Real[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">MULTIPLICATIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the multiplication of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and r.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">+(r : OclSelf[?]) : Real[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the addition of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and r.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-() : Real[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">UNARY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The negative value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-(r : OclSelf[?]) : Real[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of the subtraction of r from 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">/(r : OclSelf[?]) : Real[1] invalidating</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">MULTIPLICATIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> divided by r. Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> if r is equal to zero.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">abs() : Real[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The absolute value of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">floor() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The largest integer that is less than or equal to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">max(r : OclSelf[?]) : Real[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The maximum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and r.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">min(r : OclSelf[?]) : Real[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minimum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and r.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">round() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The integer that is closest to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. When there are two such integers, the largest one.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to a string value.

+			</fo:block></fo:block><fo:block id="Sequence"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Sequence(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.27. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Sequence(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A sequence is a collection where the elements are ordered.

+				An element may be part of a sequence more than once.

+				Sequence is itself an instance of the metatype SequenceType.

+				A Sentence is not a subtype of Bag.

+				The common supertype of Sentence and Bags is Collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OrderedCollection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OrderedCollection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> contains the same elements as s in the same order.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">append(object : T[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence of elements, consisting of all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, followed by object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">appendAll(objects : OrderedCollection(T)) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence of elements, consisting of all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, followed by objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(object : OclAny[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The order of the remaining elements is not changed.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(objects : Collection(OclAny)) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of all objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">flatten(T2)() : Sequence(T2)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Redefines the Collection operation. If the element type is not a collection type, this results in the same sequence as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				If the element type is a collection type, the result is the sequence containing all the elements

+				of all the recursively flattened elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. The order of the elements is partial.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(object : T[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus object added as the last element.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingAll(objects : Collection(T)) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus objects added as the last elements.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">insertAt(index : Integer[?], object : T[?]) : Sequence(T) invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence consisting of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> with object inserted at position index.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">prepend(object : T[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence consisting of object, followed by all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">prependAll(objects : OrderedCollection(T)) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence consisting of objects, followed by all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reverse() : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence containing the same elements but with the opposite order.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByKind(TT)(type : TT[?]) : Sequence(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByType(TT)(type : TT[?]) : Sequence(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">subSequence(lower : Integer[?], upper : Integer[?]) : Sequence(T) invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-sequence of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> starting at number lower, up to and including element number upper.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">closure(i : T[1] | lambda : Lambda T() : OrderedSet(T)[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The closure of applying body transitively to every distinct element of the source collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collect(V)(i : T[?] | lambda : Lambda T() : V[?]) : Sequence(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collectNested(V)(i : T[?] | lambda : Lambda T() : V[?]) : Sequence(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sequence of elements that results from applying body to every member of the source ordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reject(i : T[?] | lambda : Lambda T() : Boolean[1]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The subsequence of the source sequence for which body is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">select(i : T[?] | lambda : Lambda T() : Boolean[1]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The subsequence of the source sequence for which body is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : Sequence(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the Sequence containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c then a &lt; c).</fo:block></fo:block><fo:block id="Set"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Set(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.28. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Set(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="UniqueCollection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">UniqueCollection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and s contain the same elements.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-(s : UniqueCollection(OclAny)) : Set(T)</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, which are not in s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excluding(object : OclAny[?]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> without object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">excludingAll(objects : Collection(OclAny)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> apart from all occurrences of all objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">flatten(T2)() : Set(T2)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Redefines the Collection operation. If the element type is not a collection type, this results in the same set as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				If the element type is a collection type, the result is the set containing all the elements of all the recursively flattened elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">including(object : T[?]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> plus object.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">includingAll(objects : Collection(T)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set containing all elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and objects.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByKind(TT)(type : TT[?]) : Set(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">selectByType(TT)(type : TT[?]) : Set(TT)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">closure(i : T[1] | lambda : Lambda T() : Set(T)[?]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The closure of applying body transitively to every distinct element of the source collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collect(V)(i : T[?] | lambda : Lambda T() : V[?]) : Bag(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">collectNested(V)(i : T[?] | lambda : Lambda T() : V[?]) : Bag(V)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Bag of elements which results from applying body to every member of the source nonordered collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">reject(i : T[?] | lambda : Lambda T() : Boolean[1]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The subset of the source set for which body is 

+				<fo:inline font-family="Inconsolata,Courier">false</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">select(i : T[?] | lambda : Lambda T() : Boolean[1]) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The subset of set for which expr is 

+				<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the ordered set containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c, then a &lt; c).</fo:block></fo:block><fo:block id="State"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">State</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.29. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">State</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclState"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclState</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block></fo:block><fo:block id="String"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">String</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.30. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">String</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type String represents strings, which can be both ASCII or Unicode.

+				String is itself an instance of the metatype PrimitiveType (from UML).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclComparable"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline></fo:basic-link>, 

+				<fo:basic-link internal-destination="OclSummable"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclSummable</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">=(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;&gt;(object2 : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">EQUALITY</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;(s : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is less than s, using the locale defined by looking up oclLocale in the current environment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&lt;=(s : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is less than or equal to s, using the locale defined by looking up oclLocale in the current environment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&gt;=(s : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is greater than or equal to s, using the locale defined by looking up oclLocale in the current environment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">&gt;(s : OclSelf[?]) : Boolean[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">RELATIONAL</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">True if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is greater than s, using the locale defined by looking up oclLocale in the current environment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">+(s : String[?]) : String[1]</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The concatenation of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">at(i : Integer[?]) : String[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Queries the character at position i in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">characters() : Sequence(String)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Obtains the characters of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> as a sequence.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">compareTo(that : OclSelf[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The comparison of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> with 

+				<fo:inline font-family="Inconsolata,Courier">that</fo:inline>. -ve if less than, 0 if equal, +ve if greater than.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">concat(s : String[?]) : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The concatenation of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">endsWith(s : String[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns true if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> ends with the string s.

+				Every string ends with the empty string.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">equalsIgnoreCase(s : String[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Queries whether s and 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> are equivalent under case-insensitive collation.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">indexOf(s : String[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Queries the first index in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> at which s is a substring of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, or zero if s is not a substring of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				The empty string is a substring of every string at index 1 (and also at all other indexes).

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">lastIndexOf(s : String[?]) : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Queries the last in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> at which s is a substring of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, or zero if s is not a substring of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+				The empty string is a substring of every string at index 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>-size()+1 (and also at all other indexes).

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">matches(regex : String[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Use a regular expression match and return true if self matches regex, false otherwise.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">replaceAll(regex : String[?], replacement : String[?]) : String[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a string derived from self by replacing all matches of regex by replacement.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">replaceFirst(regex : String[?], replacement : String[?]) : String[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a string derived from self by replacing the first match of regex by replacement.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">size() : Integer[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The number of characters in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">startsWith(s : String[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns true if 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> starts with the string s.

+				Every string starts with the empty string.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">substituteAll(oldSubstring : String[?], newSubstring : String[?]) : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a string derived from self by replacing all occurrences of oldSubstring by newSubstring.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">substituteFirst(oldSubstring : String[?], newSubstring : String[?]) : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return a string derived from self by replacing the first occurrence of oldSubstring by newSubstring.

+				Returns invalid if there is no first occurrence.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">substring(lower : Integer[?], upper : Integer[?]) : String[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The sub-string of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> starting at character number lower, up to and including character number upper. Character numbers run from 1 to self.size().

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toBoolean() : Boolean[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to a boolean value.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toInteger() : Integer[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to an Integer value.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toLower() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is a deprecated variant of toLowerCase() preserving compatibility with traditional Eclipse OCL behaviour.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toLowerCase() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to lower case, using the locale defined by looking up oclLocale in the current environment.

+				Otherwise, returns the same string as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toReal() : Real[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to a Real value.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toString() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toUpper() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is a deprecated variant of toUpperCase() preserving compatibility with traditional Eclipse OCL behaviour.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toUpperCase() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to upper case, using the locale defined by looking up oclLocale in the current environment.

+				Otherwise, returns the same string as 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">tokenize() : Sequence(String)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Partition 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> into a sequence substrings separated by any of space, line-feed, carriage-return, form-feed and horizontal-tab delimiters.

+				The delimiters are omitted from the return.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">tokenize(delimiters : String[?]) : Sequence(String)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Partition 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> into a sequence substrings separated by characters in the delimiters. The delimiters are omitted from the return.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">tokenize(delimiters : String[?], returnDelimiters : Boolean[?]) : Sequence(String)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Partition 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> into a sequence substrings separated by characters in the delimiters. If returnDelimeters is

+				true the returned sequence includes the delimiters, otherwise the delimiters are omitted.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">trim() : String[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Return 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> with leading and trailing whitespace removed.

+			</fo:block></fo:block><fo:block id="Type"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Type</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.31. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">Type</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML Type is the supertype of anything that may be used as a type.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclType"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclType</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">conformsTo(type2 : Type[?]) : Boolean[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Returns true if type2 conforms to self.</fo:block></fo:block><fo:block id="UniqueCollection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UniqueCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.32. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UniqueCollection(T)</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UniqueCollection type provides the shared functionality of the OrderedSet and Set

+				collections for which the elements are unique.

+				The common supertype of UniqueCollection is Collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="Collection"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">Collection(T)</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">-(s : UniqueCollection(OclAny)) : UniqueCollection(T)</fo:inline>

+				precedence: 

+				<fo:inline font-family="Inconsolata,Courier">ADDITIVE</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The elements of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, which are not in s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">intersection(c : Collection(T)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The intersection of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and c (i.e., the set of all elements that are in both 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and c).

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">symmetricDifference(s : UniqueCollection(OclAny)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set containing all the elements that are in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> or s, but not in both.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">union(s : UniqueCollection(T)) : Set(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The set consisting of all elements in 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and all elements in s.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Iterations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">sortedBy(i : T[?] | lambda : Lambda T() : OclAny[?]) : OrderedSet(T)</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Results in the ordered set containing all elements of the source collection.

+				The element for which body has the lowest value comes first, and so on.

+				The type of the body expression must have the &lt; operation defined.

+				The &lt; operation must return a Boolean value and must be transitive (i.e., if a &lt; b and b &lt; c, then a &lt; c).</fo:block></fo:block><fo:block id="UnlimitedNatural"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UnlimitedNatural</fo:inline>

+				</fo:inline>

+			</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">3.33. 

+				<fo:inline font-weight="bold">

+					<fo:inline font-family="Inconsolata,Courier">UnlimitedNatural</fo:inline>

+				</fo:inline>

+			</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard type UnlimitedNatural is used to encode the non-negative values of a multiplicity specification.

+				This includes a special 

+				<fo:inline font-style="italic">unlimited</fo:inline> value (*) that encodes the upper value of  a multiplicity specification.

+				UnlimitedNatural is itself an instance of the metatype UnlimitedNaturalType.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that UnlimitedNatural is not a subclass of Integer.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">conformsTo 

+				<fo:basic-link internal-destination="OclComparable"><fo:inline color="blue" text-decoration="underline">

+					<fo:inline font-family="Inconsolata,Courier">OclComparable</fo:inline>

+				</fo:inline></fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-weight="bold">Operations</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">max(i : OclSelf[?]) : UnlimitedNatural[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The maximum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> an i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">min(i : OclSelf[?]) : UnlimitedNatural[1]</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The minimum of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> an i.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">oclAsType(TT)(type : TT[?]) : TT[?] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline>, where 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is of the type identified by T.

+				The type T may be any classifier defined in the UML model;

+				if the actual type of 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> at evaluation time does not conform to T,

+				then the oclAsType operation evaluates to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard behavior is redefined for UnlimitedNatural. Numeric values may be converted to

+				Real or Integer, but the 

+				<fo:inline font-style="italic">unlimited</fo:inline> value may not.

+				Conversion of 

+				<fo:inline font-style="italic">unlimited</fo:inline> to Real or Integer returns 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:inline font-family="Inconsolata,Courier">toInteger() : Integer[1] invalidating</fo:inline>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Converts 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> to an Integer value unless 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is 

+				<fo:inline font-style="italic">unlimited</fo:inline> in which case 

+				<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is converted to 

+				<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline>.

+			</fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Tutorials</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Tutorials</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="Tutorials"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 4. Tutorials</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+			<fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:inline color="blue" text-decoration="underline">OCLinEcore tutorial</fo:inline></fo:basic-link> shows how 

+		</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1332D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1332E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to install OCL and the additional Editors and Examples</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13331"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to use the OCLinEcore editor</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13334"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13335"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to edit Ecore meta-models</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13338"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to enrich Ecore meta-models with OCL invariants, bodies and values</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1333B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to use embedded OCL for validation of models</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1333E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to use the OCL Console to practice evaluation of OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13341"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>to generate Java code for Ecore that uses the embedded OCL</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+			<fo:basic-link internal-destination="OCLInterpreterTutorial"><fo:inline color="blue" text-decoration="underline">Working with Classic OCL tutorial</fo:inline></fo:basic-link> shows how

+		</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1334A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1334B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the OCL Parser may be invoked from Java</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1334E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the OCL evaluator may be invoked from Java</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="OCLinEcoreTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCLinEcore tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.1. OCLinEcore tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13357"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13358"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The graphical styling of some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="Overview"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Overview </fo:marker><fo:block font-size="14pt">4.1.1. Overview </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this example you will</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13361"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13362"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Create an Ecore model using the OCLinEcore text editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13365"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Create a dynamic instance of that Ecore model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13368"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enrich the Ecore model with OCL using the OCLinEcore text editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1336B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Validate the model and observe the OCL enrichments</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1336E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Use the Interactive OCL Console to execute the OCL enrichments</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above is all performed without generating any Java code;

+					the models exploit EMF’s dynamic capabilities and the OCL integration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may then</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13375"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13376"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Create an Ecore genmodel</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13379"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Generate Java code for the Ecore model that invokes the OCL expressions.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">See the 

+					<fo:basic-link internal-destination="DebuggerTutorial"><fo:inline color="blue" text-decoration="underline">OCL Debugger tutorial</fo:inline></fo:basic-link> for debugging

+					See the 

+					<fo:basic-link internal-destination="CodeGenerationTutorial"><fo:inline color="blue" text-decoration="underline">Code Generator tutorial</fo:inline></fo:basic-link> for Java code generation

+				</fo:block></fo:block><fo:block id="References"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">References</fo:marker><fo:block font-size="14pt">4.1.2. References</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial assumes that the reader is familiar with generating models using EMF.

+					The reader is referred to 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(/help/topic/org.eclipse.emf.doc/tutorials/clibmod/clibmod.html)">Generating an EMF Model</fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Other references:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13392"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13393"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The Object Constraint Language: Getting Your Models Ready for MDA. Jos Warmer and Anneke Kleppe. (Addison-Wesley Object Technology) </fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13396"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.omg.org/spec/OCL)">OCL specification</fo:basic-link>.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1339D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://wiki.eclipse.org/OCL/OCLinEcore)">OCLinEcore wiki page</fo:basic-link>.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="OCLinEcoreTutorial-Installation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Installing the Eclipse OCL Examples</fo:marker><fo:block font-size="14pt">4.1.3. Installing the Eclipse OCL Examples</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please see the 

+					<fo:basic-link internal-destination="Installation"><fo:inline color="blue" text-decoration="underline">Instructions for installing the OCL Editors</fo:inline></fo:basic-link>.

+				</fo:block></fo:block><fo:block id="Troubleshooting"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Troubleshooting</fo:marker><fo:block font-size="14pt">4.1.4. Troubleshooting</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The editor currently provides syntax and semantic validation. It does not yet apply all the 

+					well-formedness validation rules, so some problems may be unreported. This is work in progress.

+					Sometimes spurious errors are displayed, which may go away with a 

+					<fo:inline font-weight="bold">Save</fo:inline>,

+					but may require an editor close and reopen. 

+				</fo:block></fo:block><fo:block id="UsingtheOCLinEcoretexteditorforEcore"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Using the OCLinEcore text editor for Ecore</fo:marker><fo:block font-size="14pt">4.1.5. Using the OCLinEcore text editor for Ecore</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There are many different (compatible) ways to create and edit Ecore models.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N133BE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133BF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>An Ecore Model may be created from an XSD schema file</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133C2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>An Ecore Model may be created from a Rose model file</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133C5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>An Ecore Model may be created from annotated Java file</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133C8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The Sample Ecore Editor provides tree editing</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133CB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The Ecore Tools project provides graphical editing</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N133CE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Papyrus provides UML editing that may be converted to Ecore</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Here we introduce the OCLinEcore editor that provides text editing, which is

+					appropriate when a non-trivial amount of OCL enrichment is required.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All the above approaches update a *.ecore file, so the user is free to choose

+					whichever editing approach is best suited for the planned changes.</fo:block><fo:block id="CreateaNewEMFProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.5.1. Create a New EMF Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will first create a new project for this example; so invoke 

+						<fo:inline font-weight="bold">File-&gt;New-&gt;Project...</fo:inline>

+						(left-click the 

+						<fo:inline font-weight="bold">File</fo:inline> menu, then left-click 

+						<fo:inline font-weight="bold">New</fo:inline>, then left-click 

+						<fo:inline font-weight="bold">Project...</fo:inline>).

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the 

+						<fo:inline font-weight="bold">New Project</fo:inline> dialog left-click to expand 

+						<fo:inline font-weight="bold">Eclipse Modeling Framework</fo:inline>, then left-click to select

+

+						<fo:inline font-weight="bold">Empty EMF Project</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N133FB"><fo:external-graphic src="url(images/4100-new_project.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click on 

+						<fo:inline font-weight="bold">Next</fo:inline> and in the 

+						<fo:inline font-weight="bold">New Empty EMF Project</fo:inline> dialog type 

+						<fo:inline font-weight="bold">Tutorial</fo:inline> as the project name.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13411"><fo:external-graphic src="url(images/4100-new_empty_emf_project.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click on 

+						<fo:inline font-weight="bold">Finish</fo:inline>.

+					</fo:block></fo:block><fo:block id="ConverttoanOCLProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.5.2. Convert to an OCL Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OCL project, analogously to many other Eclipse projects, has an OCL nature and an OCL builder that compile OCL resources so that any problems are shown as error/warning/info markers in the 

+						<fo:inline font-weight="bold">Problems View</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL nature may be added to our project by right-clicking on the project and then invoking 

+						<fo:inline font-weight="bold">Configure-&gt;Convert to OCL Project</fo:inline> from the context menu.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1342F"><fo:external-graphic src="url(images/4100-convert_to_ocl_project.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13435"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13436"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The OCL nature may be removed by 

+								<fo:inline font-weight="bold">Configure-&gt;Unconfigure OCL</fo:inline>.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Adding the OCL nature makes the project also-an-OCL-project. It does not displace any other natures that the project already has.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not necessary to add the OCL nature, but if you omit this step, every time you open an OCL editor, a pop-up will offer to add the OCL nature for you.</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							The EMF and UML2 projects do not provide corresponding natures to validate *.ecore or *.uml files. This would leave any OCL embedded in Ecore or UML unchecked and the user unaware of problems. The OCL nature therefore validates *.ecore or *.uml files as well as OCL files by default. This default can be adjusted by editing the value of the enabledExtensions in the .project file.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13447"><fo:external-graphic src="url(images/4100-project-commands.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							If you cannot see files such as 

+							<fo:inline font-weight="bold">.project</fo:inline>, open the 

+							<fo:inline font-weight="bold">View</fo:inline> menu by clicking the top right tool bar icon of the 

+							<fo:inline font-weight="bold">Package Explorer</fo:inline> and enable visibility of .resources in the 

+							<fo:inline font-weight="bold">Filters</fo:inline>.

+						</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="CreateaNewEcoreModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.5.3. Create a New Ecore Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now create a new model for this example.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">First right-click on the 

+						<fo:inline font-weight="bold">model</fo:inline> folder in the 

+						<fo:inline font-weight="bold">Tutorial</fo:inline> project to define the target folder and pop-up the context-sensitive menu.

+						Select 

+						<fo:inline font-weight="bold">New-&gt;Other...</fo:inline> then select the 

+						<fo:inline font-weight="bold">OCLinEcore Ecore File</fo:inline> from the 

+						<fo:inline font-weight="bold">OCL</fo:inline> category. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1347F"><fo:external-graphic src="url(images/4100-new_oclinecore-ecore.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							The alternative 

+							<fo:inline font-weight="bold">OCLinEcore Text File</fo:inline> creates a *.oclinecore text file which preserves whitespace and comments more faithfully but which must be converted to a *.ecore file for many modeling purposes. 

+						</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click 

+						<fo:inline font-weight="bold">Next</fo:inline> and enter 

+						<fo:inline font-weight="bold">Tutorial.ecore</fo:inline> as the file name. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13499"><fo:external-graphic src="url(images/4100-new_ecore_model_dialog.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click 

+						<fo:inline font-weight="bold">Finish</fo:inline> to open up an editor with some minimal example content demonstrating

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N134A5"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134A6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the nesting of attributes or operations or invariants within classes within packages</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134A9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use of OCL to define the body of an operation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134AC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the syntax for mutually opposite properties</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134AF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use of OCL to define an invariant and a custom error message</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N134B4"><fo:external-graphic src="url(images/4100-empty_oclinecore.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Close the editor by left-clicking the cross on the editor tab.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can see the normal Ecore view of the file by right-clicking on the 

+						<fo:inline font-weight="bold">Tutorial.ecore</fo:inline> file to pop-up the context-sensitive menu

+						and select 

+						<fo:inline font-weight="bold">Open With-&gt;Sample Ecore Model Editor</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N134C8"><fo:external-graphic src="url(images/4100-empty_ecore.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Close the editor by left-clicking the cross on the editor tab.</fo:block></fo:block><fo:block id="OCLinEcoreMetamodel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.5.4. Edit Ecore Model as OCLinEcore</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now open the Ecore model using the OCLinEcore text editor and provide some

+						initial content.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Right-click on the 

+						<fo:inline font-weight="bold">Tutorial.ecore</fo:inline> file to pop-up the context-sensitive menu

+						and select 

+						<fo:inline font-weight="bold">Open With-&gt;OCLinEcore Editor</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Now follow the following procedure to cut and paste the following text into the editor.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N134E2"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134E3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select all existing content (e.g. Ctrl-A)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134E6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>delete all (e.g. Ctrl-X)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134E9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>open 

+								<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/4100-metamodel.oclinecore)">[Text for cut and paste]</fo:basic-link>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134F0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>select and copy the text (e.g Ctrl-A and Ctrl-C) from the browser</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134F3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>paste (e.g Ctrl-V) in the original editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N134F6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>save the contents (e.g. Ctrl-S)</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N134FB"><fo:external-graphic src="url(images/4100-metamodel.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The syntax is defined in 

+						<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link>. It emulates OMG specifications with

+						‘name : type[multiplicity] { properties }’.

+					</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13507"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13508"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">import</fo:inline> associates an alias with  an external EPackage.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1350E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">package</fo:inline> introduces an EPackage with name, nsPrefix and nsURI.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13514"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">class</fo:inline> introduces an EClass with name and optional superclasses.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1351A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">attribute</fo:inline> introduces a property with a datatype type (an EAttribute).

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13520"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">property</fo:inline> introduces a property with a class type (an EReference).

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13526"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">#</fo:inline> introduces an opposite role name.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1352C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-family="Inconsolata,Courier">_'xxx'</fo:inline> escapes an awkward or reserved word identifier.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The import URI is the URI of a Package, so in the example the 

+						<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline>

+						is the URI of the model, 

+						<fo:inline font-family="Inconsolata,Courier">#</fo:inline> is the fragment separator and 

+						<fo:inline font-family="Inconsolata,Courier">/</fo:inline> is the path to

+						the Package at the root of the XMI document.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Completion assist (Ctrl Space) may be used for syntax assistance.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Format (Ctrl-Shift F) may be used to auto-format a selected range.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In order to discover a syntax for which completion assist is insufficient,

+						you may use the Sample Ecore Editor on a test file to create the kind of Ecore element

+						that you require, and then open the test file with the OCLinEcore editor to see the

+						corresponding textual syntax.</fo:block></fo:block><fo:block id="TheTutorialMetaModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.5.5. The Tutorial Meta-Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The example meta-model models a library with members and books

+						and loans of books to members. It may be viewed graphically using the Ecore Tools

+						(not part of this tutorial).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1354B"><fo:external-graphic src="url(images/4100-ecore_diagram.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that this diagram is an Ecore Diagram rather than a UML Diagram and so the default multiplicities for attributes is Ecore’s [0..1] rather than OCLinEcore’s and UML’s [1..1].</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note also that the OCL types 

+						<fo:inline font-family="Inconsolata,Courier">String</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">Integer</fo:inline> map

+						to 

+						<fo:inline font-family="Inconsolata,Courier">EString</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">EBigInteger</fo:inline> in Ecore.

+					</fo:block></fo:block></fo:block><fo:block id="CreateaDynamicModelInstance"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Create a Dynamic Model Instance</fo:marker><fo:block font-size="14pt">4.1.6. Create a Dynamic Model Instance</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">At this point a corresponding EMF tutorial would show how to generate Java code for

+					the meta-model and an editor for the meta-model. Here we are concerned with modeling, so we will 

+					continue with the models alone.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the editor view, double-click on 

+					<fo:inline font-weight="bold">Library</fo:inline> to select it and then right-click to show the context-sensitive menu

+					and then left-click on 

+					<fo:inline font-weight="bold">Create Dynamic Instance...</fo:inline> to start to create a

+					new Dynamic Model with 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> at its root.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						Creating a Dynamic Instance requires a valid *.ecore file to exist. It does not work

+						when editing *.oclinecore files.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1357A"><fo:external-graphic src="url(images/4100-create_dynamic_instance.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the 

+					<fo:inline font-weight="bold">Create Dynamic Instance</fo:inline> dialog select 

+					<fo:inline font-weight="bold">Tutorial/model</fo:inline> as

+					the parent folder and enter 

+					<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> as the file name for the 

+					dynamic model instance and left-click 

+					<fo:inline font-weight="bold">Finish</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13594"><fo:external-graphic src="url(images/4100-create_dynamic_instance_dialog.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The model is automatically opened for editing. </fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1359C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1359D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>If it is does not open with the Sample Reflective Ecore Model Editor, close the editor and open explicitly using 

+							<fo:inline font-weight="bold">Open With-&gt;Sample Reflective Ecore Model Editor</fo:inline>. This gives a tree-like presentation of the model. The properties of each node can be seen in the Properties View.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N135A6"><fo:external-graphic src="url(images/4100-initial_model.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N135AC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N135AD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>If the Properties View is not visible, right-click within the editor and left-click on 

+							<fo:inline font-weight="bold">Show Properties View</fo:inline>.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> and give it a name such as 

+					<fo:inline font-family="Inconsolata,Courier">lib</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From the right-button menu for 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> use 

+					<fo:inline font-weight="bold">New Child-&gt;Books Book</fo:inline> twice,

+					use 

+					<fo:inline font-weight="bold">New Child-&gt;Loans Loan</fo:inline> once and 

+					<fo:inline font-weight="bold">New Child-&gt;Members Member</fo:inline> three times

+					to populate the model with two books, one loan and three members. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click to select each of the Books and Members in turn and enter a name

+					such as 

+					<fo:inline font-family="Inconsolata,Courier">b1</fo:inline> or 

+					<fo:inline font-family="Inconsolata,Courier">m2</fo:inline> using the Properties View. Specify that b1

+					has one copy and that b2 has 2 copies.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N135D7"><fo:external-graphic src="url(images/4100-model_copies.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The books and members now have distinct titles in the outline. 

+					When you left-click to select the Loan and edit its Book and Member attributes,

+					the associated pull-down has meaningful entries. Specify that the Loan is for

+

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> by 

+					<fo:inline font-family="Inconsolata,Courier">m3</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N135E7"><fo:external-graphic src="url(images/4100-model_pull_down.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The configuration so far is simple, three members, two books and one loan. We can

+					validate that this by right-clicking on the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> node, and left-clicking

+					to 

+					<fo:inline font-weight="bold">Validate</fo:inline> 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> and all its children.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						Beware. If you have installed WST for web support, or M2E for Maven support, there is a rival 

+						<fo:inline font-weight="bold">Validate</fo:inline> with a checkbox near the bottom of the menu. It does not appear to do anything useful for EMF-based models. The correct 

+						<fo:inline font-weight="bold">Validate</fo:inline> is the one just above 

+						<fo:inline font-weight="bold">Live Validation</fo:inline>.

+					</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1360B"><fo:external-graphic src="url(images/4100-validate_menu.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since the model is so simple, it is difficult to have anything wrong; most of

+					the illegal modeling options such as a Loan composing rather than referencing a

+					Book are prevented by the Editor’s enforcement of the meta-model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13615"><fo:external-graphic src="url(images/4100-validation_successful.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1361B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1361C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>If you have an error at this point, a 

+							<fo:inline font-weight="bold">Details</fo:inline> button will lead you to some diagnostics that may clarify the problem. Pasting the following XMI into 

+							<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> should also resolve an entry problem.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13627"><fo:inline font-family="Inconsolata,Courier">&lt;?xml version="1.0" encoding="ASCII"?&gt;

+&lt;tut:Library xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"

+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+    xmlns:tut="http://www.eclipse.org/mdt/ocl/oclinecore/tutorial"

+    xsi:schemaLocation="http://www.eclipse.org/mdt/ocl/oclinecore/tutorial Tutorial.ecore"

+    name="lib"&gt;

+  &lt;books name="b1" copies="1"/&gt;

+  &lt;books name="b2" copies="2"/&gt;

+  &lt;loans book="//@books.1" member="//@members.2"/&gt;

+  &lt;members name="m1"/&gt;

+  &lt;members name="m2"/&gt;

+  &lt;members name="m3"/&gt;

+&lt;/tut:Library&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now create two further identical loans of 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> by 

+					<fo:inline font-family="Inconsolata,Courier">m3</fo:inline>. This

+					may conveniently be performed by left-clicking to select the existing loan,

+					typing Ctrl-C to copy it, left-clicking to select the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> as the new parent,

+					then typing Ctrl-V to paste it on the library. Repeat so that there are three

+					identical loans.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Validating the library should still be successful, although it is clearly wrong for

+					the two copies of 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> to participate in three loans.

+				</fo:block></fo:block><fo:block id="EnrichthemetamodelwithOCL"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Enrich the meta-model with OCL</fo:marker><fo:block font-size="14pt">4.1.7. Enrich the meta-model with OCL</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The semantic constraint that a book cannot be borrowed more times than there are copies of the book

+					is a simple example of a constraint that cannot be expressed by simple multiplicities; 

+					a more powerful capability is required that may potentially require evaluation

+					of functions of almost arbitrary complexity. The Object Constraint Language

+					provides this capability.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The constraint can be realized as an invariant on a book that specifies that

+					that (the size of the (selection of loans involving the book)) is less than or equal

+					to (the number of copies of the book).</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13645"><fo:inline font-family="Inconsolata,Courier">    invariant SufficientCopies:

+      library.loans-&gt;select(book=self)-&gt;size() &lt;= copies;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In more detail:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1364D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1364E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an invariant is defined whose name is 

+							<fo:inline font-family="Inconsolata,Courier">SufficientCopies</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13654"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>within the invariant on a Book, 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> is the instance of 

+							<fo:inline font-family="Inconsolata,Courier">Book</fo:inline> being validated.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1365D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">library.loans</fo:inline>, which is short for 

+							<fo:inline font-family="Inconsolata,Courier">self.library.loans</fo:inline>, navigates to the library and then to all loans in the library.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13666"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">-&gt;select(...)</fo:inline> is a collection iteration over the loans. It selects each loan for which its argument expression is true

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1366C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">book=self</fo:inline>, which is short for 

+							<fo:inline font-family="Inconsolata,Courier">aLoan : Loan | aLoan.book = self</fo:inline>, uses the 

+							<fo:inline font-family="Inconsolata,Courier">aLoan</fo:inline> iterator over each loan to select those for which the book is the book being validated

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13678"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">-&gt;size()</fo:inline> is a collection operation that just counts the number of selected loans

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1367E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">&lt;= copies</fo:inline>, which is short for 

+							<fo:inline font-family="Inconsolata,Courier">&lt;= self.copies</fo:inline> converts the count to 

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> if it is consistent, or 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> if inconsistent.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1368D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1368E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>it used to be necessary to close an XML editor such as 

+							<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> before modifying its meta-model since

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">a wide variety of unpleasant errors could occur if the meta-model changes after the model is loaded.

+					This EMF limitation now appears to have been resolved. It is nonetheless prudent to do so.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Add the invariant shown below to the meta-model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1369B"><fo:external-graphic src="url(images/4100-metamodel2.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/4100-metamodel2.oclinecore)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The required semantic is expressed by the 

+					<fo:inline font-family="Inconsolata,Courier">SufficientCopies</fo:inline> invariant constraint for a Book.

+					For a valid model the SufficientCopies invariant must always be true.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you reopen the 

+					<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> editor and invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline> for the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline>,

+					you will now get a validation error. Left click 

+					<fo:inline font-weight="bold">Details</fo:inline> for details.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N136BC"><fo:external-graphic src="url(images/4100-validation_unsuccessful.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">Details</fo:inline> identifies that the 

+					<fo:inline font-family="Inconsolata,Courier">SufficientCopies</fo:inline> invariant is not

+					satisfied for the 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> book.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Alternatively you may enable 

+					<fo:inline font-weight="bold">Live Validation</fo:inline> so that validation happens automatically with

+					error icons and hover text identifying problems.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you now change the first loan so that 

+					<fo:inline font-family="Inconsolata,Courier">b1</fo:inline> is borrowed and then validate

+					again, the problem is resolved. It is all right for 

+					<fo:inline font-family="Inconsolata,Courier">m3</fo:inline> to borrow

+					the one copy of 

+					<fo:inline font-family="Inconsolata,Courier">b1</fo:inline> and the two copies of 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Before introducing a further constraint of no duplicate loans, we will show

+					how OCL expressions can be exercised. OCL is a very powerful compact language;

+					the example hides a loop over all the loans. More complex examples may easily

+					involve three or four levels of hidden loops on a single line, but may equally

+					easily have simple errors. It is therefore helpful to simplify expressions

+					and use helper operations and properties to modularise them. These may then be

+					exercised using the OCL Console or debugged using the 

+					<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">OCL Debugger</fo:inline></fo:basic-link>.

+				</fo:block></fo:block><fo:block id="OCLinEcoreTutorial-Console"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Console</fo:marker><fo:block font-size="14pt">4.1.8. The OCL Console</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Console supports interactive execution of an OCL expression in the

+					context of a model instance.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To make the OCL Console visible, first make the 

+					<fo:inline font-weight="bold">Console</fo:inline> view visible by

+

+					<fo:inline font-weight="bold">Window-&gt;Show View-&gt;Console</fo:inline>. Then right click on the 

+					<fo:inline font-weight="bold">Open Console</fo:inline> and

+					left click on 

+					<fo:inline font-weight="bold">Interactive Xtext OCL</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13702"><fo:external-graphic src="url(images/4100-ocl_console_menu.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Alternatively, you can just invoke 

+					<fo:inline font-weight="bold">OCL-&gt;Show Xtext OCL Console</fo:inline> from the right button menu

+					within the 

+					<fo:inline font-weight="bold">Sample Ecore Editor</fo:inline> or 

+					<fo:inline font-weight="bold">Sample Reflective Ecore Editor</fo:inline>.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						The 

+						<fo:inline font-weight="bold">Xtext OCL</fo:inline> console is new Xtext-based functionality that uses the Pivot binding. It is

+						faster, and more compliant with the OCL specification, than the 

+						<fo:inline font-weight="bold">OCL</fo:inline> console that uses the

+						LPG parser and Ecore binding.

+					</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">Interactive Xtext OCL</fo:inline> console comprises two main text panes. The upper pane

+					displays results. The lower pane supports entry of queries.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click to select the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> in the 

+					<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> as the context

+					for a query. The title of the console view shows the that the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> has been selected as OCL’s 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> .

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Type 

+					<fo:inline font-family="Inconsolata,Courier">books</fo:inline> followed by a new line into the lower pane of the console. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The result of evaluating this query for the 

+					<fo:inline font-family="Inconsolata,Courier">Library</fo:inline> is shown.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13743"><fo:external-graphic src="url(images/4100-books_query.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Substantial OCL queries spanning many lines may be entered and so the cursor up

+					and cursor down keys move across lines. If you want to access an earlier query,

+					you may use the 

+					<fo:inline font-weight="bold">Page Up</fo:inline> or 

+					<fo:inline font-weight="bold">Page Down</fo:inline> keys to save typing them again.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can examine the execution of the query within out example invariant by selecting each of the books

+					in turn and executing 

+					<fo:inline font-family="Inconsolata,Courier">library.loans-&gt;select(book=self)</fo:inline>, to see that 

+					<fo:inline font-family="Inconsolata,Courier">b1</fo:inline>

+					has one Loan and 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> two.

+				</fo:block></fo:block><fo:block id="OCLinEcoreTutorialHelpers"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Helper Features and Operations</fo:marker><fo:block font-size="14pt">4.1.9. Helper Features and Operations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now introduce some helper attributes and operations to make

+					the OCL clearer and provide a richer meta-model API.

+					Close the 

+					<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> editor and modify the meta-model to include

+					the derived 

+					<fo:inline font-family="Inconsolata,Courier">loans</fo:inline> property and the helper operation 

+					<fo:inline font-family="Inconsolata,Courier">isAvailable()</fo:inline>.

+					Simplify the invariant to use the derived property.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13770"><fo:external-graphic src="url(images/4100-metamodel3.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/4100-metamodel3.oclinecore)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1377A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1377B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Note that the derived property must also be volatile to avoid problems when a model is loaded but has no content.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Reopen 

+					<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> and select 

+					<fo:inline font-weight="bold">Book b2</fo:inline> so that the derived property is visible in the 

+					<fo:inline font-weight="bold">Properties</fo:inline> view.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1378E"><fo:external-graphic src="url(images/4100-derived_property.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The helper operation can be evaluated in the 

+					<fo:inline font-weight="bold">Console</fo:inline> view by selecting book 

+					<fo:inline font-family="Inconsolata,Courier">b2</fo:inline> and typing 

+					<fo:inline font-family="Inconsolata,Courier">isAvailable()</fo:inline> for execution. (It is no longer necessary to close and reopen the Console after a metamodel change.)

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N137A2"><fo:external-graphic src="url(images/4100-helper_operation.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now add further helpers and constraints to enforce an

+					at most two loans per member policy and to require loans to be unique.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N137AA"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N137AB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>It is prudent, but perhaps no longer necessary, to close 

+							<fo:inline font-weight="bold">Tutorial.xmi</fo:inline> and the Console while changing the meta-model.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N137B4"><fo:external-graphic src="url(images/4100-metamodel4.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/4100-metamodel4.oclinecore)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The additional 

+					<fo:inline font-family="Inconsolata,Courier">books</fo:inline> property may be evaluated in the OCL

+					Console to show which books each member has on loan. The property may also be seen in the 

+					<fo:inline font-weight="bold">Properties</fo:inline> view. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the library again and invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline> from the right button menu.

+					There are now two validation failures. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N137CF"><fo:external-graphic src="url(images/4100-two_validation_errors.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block></fo:block><fo:block id="OCLinEcoreTutorial-genmodel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Generating Java Code</fo:marker><fo:block font-size="14pt">4.1.10. Generating Java Code</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We have shown how OCL may be used to enrich Ecore meta-models, how model instances can be created

+					and validated and how expressions can be evaluated, all without generating any Java code. The OCLinEcore support

+					provides the requisite Ecore EAnnotations to ensure that the dynamic execution of EMF activates an OCL

+					interpreter where OCL functionality is required.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Exactly the same facilities are available if you generate Java code for the Ecore model and as a result you gain some speed benefits. You have two choices for the realization of the OCL embedded with Ecore models.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N137DD"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N137DE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Generate Java code within the *Impl classes</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N137E1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Delete for interpretation at run-time</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first newer approach takes longer to generate the model since the OCL is compiled to Java incurring parser overheads at compile-time. However the OCL runs approximately five times faster and has fewer dependencies since no parsing is necessary at run-time. This approach is described In the 

+					<fo:basic-link internal-destination="CodeGenerationTutorial"><fo:inline color="blue" text-decoration="underline">Code Generation Tutorial</fo:inline></fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The second older approach embeds the OCL in the Java as unparsed stings so that parsing occurs overheads at run-time. The generated Java is smaller since the executable Java for OCL is larger than uncompiled strings. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We continue here with the older approach for which delegation to yyje interpreter is selected as a root 

+					<fo:inline font-weight="bold">Window-&gt;Preferences-&gt;OCL</fo:inline> relaization preference.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Generating Java code is exactly the same as for any other EMF project. (Prior to EMF 2.8, there was one important difference; you must explicitly set 

+					<fo:inline font-weight="bold">Operation Reflection</fo:inline> to true. The default for this changed to true in EMF 2.8.)

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+					<fo:inline font-weight="bold">Tutorial.ecore</fo:inline> file and invoke 

+					<fo:inline font-weight="bold">New-&gt;Other...</fo:inline> from the right button menu

+					and select 

+					<fo:inline font-weight="bold">Eclipse Modeling Framework</fo:inline> and 

+					<fo:inline font-weight="bold">EMF Generator Model</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1380C"><fo:external-graphic src="url(images/4100-new_emf_generator.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Next</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1381A"><fo:external-graphic src="url(images/4100-new_emf_generator_model.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Next</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13828"><fo:external-graphic src="url(images/4100-new_emf_generator_model_ecore.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Next</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13836"><fo:external-graphic src="url(images/4100-new_emf_generator_model_load.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Load</fo:inline> and 

+					<fo:inline font-weight="bold">Next</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13848"><fo:external-graphic src="url(images/4100-new_emf_generator_model_packages.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Finish</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">Tutorial.genmodel</fo:inline> editor opens.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1385C"><fo:external-graphic src="url(images/4100-gen_model.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Most of the default settings are suitable. The one that may not be is highlighted. Select the

+					root 

+					<fo:inline font-weight="bold">Tutorial</fo:inline> and scroll down the 

+					<fo:inline font-weight="bold">Properties</fo:inline> view and set 

+					<fo:inline font-weight="bold">Operation Reflection</fo:inline>

+					to true if it is not already true. (As from EMF 2.8 the default is true.)

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may now invoke 

+					<fo:inline font-weight="bold">Generate Model Code</fo:inline> from the right button menu of either 

+					<fo:inline font-weight="bold">Tutorial</fo:inline>

+					to generate Java models that invoke OCL.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1387C"><fo:external-graphic src="url(images/4100-gen_model_menu.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block id="JavaDetails"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.10.1. Java Details</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can check that the OCL appears in your Java by looking at 

+						<fo:inline font-weight="bold">tutorial.util.TutorialValidator.java</fo:inline>

+						where you’ll find the OCL expression as a String awaiting compilation at run-time, and

+						the validate invocation that triggers that compilation and execution.

+					</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1388C"><fo:inline font-family="Inconsolata,Courier">protected static final String MEMBER__AT_MOST_TWO_LOANS__EEXPRESSION = "\n" +

+  "\t\t\tloans-&gt;size() &lt;= 2";

+

+public boolean validateMember_AtMostTwoLoans(Member member, DiagnosticChain

+            diagnostics, Map&lt;Object, Object&gt; context) {

+  return

+    validate

+      (TutorialPackage.Literals.MEMBER,

+       member,

+       diagnostics,

+       context,

+       "http://www.eclipse.org/emf/2002/Ecore/OCL",

+       "AtMostTwoLoans",

+       MEMBER__AT_MOST_TWO_LOANS__EEXPRESSION,

+       Diagnostic.ERROR,

+       DIAGNOSTIC_SOURCE,

+       0);

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Similarly in 

+						<fo:inline font-weight="bold">BookImpl</fo:inline> you will find the declaration of a cached delegate and

+						the dynamic invocation that provokes the first time compilation.

+					</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13898"><fo:inline font-family="Inconsolata,Courier">protected static final EOperation.Internal.InvocationDelegate

+  IS_AVAILABLE__EINVOCATION_DELEGATE = ((EOperation.Internal)

+    TutorialPackage.Literals.BOOK___IS_AVAILABLE).getInvocationDelegate();

+

+public boolean isAvailable() {

+  try {

+    return (Boolean)

+        IS_AVAILABLE__EINVOCATION_DELEGATE.dynamicInvoke(this, null);

+  }

+  catch (InvocationTargetException ite) {

+    throw new WrappedException(ite);

+  }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL expression for the invocation delegate may be found in 

+						<fo:inline font-weight="bold">TutorialPackageImpl.createPivotAnnotations()</fo:inline>.

+					</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N138A4"><fo:inline font-family="Inconsolata,Courier">addAnnotation

+  (getBook__IsAvailable(), 

+   source, 

+   new String[] {

+   "body", "loans-&gt;size() &lt; copies"

+   });    

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="APIInvariants"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.1.10.2. API Invariants</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The invariants we have used so far do not contribute to the class API.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to have fine grain control of which validations are performed,

+						perhaps because in some incremental context not all are appropriate, you

+						may use the operation form of an invariant. </fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N138B2"><fo:inline font-family="Inconsolata,Courier">  class Book

+  {

+    operation sufficientCopies(diagnostics : ecore::EDiagnosticChain,

+      context : ecore::EMap&lt;ecore::EJavaObject,ecore::EJavaObject&gt;) : Boolean

+    {

+    body: library.loans-&gt;select(book=self)-&gt;size() &lt;= copies;

+    }

+    attribute name : String;

+    attribute copies : Integer;

+    property library#books : Library;

+  }

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the operation must have a Boolean return (true for valid) and

+						diagnostics and context arguments. </fo:block></fo:block></fo:block><fo:block id="Summary"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Summary</fo:marker><fo:block font-size="14pt">4.1.11. Summary</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To illustrate how to work with the OCL and Ecore as models we have</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N138C0"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138C1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Created an Ecore meta-model using the OCLinEcore text editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138C4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Created a dynamic model instance from that meta-model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138C7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enriched the meta-model with embedded OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138CA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Used the embedded OCL while validating the model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138CD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Queried the model using the Interactive OCL Console.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138D0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Evaluated OCL embedded in the meta-model in the Console.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To use OCL and Ecore as generated Java models we have</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N138D5"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138D6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Generated Java that exploits the embedded OCL.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:block><fo:block id="CompleteOCLTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.2. Complete OCL tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N138DF"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138E0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The graphical styling of some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="Overview2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Overview </fo:marker><fo:block font-size="14pt">4.2.1. Overview </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this example you will</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N138E9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138EA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Get an Overview of the Complete OCL language</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138ED"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Load a Complete OCL document into a third party application</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138F0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enhance Ecore validation for derived properties</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138F3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Validate an Ecore model using additional Complete OCL validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138F6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enhance UML validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138F9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Validate a UML model using additional Complete OCL validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138FC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enhance Xtext validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N138FF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Validate an Xtext grammar using additional Complete OCL validation</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="CompleteOCLUtility"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL Utility</fo:marker><fo:block font-size="14pt">4.2.2. Complete OCL Utility</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By itself, OCL is almost useless, since without any models to operate on, the constraints cannot achieve a great deal.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The simplest way to make OCL useful is to embed OCL expressions within a model to enrich the basic structural characteristics of a model with more complex behavior. OCLinEcore provides this capability for Ecore models. Papyrus provides comparable capabilities for UML models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial introduces the Complete OCL language which may be used to provide a self-standing document that complements a pre-existing meta-model.</fo:block></fo:block><fo:block id="LoadCompleteOCLTutorialExampleProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Load Complete OCL Tutorial Example Project</fo:marker><fo:block font-size="14pt">4.2.3. Load Complete OCL Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All the material for this tutorial is available as part of the CompleteOCLTutorial Example project that you

+					may load by selecting 

+					<fo:inline font-weight="bold">New</fo:inline> then 

+					<fo:inline font-weight="bold">Example...</fo:inline> using the right button context menu of the Project Explorer. This

+					should give the 

+					<fo:inline font-weight="bold">New Example</fo:inline> dialog in which you can select the 

+					<fo:inline font-weight="bold">OCL (OCL Constraint Language) Plugins</fo:inline> and the 

+					<fo:inline font-weight="bold">Complete OCL Tutorial</fo:inline> and then 

+					<fo:inline font-weight="bold">Next</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1392C"><fo:external-graphic src="url(images/4300-new-complete-ocl-tutorial1.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Then 

+					<fo:inline font-weight="bold">Finish</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1393A"><fo:external-graphic src="url(images/4300-new-complete-ocl-tutorial2.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you do not see these example projects, follow the 

+					<fo:basic-link internal-destination="Installation"><fo:inline color="blue" text-decoration="underline">Instructions for installing the OCL Editors</fo:inline></fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The resulting project has a few test files.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1394A"><fo:external-graphic src="url(images/4300-complete-ocl-tutorial-project.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block></fo:block><fo:block id="CompleteOCLTutorial-language"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL Language Overview</fo:marker><fo:block font-size="14pt">4.2.4. Complete OCL Language Overview</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL language is described in detail in the 

+					<fo:basic-link internal-destination="CompleteOCL"><fo:inline color="blue" text-decoration="underline">Complete OCL</fo:inline></fo:basic-link> section of this documentation.

+					In this tutorial we will provide just a brief overview of the language.

+					If not already open, double click on 

+					<fo:inline font-weight="bold">ExtraEcoreValidation.ocl</fo:inline> to show the following text that provides examples of many

+					important aspects of the Complete OCL syntax.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13960"><fo:external-graphic src="url(images/4300-extra-ecore-content.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block id="importdeclarations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.1. import declarations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The import statement is a serious omission from the OMG specification, since without it, any attempt to

+						align the Complete OCL constraints with external models relies on implementation-specific magic. The import

+						statement is therefore an extension that the Pivot-based Eclipse OCL prototypes for a future OCL specification revision.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Zero or more import statements may be present to specify the URIs of external model elements and optionally

+						alias names for those elements. In the example:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1396E"><fo:inline font-family="Inconsolata,Courier">import ecore : 'http://www.eclipse.org/emf/2002/Ecore#/'

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline> specifies the URI of the Ecore metamodel and 

+						<fo:inline font-family="Inconsolata,Courier">#/</fo:inline> is the fragment URI

+						navigating to the root element which is the Ecore package. The 

+						<fo:inline font-family="Inconsolata,Courier">ecore</fo:inline> specifies an alias for this package, which happens

+						to be the same as the name of the package. Within the Complete OCL document, the imported model element may be referred to by its

+						alias.

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							When using the Ecore and UML bindings, the Java API support for using Complete OCL documents requires implementation-specific magic;

+							the imported models must be loaded into the package registry by the invoking code. Import statements are not used.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Prior to the Juno release, import statements were not understood and so there was a usage conflict between Pivot and Ecore/UML bindings. Preparation of a

+							Complete OCL document using the Xtext editor, or usage with Pivot model and Xtext parser required import statements.

+							But re-use with the Ecore and UML LPG parser required the import statements to be removed.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since Juno, the LPG parser ignores the import statements, so they may be left in.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="packagecontextdeclaration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.2. package context declaration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A package context declaration may bracket declarations that complement model elements within the

+						complemented package.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1398D"><fo:inline font-family="Inconsolata,Courier">package ecore

+

+...

+

+endpackage

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This specifies that additional Complete OCL declarations will complement the pre-existing declarations of

+						the 

+						<fo:inline font-family="Inconsolata,Courier">ecore</fo:inline> package.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Multiple package context declarations may be used to complement multiple packages.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The package context declaration may be omitted if subsequent classifier context declarations have a fully qualified

+						name identifying the package.</fo:block></fo:block><fo:block id="classifiercontextdeclaration"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.3. classifier context declaration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A classifier context declaration introduces declarations that complement subsequent model elements within the

+						complemented classifier.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N139A2"><fo:inline font-family="Inconsolata,Courier">context EModelElement

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classifier context is terminated by a 

+						<fo:inline font-family="Inconsolata,Courier">context</fo:inline> or an 

+						<fo:inline font-family="Inconsolata,Courier">endpackage</fo:inline>.

+					</fo:block></fo:block><fo:block id="featuredefinitions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.4. feature definitions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Additional operations and properties may be defined for use within the Complete OCL document. These features

+						may be used as if they were part of the complemented meta-model.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N139B6"><fo:inline font-family="Inconsolata,Courier">def: asError(verdict : Boolean) : Boolean =

+	if verdict then true else null endif

+

+def: hasDerivation : Boolean = eAnnotations-&gt;select(source.startsWith(

+		'http://www.eclipse.org/emf/2002/Ecore/OCL'))-&gt;notEmpty()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A definition starts with the new feature name, then the parameters for operations and the feature type followed by an OCL expression that evaluates the operation or the property.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For properties such as 

+						<fo:inline font-family="Inconsolata,Courier">hasDerivation</fo:inline> there is very little difference between a property definition 

+						<fo:inline font-family="Inconsolata,Courier">hasDerivation</fo:inline> and a parameter-less operation definition 

+						<fo:inline font-family="Inconsolata,Courier">hasDerivation()</fo:inline>. The property definition

+						and usage is two characters shorter and may seem more natural. The operation definition has the advantage that

+						it can be overloaded in derived classes. 

+					</fo:block></fo:block><fo:block id="classinvariants"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.5. class invariants</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Invariants may be imposed on a complemented meta-model. The invariant comprises the name of the invariant followed by an OCL expression that

+						evaluates true when the invariant is satisfied.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N139CF"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsTransient: hasDerivation implies transient

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These invariants are executed when a model is validated in an application that has loaded the complementing Complete OCL document. The significance of this is explained in 

+						<fo:basic-link internal-destination="LoadCompleteOCLResource"><fo:inline color="blue" text-decoration="underline">OCL-&gt;Load Document Menu Action</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The readability of constraints can be significantly enhanced by the use of let-variables or the re-use, as above, of the 

+						<fo:inline font-family="Inconsolata,Courier">hasDerivation</fo:inline> helper property.  

+					</fo:block></fo:block><fo:block id="custommessages"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.6. custom messages</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL supports two extensions to invariants that allow the validation failure messages and severities to be customized.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N139E6"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsVolatile(

+'"volatile" must be specified for derived feature ' + self.toString()):

+asError(hasDerivation implies volatile)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The invariant name may be followed by a parenthesized OCL expression that computes a String to be used as the validation failure message.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The severity of a validation failure may be controlled by the non-true value evaluated by the invariant expression.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N139F0"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N139F1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:inline font-family="Inconsolata,Courier">false</fo:inline> return indicates a warning severity

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N139F7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:inline font-family="Inconsolata,Courier">null</fo:inline> return indicates an error severity

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N139FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> return indicates a fatal severity

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">See 

+						<fo:basic-link internal-destination="Integration-Messages"><fo:inline color="blue" text-decoration="underline">Custom Validation Messages</fo:inline></fo:basic-link> for more details.

+					</fo:block></fo:block><fo:block id="operationandpropertycontextdeclarations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.4.7. operation and property context declarations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Complete OCL also allows an incomplete operation or property declaration in the complemented meta-model to be completed.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13A0F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A10"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>initial value expressions or derived value constraints may be specified for properties.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A13"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>body expressions and precondition/postcondition constraints may be specified for operations.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These facilities are of limited use since OCLinEcore avoids the need for incomplete meta-models.</fo:block></fo:block></fo:block><fo:block id="LoadCompleteOCLResource"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL-&gt;Load Document Menu Action </fo:marker><fo:block font-size="14pt">4.2.5. OCL-&gt;Load Document Menu Action </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The major disclaimer in the above is that the Complete OCL only complements the complemented meta-model in applications

+					that have loaded the Complete OCL.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Prior to the Juno release, this meant that Complete OCL was only usable in custom Java applications since no standard

+					modeling applications would load the complementing document.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> menu action enables a Complete OCL document to be loaded into a wide variety of applications.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13A28"><fo:external-graphic src="url(images/4300-load-complete-ocl-resource-menu.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> menu action is added to the right button menu of applications with a ResourceSet accessible from the current selection.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						It has been observed that the extra menu action is not always immediately available, so if you do not see it, hit 

+						<fo:inline font-weight="bold">Esc</fo:inline> to cancel the menu, select something corresponding to a model object and right click again.

+					</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since Mars, suitable applications are</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13A3E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A3F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an editor generated from an Ecore meta-model</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13A42"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A43"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the Sample Ecore Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A46"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the UML Model Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A49"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the Papyrus Model Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A4C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>your model editor</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A4F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an editor generated by Xtext</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13A52"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A53"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the Xtext Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A56"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the MWE2 Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A59"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the OCLinEcore Editor</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13A5C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>your DSL editor</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> menu action activates the 

+					<fo:inline font-weight="bold">Load Complete OCL Document</fo:inline> dialog in which you can browse Registered Complete OCL Documents, the File system or the Workspace for one or more Complete OCL documents to load, or often more conveniently you can just Drag and Drop them from an Operating System Explorer or an Eclipse Explorer.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13A6B"><fo:external-graphic src="url(images/4300-load-complete-ocl-resource-dialog.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">After clicking 

+					<fo:inline font-weight="bold">OK</fo:inline> the documents load.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						Behind the scenes, it is necessary to install global wrappers around all complemented packages. These wrappers are sensitive to the ResourceSet for which complementing has been requested and so although this incurs a small performance penalty for use of the complemented packages in other applications, it should not affect the functional behavior of other applications. </fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="CompleteOCLTutorial-EcoreComplements"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Example Complete OCL complements for Ecore</fo:marker><fo:block font-size="14pt">4.2.6. Example Complete OCL complements for Ecore</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Sample Ecore Editor has acquired many useful validation rules, so that for many usages just invoking 

+					<fo:inline font-weight="bold">Validate</fo:inline> is quite sufficient. But what if it isn’t? Perhaps you have some style conventions that you wish to apply. Perhaps the built-in rules are not sufficient.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Prior to Juno and the 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> capability, your only choice would be to check out the Ecore Editor and create a custom variant. Now you can use Complete OCL to extend the Sample Ecore Editor.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will revisit the 

+					<fo:inline font-weight="bold">ExtraEcoreValidation.ocl</fo:inline> document that we have just examined and use it to rectify inadequate checking of derived properties by the Sample Ecore Editor. The document provides six invariants, at least three of which detect problems that were encountered by users during the Indigo release cycle.

+				</fo:block><fo:block id="DerivationIsVolatile"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.1. DerivationIsVolatile</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EMF code generation templates have a simple treatment of 

+						<fo:inline font-family="Inconsolata,Courier">volatile</fo:inline>. Non-volatile variables have an associated field which is returned by the 

+						<fo:inline font-family="Inconsolata,Courier">get</fo:inline> operation. This overrides any derivation that might be supplied.

+					</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13A9D"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsVolatile: asError(hasDerivation implies volatile)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We therefore want to diagnose that if an EStructuralFeature has a derivation then the volatile declaration is also present to avoid the derivation being ignored.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This problem is so serious that the basic expression is wrapped in the 

+						<fo:inline font-family="Inconsolata,Courier">asError</fo:inline> operation to convert the

+						default 

+						<fo:inline font-family="Inconsolata,Courier">true</fo:inline> / 

+						<fo:inline font-family="Inconsolata,Courier">false</fo:inline> okay/warning severity into the 

+						<fo:inline font-family="Inconsolata,Courier">true</fo:inline> / 

+						<fo:inline font-family="Inconsolata,Courier">null</fo:inline> okay/error severity.

+					</fo:block></fo:block><fo:block id="DerivationIsTransient"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.2. DerivationIsTransient</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EMF code generation templates have a similarly simple treatment of 

+						<fo:inline font-family="Inconsolata,Courier">transient</fo:inline>. Non-transient variables will be

+						serialized as part of a model save. This is not usually appropriate since the derived value is redundant and can be

+						recomputed when the model is loaded again.

+					</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13ABF"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsTransient: hasDerivation implies transient

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We therefore want to diagnose that a derivation is not serialized because of a default non-transient declaration.</fo:block></fo:block><fo:block id="DerivationIsNotComposed"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.3. DerivationIsNotComposed</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Composition is handled directly by EMF and it is not clear that it is appropriate to define an alternate

+						meaning of composition. It is pretty certain that EMF will not permit an alternate semantics.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13ACD"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsNotComposed: asError(hasDerivation implies not containment)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We therefore want to diagnose if a derivation is attempting to specify alternate composition semantics and

+						report an error if this occurs.</fo:block></fo:block><fo:block id="DerivationWithOppositeHasOppositeDerivation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.4. DerivationWithOppositeHasOppositeDerivation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Opposites are also handled directly by EMF, but it is possible to replace this functionality. However if the

+						forward functionality is replaced, it is very unlikely that EMF’s default reverse functionality will be appropriate.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13ADB"><fo:inline font-family="Inconsolata,Courier">inv DerivationWithOppositeHasOppositeDerivation:

+	hasDerivation and eOpposite &lt;&gt; null implies eOpposite.hasDerivation

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We therefore want to diagnose that a derivation that redefines the forward semantic of opposite also redefines

+						the corresponding reverse semantics.</fo:block></fo:block><fo:block id="DerivationIsUninitialized"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.5. DerivationIsUninitialized</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An initial value for a property may be specified as a simple default value or as a derived expression.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13AE9"><fo:inline font-family="Inconsolata,Courier">inv DerivationIsUninitialized:

+	hasDerivation implies defaultValue.oclIsUndefined()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We want to diagnose the occlusion of the derived expression by a default value.</fo:block></fo:block><fo:block id="DerivationDoesNotResolveProxies"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.6.6. DerivationDoesNotResolveProxies</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Derived expressions are not references.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13AF7"><fo:inline font-family="Inconsolata,Courier">inv DerivationDoesNotResolveProxies:

+	hasDerivation implies not resolveProxies

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We can therefore diagnose whether the EMF proxy resolution logic is not suppressed. </fo:block></fo:block></fo:block><fo:block id="CompleteOCLTutorial-EcoreValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validating Ecore with additional Complete OCL</fo:marker><fo:block font-size="14pt">4.2.7. Validating Ecore with additional Complete OCL</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the 

+					<fo:basic-link internal-destination="CompleteOCLTutorial-EcoreComplements"><fo:inline color="blue" text-decoration="underline">previous section</fo:inline></fo:basic-link> we described additional Complete OCL validation constraints to detect problems with inadequate Sample Ecore diagnosis of derived properties. We will now apply those constraints to a test file.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">EcoreTestFile.ecore</fo:inline> and use the right button menu to 

+					<fo:inline font-weight="bold">Open With-&gt;Sample Ecore Model Editor</fo:inline>. This is probably the default for double-clicking with the left button, but if you open with the OCLinEcore editor the required validation will not work (in Juno).

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Now right click within the Sample Ecore Editor pane as described in 

+					<fo:basic-link internal-destination="LoadCompleteOCLResource"><fo:inline color="blue" text-decoration="underline">OCL-&gt;Load Document Menu Action</fo:inline></fo:basic-link> and load 

+					<fo:inline font-weight="bold">ExtraEcoreValidation.ocl</fo:inline>. An additional Resource is shown in the editor tree.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select a model element such as the 

+					<fo:inline font-weight="bold">Bad</fo:inline> package and use the right button menu to invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13B29"><fo:external-graphic src="url(images/4300-extra-ecore-validation.png)" width="auto" height="auto" content-width="65%" content-height="65%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This shows an error. Depending on the order in which the constraints are evaluated, you may also see one or two warnings. You should use the 

+					<fo:basic-link internal-destination="ValidityView"><fo:inline color="blue" text-decoration="underline">Validity View</fo:inline></fo:basic-link> to see all failures.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If we now open 

+					<fo:inline font-weight="bold">EcoreTestFile.ecore</fo:inline> with the OCLinEcore editor we can see that the 

+					<fo:inline font-weight="bold">transient</fo:inline> and 

+					<fo:inline font-weight="bold">volatile</fo:inline> keywords are indeed missing.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13B45"><fo:external-graphic src="url(images/4300-extra-ecore-oclinecore.png)" width="auto" height="auto" content-width="65%" content-height="65%"/></fo:block>

+				</fo:block></fo:block><fo:block id="CompleteOCLTutorial-Updating"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Editing the Complete OCL</fo:marker><fo:block font-size="14pt">4.2.8. Editing the Complete OCL</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may edit the Complete OCL to experiment with alternate constraints or messages.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">However the Complete OCL complements the meta-model and EMF does not support live modification of meta-models. It is therefore necessary to restart the Sample Ecore Editor

+					and Reload the modified Complete OCL document in order to exploit the changes.</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						A solution for this may occur in a future release.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="CompleteOCLTutorial-UMLComplements"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Example Complete OCL complements for UML</fo:marker><fo:block font-size="14pt">4.2.9. Example Complete OCL complements for UML</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The extension of the Sample Ecore Editor validation described in 

+					<fo:basic-link internal-destination="CompleteOCLTutorial-EcoreValidation"><fo:inline color="blue" text-decoration="underline">Validating Ecore with additional Complete OCL</fo:inline></fo:basic-link> is applicable to any tree editor generated by EMF tooling.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">ExtraUMLValidation.ocl</fo:inline> file provides a very simple style check that class names start with an upper case letter.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13B69"><fo:external-graphic src="url(images/4300-extra-uml-content.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML meta-model is imported and an invariant is specified for the Class classifier which is fully qualified to avoid the need for a surrounding package context declaration.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may open the 

+					<fo:inline font-weight="bold">PapyrusTestFile.uml</fo:inline> with the UML Model Editor, load the 

+					<fo:inline font-weight="bold">ExtraUMLValidation.ocl</fo:inline>, select the 

+					<fo:inline font-weight="bold">Model</fo:inline> and then 

+					<fo:inline font-weight="bold">Validate</fo:inline> in the same way as for the Ecore example. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13B85"><fo:external-graphic src="url(images/4300-extra-uml-validation.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Unfortunately the Papyrus UML editor does not use the EValidator framework and so loading Complete OCL documents into Papyrus fails to enhance validation capabilities. To use additional Complete OCL functionality, you may load and validate in the UML Model Editor, then start the Papyrus editor which will then show the problem markers on diagram elements. Alternatively you may use 

+					<fo:basic-link internal-destination="ValidityView"><fo:inline color="blue" text-decoration="underline">Validity View</fo:inline></fo:basic-link> concurrently with Papyrus.

+				</fo:block></fo:block><fo:block id="CompleteOCLTutorial-XtextComplements"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Example Complete OCL complements for Xtext</fo:marker><fo:block font-size="14pt">4.2.10. Example Complete OCL complements for Xtext</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Xtext editors use EValidator and so a Complete OCL document may be loaded into an Xtext editor, including Xtext itself, to provide enhanced validation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-weight="bold">ExtraXtextValidation.ocl</fo:inline> file provides some demonstration style checks.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13B9F"><fo:external-graphic src="url(images/4300-extra-xtext-content.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Xtext root package is imported and within the package declaration context for the 

+					<fo:inline font-weight="bold">xtext</fo:inline> package, invariants are supplied for four classes. These are all just examples of how constraints may use the Xtext model. It is not suggested that users should use all of these constraints for real grammars.

+				</fo:block><fo:block id="NoAnonymousImports"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.10.1. NoAnonymousImports</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13BAF"><fo:inline font-family="Inconsolata,Courier">context ReferencedMetamodel

+inv NoAnonymousImports: alias &lt;&gt; null

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This invariant diagnoses whether any import statements omit the 

+						<fo:inline font-family="Inconsolata,Courier">as xxxx</fo:inline> model name.  

+					</fo:block></fo:block><fo:block id="NoActions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.10.2. NoActions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13BBE"><fo:inline font-family="Inconsolata,Courier">context Action

+inv NoActions : false

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This invariant diagnoses whenever an 

+						<fo:inline font-family="Inconsolata,Courier">{xxx}</fo:inline> action statement is used.  

+					</fo:block></fo:block><fo:block id="CamelCaseName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.10.3. CamelCaseName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13BCD"><fo:inline font-family="Inconsolata,Courier">context ParserRule

+inv CamelCaseName : name.matches('[A-Z][A-Za-z]*')

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This invariant verifies that the name of a parser rule starts with an upper case letter and uses only letters.  </fo:block></fo:block><fo:block id="UpperName"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.2.10.4. UpperName</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13BD9"><fo:inline font-family="Inconsolata,Courier">context xtext::TerminalRule

+inv UpperName : name = name.toUpperCase()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This invariant verifies that the name of a terminal rule is uppercase.  </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may open the 

+						<fo:inline font-weight="bold">XtextTestFile.xtext</fo:inline> with the Xtext Editor, load the 

+						<fo:inline font-weight="bold">ExtraXtextValidation.ocl</fo:inline> and then 

+						<fo:inline font-weight="bold">Validate</fo:inline> in the same way as the Ecore example. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The additional validations appear as warning markers in the editor. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13BF3"><fo:external-graphic src="url(images/4300-extra-xtext-validation.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							Unfortunately Xtext does not have a nice toString() method for its Concrete Syntax tree so the descriptions of erroneous elements are a little inelegant.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may edit the Xtext test file to delete the “as ecore” in the import statement and see that the additional Complete OCL constraints are contributing to the ongoing functionality of the editor. </fo:block></fo:block></fo:block><fo:block id="CompleteOCLEditor"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL Editor</fo:marker><fo:block font-size="14pt">4.2.11. Complete OCL Editor</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL editor is invoked automatically for an existing or new *.ocl file.

+					You can create an empty file using either 

+					<fo:inline font-weight="bold">New-&gt;File</fo:inline> or a partial content file using 

+					<fo:inline font-weight="bold">New-&gt;Other...</fo:inline> followed by 

+					<fo:inline font-weight="bold">OCL</fo:inline> and 

+					<fo:inline font-weight="bold">Complete OCL File</fo:inline>. The editor is Xtext-based and so has most of the facilities that you find in many other Eclipse editors.

+				</fo:block></fo:block><fo:block id="RoyalandLoyalExample"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Royal and Loyal Example</fo:marker><fo:block font-size="14pt">4.2.12. Royal and Loyal Example</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Royal and Loyal Example was first provided by Jos Warmer and Anneke Kleppe in 

+					<fo:inline font-style="italic">The Object Constraint Language: Getting Your Models Ready for MDA</fo:inline> and has subsequently been used in many tutorials. The example provides substantial examples of Complete OCL and Essential OCL. The models are available by invoking 

+					<fo:inline font-weight="bold">New-&gt;Example...-&gt;OCL (Object Constraint Language) Plugins</fo:inline>.

+				</fo:block></fo:block><fo:block id="Summary2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Summary</fo:marker><fo:block font-size="14pt">4.2.13. Summary</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To illustrate how to work with Complete OCL we have</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13C28"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C29"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Examined the Complete OCL language</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C2C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Examined constraints to rectify inadequate Ecore validation of derived features</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C2F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Loaded Complete OCL constraints to enhance validation of an Ecore model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C32"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Loaded Complete OCL constraints to enhance validation of a UML model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C35"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Loaded Complete OCL constraints to enhance validation of an Xtext grammar</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:block><fo:block id="SafeNavigationTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Safe navigation tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.3. Safe navigation tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial demonstrates the new safe navigation facilities of Eclipse Mars; Eclipse 4.5, EMF 2.11, OCL 6.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13C3E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C3F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="Overview3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Overview </fo:marker><fo:block font-size="14pt">4.3.1. Overview </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this example you will</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13C48"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C49"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>learn about navigation hazards</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C4C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>switch on safe navigation validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C4F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use safe navigation to eliminate hazards</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C52"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>use null free declarations to avoid many safe navigation hazards</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="References2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">References</fo:marker><fo:block font-size="14pt">4.3.2. References</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial continues the 

+					<fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:inline color="blue" text-decoration="underline">OCLinEcore tutorial</fo:inline></fo:basic-link>.

+				</fo:block></fo:block><fo:block id="Evaluationhazards"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Evaluation hazards</fo:marker><fo:block font-size="14pt">4.3.3. Evaluation hazards</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Evaluation of OCL expressions can give invalid results for internal problems</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13C65"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C66"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>divide by zero</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C69"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>index out of bound for an Ordered Collection</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13C6C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>most navigations of an operation or property from a null source </fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this tutorial we will show how to eliminate the hazards of unsafe navigation from null.</fo:block></fo:block><fo:block id="EnableSafeNavigationDiagnosis"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Enable Safe Navigation Diagnosis</fo:marker><fo:block font-size="14pt">4.3.4. Enable Safe Navigation Diagnosis</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Safe navigation is too new and experimental to be enabled by default. You must therefore enable it

+					explicitly by selecting the 

+					<fo:inline font-weight="bold">OCL-&gt;Unified Pivot Binding</fo:inline> settings from the workspace 

+					<fo:inline font-weight="bold">Window-&gt;Preferences</fo:inline>. You may

+					alternatively set project-specific preferences from Project property pages.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Change the 

+					<fo:inline font-weight="bold">Potential null navigation</fo:inline> and 

+					<fo:inline font-weight="bold">Redundant safe navigation</fo:inline> to 

+					<fo:inline font-weight="bold">Error</fo:inline> (or warning).

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13C8F"><fo:external-graphic src="url(images/4120-safe-navigation-preferences.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block></fo:block><fo:block id="SafeNavigationDiagnosis"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Safe Navigation Diagnosis</fo:marker><fo:block font-size="14pt">4.3.5. Safe Navigation Diagnosis</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will continue the OCLinEcore tutorial, which you may jump to the end of by 

+					<fo:inline font-weight="bold">New -&gt;Example... -&gt;OCL Plugins -&gt;OCLinEcore Tutorial</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+					<fo:inline font-weight="bold">Tutorial.ecore</fo:inline> and open with the 

+					<fo:inline font-weight="bold">OCLinEcore Editor</fo:inline>. 8 errors appear on 5 lines.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13CAB"><fo:external-graphic src="url(images/4120-raw-safe-navigation-errors.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A bit depressing; 5 out of 7 OCL lines have hazards on a long standing example. The problems arise wherever a null is permitted.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Non-collection values may be null whenever the multiplicity is implicitly or explicitly 

+					<fo:inline font-weight="bold">MyType[?]</fo:inline>, which permits either an instance of MyType or null. The alternative 

+					<fo:inline font-weight="bold">MyType[1]</fo:inline> prohibits a null value. The example metamodel is comparatively good with many properties such as 

+					<fo:inline font-weight="bold">Loan::book</fo:inline> defined as as 

+					<fo:inline font-weight="bold">Book[1]</fo:inline>. However 

+					<fo:inline font-weight="bold">Loan::date</fo:inline> is 

+					<fo:inline font-weight="bold">Date[?]</fo:inline> which seems unwise; why should a Loan have an unknown Date? 

+					<fo:inline font-weight="bold">Book::library</fo:inline> is correctly 

+					<fo:inline font-weight="bold">Library[?]</fo:inline> since there is no reason why Books may not found in Bookshops or Homes.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will examine the two errors after expanding short forms.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13CD9"><fo:external-graphic src="url(images/4120-expanded-safe-navigation-error.png)" width="auto" height="auto" content-width="80%" content-height="80%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-family="Inconsolata,Courier">self.library.loans</fo:inline> violates the UnsafeSourceCannotBeNull constraint because the source, 

+					<fo:inline font-family="Inconsolata,Courier">self.library</fo:inline>, can be null as a consequence of the 

+					<fo:inline font-weight="bold">library[?]</fo:inline> multiplicity.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Collection values, which are almost the raison d’etre of OCL, are a disaster safe-navigation-wise. Any OCL collection may contain a null value and so any OCL iteration may have a null iterator. Consequently the implicit iterator is typed as 

+					<fo:inline font-weight="bold">Loan[?]</fo:inline> and the source of 

+					<fo:inline font-family="Inconsolata,Courier">loan.book</fo:inline> is also unsafe.

+				</fo:block></fo:block><fo:block id="SafeNavigationOperators"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Safe Navigation Operators</fo:marker><fo:block font-size="14pt">4.3.6. Safe Navigation Operators</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Languages such as Groovy have introduced a safe navigation operator to mitigate problems with null navigation. It is proposed that OCL 2.5 will do so too. Eclipse OCL provides a prototype implementation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL provides two navigation operators</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13CFC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13CFD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the object navigation operator "."</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13D00"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the collection navigation operator "-&gt;".</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Safe navigation adds</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13D05"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13D06"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the safe object navigation operator "?."</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13D09"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the safe collection navigation operator "?-&gt;".</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The safe object navigation operator replaces any null navigation by 

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline>. Where 

+					<fo:inline font-family="Inconsolata,Courier">a</fo:inline> is an object value, 

+					<fo:inline font-family="Inconsolata,Courier">a?.b</fo:inline> is therefore equivalent to 

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13D17"><fo:inline font-family="Inconsolata,Courier">let a' = a in if a' &lt;&gt; null then a'.b else null endif

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The safe collection navigation operator eliminates all null terms from collection sources. 

+					<fo:inline font-family="Inconsolata,Courier">a?-&gt;b</fo:inline> is therefore equivalent to 

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13D22"><fo:inline font-family="Inconsolata,Courier">a-&gt;excluding(null)-&gt;b

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The safe implicit collection navigation operator similarly eliminates all null terms from collection. Where 

+					<fo:inline font-family="Inconsolata,Courier">a</fo:inline> is a collection value, 

+					<fo:inline font-family="Inconsolata,Courier">a.b</fo:inline> is therefore equivalent to 

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13D30"><fo:inline font-family="Inconsolata,Courier">a-&gt;excluding(null)-&gt;collect(b)

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We may use these operators to make the warnings go away.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13D3A"><fo:external-graphic src="url(images/4120-suppressed-safe-navigation-error.png)" width="auto" height="auto" content-width="80%" content-height="80%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first replacement for 

+					<fo:inline font-family="Inconsolata,Courier">library?.loans</fo:inline> is reasonable. The 

+					<fo:inline font-family="Inconsolata,Courier">library</fo:inline> really can be 

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline> and so, if it is null, the shortform execution is 

+					<fo:inline font-family="Inconsolata,Courier">null-&gt;select(book = self)</fo:inline>. Use of a collection operator on a non-collection object such as 

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline> causes oclAsSet() to be invoked which for 

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline> gives giving an empty set. Therefore 

+					<fo:inline font-family="Inconsolata,Courier">null.oclAsSet()-&gt;select(...)</fo:inline> selects elements from an empty set ensuring that the loans from a null library are an empty collection.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The second replacement for 

+					<fo:inline font-family="Inconsolata,Courier">loans?-&gt;select</fo:inline> makes the problem go away, but in practice requires almost every collection navigation operator to be prefixed lexically by “?” and operationally by an 

+					<fo:inline font-family="Inconsolata,Courier">exclude(null)</fo:inline>.

+				</fo:block></fo:block><fo:block id="NullfreeCollections"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Null-free Collections</fo:marker><fo:block font-size="14pt">4.3.7. Null-free Collections</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL and UML support four permutations of ordered/not-ordered, unique/not-unique to give useful Collection behaviors.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL unfortunately allows any collection to contain null, even though null collection elements are undesirable in almost

+					all applications, and as we have just seen safe, navigation imposes a redundant 

+					<fo:inline font-family="Inconsolata,Courier">exclude(null)</fo:inline> on many collection accesses.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The need for 

+					<fo:inline font-family="Inconsolata,Courier">exclude(null)</fo:inline> can be eliminated if OCL collections can be declared to be null-free, potentially giving 8 rather than 4 possible collection behaviors.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">UML and Ecore declarations of collections such as 

+					<fo:inline font-family="Inconsolata,Courier">MyType[2..*] {ordered}</fo:inline> support bounds, whereas Complete OCL supports nested collections such as 

+					<fo:inline font-family="Inconsolata,Courier">Set(Sequence(MyType))</fo:inline>. UML alignment for OCL 2.5 supports nested bounded collections such as 

+					<fo:inline font-family="Inconsolata,Courier">Set(Sequence(MyType[*])[+])</fo:inline>; a Set of one or more Sequences of zero or more MyTypes.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We can extend this notation by suffixing an element multiplicity following each collection multiplicity so that each element may be</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13D7C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13D7D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>non-null, explicitly 

+							<fo:inline font-family="Inconsolata,Courier">[...|1]</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13D83"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>implicitly or explicitly null/not-null 

+							<fo:inline font-family="Inconsolata,Courier">[...|?]</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not useful to have 

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline> loans so we can change the multiplicity of 

+					<fo:inline font-family="Inconsolata,Courier">Library::loans</fo:inline> to 

+					<fo:inline font-family="Inconsolata,Courier">Loan[*|1]</fo:inline>; zero or more Loan objects where each loan is not-null.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13D96"><fo:external-graphic src="url(images/4120-null-free-collection-suppression.png)" width="auto" height="auto" content-width="80%" content-height="80%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem with the iterator is now replaced by one with the iteration. The SafeSourceCanBeNull constraint is now violated because the source 

+					<fo:inline font-family="Inconsolata,Courier">library?.loan</fo:inline> cannot provide null elements as a consequence of the 

+					<fo:inline font-weight="bold">[==</fo:inline>|1==]* multiplicity. Note that the extended multiplicity is shown in messages and hover text to assist in understanding null-ness.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Revert back to 

+					<fo:inline font-family="Inconsolata,Courier">loans-&gt;select</fo:inline> and the new problem goes away; changing the multiplicity to declare a null-free collection makes the original expression safe without an additional safe navigation operator.

+				</fo:block></fo:block><fo:block id="DeclaringNullfreeCollectionsinEcore"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Declaring Null-free Collections in Ecore</fo:marker><fo:block font-size="14pt">4.3.8. Declaring Null-free Collections in Ecore</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We have just seen an extension to the multiplicity syntax so that in OCLinECore a null-free collection may be declared by the 

+					<fo:inline font-weight="bold">[...|1]</fo:inline> extended per-element multiplicity.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Ecore does not support null-free collections and so behind the scenes this is represented by an EAnnotation.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13DB6"><fo:inline font-family="Inconsolata,Courier">    &lt;eStructuralFeatures xsi:type="ecore:EReference" name="loans" ordered="false"

+        upperBound="-1" eType="#//Loan" containment="true"&gt;

+      &lt;eAnnotations source="http://www.eclipse.org/OCL/Collection"&gt;

+        &lt;details key="nullFree" value="true"/&gt;

+      &lt;/eAnnotations&gt;

+    &lt;/eStructuralFeatures&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="DeclaringNullfreeCollectionsinUML"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Declaring Null-free Collections in UML</fo:marker><fo:block font-size="14pt">4.3.9. Declaring Null-free Collections in UML</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">UML does not support null-free collections and so an OCLforUML profile is introduced to remedy this and other deficiencies.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A 

+					<fo:inline font-weight="bold">Collection</fo:inline> stereotype may be applied to a 

+					<fo:inline font-weight="bold">TypedElement</fo:inline> such as a 

+					<fo:inline font-weight="bold">Parameter</fo:inline> or 

+					<fo:inline font-weight="bold">Property</fo:inline> so that the 

+					<fo:inline font-family="Inconsolata,Courier">Collection::isNullFree</fo:inline> property defines the required null-free-ness.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Applying a stereotype to all collection properties and parameters is a little tedious and may be avoided by instead applying the 

+					<fo:inline font-weight="bold">Collections</fo:inline> stereotype to 

+					<fo:inline font-weight="bold">Class</fo:inline>es or even 

+					<fo:inline font-weight="bold">Package</fo:inline>s. The null-free-ness is determined by looking first for a 

+					<fo:inline font-weight="bold">Collection</fo:inline> stereotype, then searching the container hierarchy for the nearest 

+					<fo:inline font-weight="bold">Collections</fo:inline> stereotype.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A single 

+					<fo:inline font-weight="bold">Collections</fo:inline> stereotype application on a 

+					<fo:inline font-weight="bold">Package</fo:inline> is sufficient to declare all its collections null-free This is often appropriate, however if any collections can contain nulls, the package-level 

+					<fo:inline font-weight="bold">Collections</fo:inline> stereotype must be overridden for each 

+					<fo:inline font-weight="bold">TypedElement</fo:inline> where the collection may contain a null.

+				</fo:block></fo:block></fo:block><fo:block id="CodeGenerationTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Code Generation tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.4. Code Generation tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13E05"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E06"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The graphical styling of some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The direct OCL to Java Code generator has matured significantly from its experimental functionality for the Juno release. It is now the recommended approach. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this tutorial we will continue the OCLinEcore tutorial and show how to get a direct Java representation of the Ecore model avoiding the need for run-time compilation.</fo:block><fo:block id="LoadOCLinEcoreTutorialExampleProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Load OCLinEcore Tutorial Example Project</fo:marker><fo:block font-size="14pt">4.4.1. Load OCLinEcore Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All the material for this tutorial is available as part of the OCLinEcore Example project that you

+					may load by selecting 

+					<fo:inline font-weight="bold">New</fo:inline> then 

+					<fo:inline font-weight="bold">Example...</fo:inline> using the right button context menu of the Project Explorer. This

+					should give the 

+					<fo:inline font-weight="bold">New Example</fo:inline> dialog in which you can select the 

+					<fo:inline font-weight="bold">OCL (OCL Constraint Language) Plugins</fo:inline> and the 

+					<fo:inline font-weight="bold">OCLinEcore Tutorial</fo:inline>.

+				</fo:block></fo:block><fo:block id="Directcode"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Direct code</fo:marker><fo:block font-size="14pt">4.4.2. Direct code</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In 

+					<fo:basic-link internal-destination="OCLinEcoreTutorial-genmodel"><fo:inline color="blue" text-decoration="underline">Generating Java Code</fo:inline></fo:basic-link> we saw how to create a genmodel and how to generate code from it that realizes OCL as text strings in the Java implementation files. These text strings are lazily compiled at run-time.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Whether to generate OCL as text strings for interpretation or to convert directly to Java is determined by the Code Generation Mode. This may be configured using  the project property or workspace preference as described in 

+					<fo:basic-link internal-destination="CodeGenerationMode"><fo:inline color="blue" text-decoration="underline">Code Generation Mode</fo:inline></fo:basic-link>. So use 

+					<fo:inline font-weight="bold">Window-&gt;Preferences-&gt;OCL</fo:inline> to change the 

+					<fo:inline font-weight="bold">Realisation of OCL embedded in Ecore models</fo:inline> setting to 

+					<fo:inline font-weight="bold">Generate Java code in *Impl classes</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Now open 

+					<fo:inline font-weight="bold">Tutorial.genmodel</fo:inline>, select the root 

+					<fo:inline font-family="Inconsolata,Courier">Tutorial</fo:inline> resource and invoke 

+					<fo:inline font-weight="bold">Generate Model Code</fo:inline> to (re)generate the Java code. This will take somewhat longer as additional work items show that the OCL is being compiled and that Xtend templates are generating additional Java code.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						Note that you must close 

+						<fo:inline font-weight="bold">Tutorial.genmodel</fo:inline> while changing the Code Generation Mode.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may also need to delete the autogenerated *Impl files if you change from one mode of generation to another.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">That is all there is to it. Your model code is now 100% Java; no OCL parsing is needed at run-time. </fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						If you see errors related to undefined ...__DIAGNOSTICCHAIN_MAP, you need tio edit your *.genmodel to make sure that the Model-&gt;Operation Reflection option on the overall GenModel is set true.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="UsingaGenAnnotation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Using a GenAnnotation</fo:marker><fo:block font-size="14pt">4.4.3. Using a GenAnnotation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Changing the default genmodel setting is a little dangerous since the change will affect any other genmodel activities you perform. It is therefore advisable to reset the workspace preference setting to its default and use a GenAnnotation to embed the setting in the genmodel.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The easiest way to create the GenAnnotation that ensure direct code generation regardless of workspace or project preferences, is to paste the following three lines into your genmodel just above the 

+					<fo:inline font-family="Inconsolata,Courier">foreignModel</fo:inline> or 

+					<fo:inline font-family="Inconsolata,Courier">genPackages</fo:inline> element.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13E6E"><fo:inline font-family="Inconsolata,Courier">  &lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel"&gt;

+    &lt;details key="Use Delegates" value="false"/&gt;

+  &lt;/genAnnotations&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Of course, if you want to enforce delegation you should set the 

+					<fo:inline font-family="Inconsolata,Courier">value</fo:inline> to 

+					<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you don’t like cutting and pasting into XMI files, you can achieve the same effect with the GenModel editor by:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13E7E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E7F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Enable annotation display using 

+							<fo:inline font-weight="bold">Generator-&gt;Show Annotations</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E86"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Invoke 

+							<fo:inline font-weight="bold">Annotate</fo:inline> from the right button context menu of the genmodel root element

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E8D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Use the 

+							<fo:inline font-weight="bold">Properties View</fo:inline> to set the GenAnnotation source to 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/OCL/GenModel</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E97"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Invoke 

+							<fo:inline font-weight="bold">Add Detail</fo:inline> from the right button context menu of the GenAnnotation

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13E9E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Use the 

+							<fo:inline font-weight="bold">Properties View</fo:inline> to set the Detail key to 

+							<fo:inline font-family="Inconsolata,Courier">Use Delegates</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13EA8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Use the 

+							<fo:inline font-weight="bold">Properties View</fo:inline> to set the Detail value to 

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N13EB4"><fo:external-graphic src="url(images/4400-genannotation.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A further 

+					<fo:inline font-weight="bold">Use Null Annotations</fo:inline> GenAnnotation may be used to control whether @NonNull and @Nullable annotations are emitted in the generated code.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N13EC0"><fo:inline font-family="Inconsolata,Courier">  &lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel"&gt;

+    &lt;details key="Use Delegates" value="false"/&gt;

+    &lt;details key="Use Null Annotations" value="true"/&gt;

+  &lt;/genAnnotations&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="DebuggerTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Debugger tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.5. Debugger tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial has been updated for Eclipse Mars: Eclipse 4.5, EMF 2.11, OCL 6.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13ECC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13ECD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this tutorial we will continue the 

+				<fo:basic-link internal-destination="OCLinEcoreTutorial"><fo:inline color="blue" text-decoration="underline">OCLinEcore tutorial</fo:inline></fo:basic-link> and show how to use the 

+				<fo:basic-link internal-destination="Debugger"><fo:inline color="blue" text-decoration="underline">OCL debugger</fo:inline></fo:basic-link> to debug:

+			</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13EDA"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13EDB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>constraints typed manually in the Console View</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13EDE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>embedded OCLinEcore validation failures from the Validity View</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13EE1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Complete OCL validation failures from the Validity View</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="LoadOCLinEcoreTutorialExampleProject2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Load OCLinEcore Tutorial Example Project</fo:marker><fo:block font-size="14pt">4.5.1. Load OCLinEcore Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The material for the first two parts of this tutorial is available as part of the OCLinEcore Example project that you

+					may load by selecting 

+					<fo:inline font-weight="bold">New</fo:inline> then 

+					<fo:inline font-weight="bold">Example...</fo:inline> using the right button context menu of the Project Explorer. This

+					should give the 

+					<fo:inline font-weight="bold">New Example</fo:inline> dialog in which you can select the 

+					<fo:inline font-weight="bold">OCL (OCL Constraint Language) Plugins</fo:inline> and the 

+					<fo:inline font-weight="bold">OCLinEcore Tutorial</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The material for the third parts of this tutorial is available as part of the CompleteOCL Example project that you

+					may load in a similar way.</fo:block></fo:block><fo:block id="TheOCLDebugger"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Debugger</fo:marker><fo:block font-size="14pt">4.5.2. The OCL Debugger</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL debugger is a customization of the Eclipse debugger framework, so most of its functionality should present few surprises to those familiar with the Java debugger.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13F08"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F09"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a Stack View that shows the current line number in nested Evaluation Environments</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F0C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a Variables View in which local and intermediate variables can be re-examined</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F0F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an Editor in which the source is highlighted to show the next AST node to be evaluated</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F12"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an Outline in which the source is shown in tree form</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F15"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a Breakpoints View in which breakpoints can be controlled</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will demonstrate some of these facilities by debugging a simple example.</fo:block></fo:block><fo:block id="VerySimpleDebugsession"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Very Simple Debug session</fo:marker><fo:block font-size="14pt">4.5.3. Very Simple Debug session</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will debug the execution of the OCL expression 

+					<fo:inline font-weight="bold">self.name</fo:inline> on an EPackage.

+				</fo:block><fo:block id="Startingthedebugger"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.5.3.1. Starting the debugger</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double click on 

+						<fo:inline font-weight="bold">model/Tutorial.ecore</fo:inline> to open the model and expand the top entry to show the EPackage.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13F30"><fo:external-graphic src="url(images/4500-simple-debugger-model.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the model opens with another editor, close it, and open with the Sample Ecore Editor by selecting 

+						<fo:inline font-weight="bold">model/Tutorial.ecore</fo:inline> and then 

+						<fo:inline font-weight="bold">Open With-&gt;Sample Ecore Model Editor</fo:inline> from the context menu.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+						<fo:inline font-weight="bold">tutorial</fo:inline> EPackage and invoke 

+						<fo:inline font-weight="bold">OCL-&gt;Show Xtext OCL Console</fo:inline> from the context menu. (Wait a second or two.)

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">At the bottom of the Console window type 

+						<fo:inline font-weight="bold">self.name</fo:inline>, then hit the Enter key. Then hit the Page Up key to redisplay your entry.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13F52"><fo:external-graphic src="url(images/4500-simple-debugger-input.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Console runs an evaluation automatically after hitting Enter and shows the evaluation result: 

+						<fo:inline font-weight="bold">'tutorial'</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Console View provides the two pieces of information necessary to run the OCL debugger:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13F60"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F61"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an EObject to be used as OCL’s 

+								<fo:inline font-weight="bold">self</fo:inline>; the Console shows the current selection just below its tool bar

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F68"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an OCL expression to execute</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Start the debugger by clicking the debug icon in the Console View tool bar. (Wait a second or two.)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The debugger perspective should appear automatically. If it doesn’t, you can open the Debug perspective manually by invoking 

+						<fo:inline font-weight="bold">Window-&gt;Perspective-&gt;Open Perspective-&gt;Debug</fo:inline> from the Eclipse menu bar.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N13F75"><fo:external-graphic src="url(images/4500-simple-debugger-image.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Complete OCL document is created automatically to encapsulate the OCL expression inside as an additional operation for the type of the 

+						<fo:inline font-weight="bold">self</fo:inline> object. This document is shown in the editor; it is readonly. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The stack display shows the context as line 5 of 

+						<fo:inline font-weight="bold">oclDebugExpression()</fo:inline> in the synthesized Complete OCL document.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+						<fo:inline font-weight="bold">oclDebugExpression()</fo:inline> line in the stack display; 

+						<fo:inline font-weight="bold">self</fo:inline> is highlighted in the Complete OCL document, since the next evaluation to perform is to evaluate the VariableExp AST node that performs the self access.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Variables View shows two variables.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13F93"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F94"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-weight="bold">self</fo:inline> is the OCL self object

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13F9B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+								<fo:inline font-weight="bold">$pc</fo:inline> is a synthetic variable representing the current Program Counter

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Outline View displays a slightly trimmed OCL Abstract Syntax tree; you may choose to close this view. In a future release it may change to support breakpoints. The view shows</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13FA4"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FA5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:inline font-weight="bold">Import</fo:inline> for 

+								<fo:inline font-weight="bold">ecore</fo:inline> 

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FB0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:inline font-weight="bold">Class</fo:inline> named 

+								<fo:inline font-weight="bold">EPackage</fo:inline> containing 

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FBB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:inline font-weight="bold">Operation</fo:inline> named 

+								<fo:inline font-weight="bold">oclDebugExpression</fo:inline> containing

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FC6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+								<fo:inline font-weight="bold">ExpressionInOCL</fo:inline> whose 

+								<fo:inline font-weight="bold">OwnedBody</fo:inline> is a 

+								<fo:inline font-weight="bold">PropertyCallExp</fo:inline> for 

+								<fo:inline font-weight="bold">name</fo:inline> and whose source is

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FD9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+								<fo:inline font-weight="bold">VariableExp</fo:inline> for 

+								<fo:inline font-weight="bold">self</fo:inline>.

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The outline shows fuller type signatures to assist in debugging.</fo:block></fo:block><fo:block id="ExploringVariables"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.5.3.2. Exploring Variables</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Variables View provides an ability to drill down arbitrarily to examine the data available to your program.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The left column of the display presents the name of a variable and may be expanded to navigate to parts of the data referenced by the variable. Part name displays are currently shown 0-based, rather than 1-based as in OCL. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The right column variously displays the type of parts that can be expanded and the values of those that cannot. An OCL syntax is used so Strings appear in single quotes and Collections use names such as OrderedSet. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bottom line shows a textual rendering of the selected variable. For many types of data a helpful rendering is available. For others the fallback is to the default Java toString() functionality. The text can be customized by</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N13FF2"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FF3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the 

+								<fo:inline font-weight="bold">org.eclipse.ocl.pivot.utilities.getText()</fo:inline> method if the object implements 

+								<fo:inline font-weight="bold">Labelable</fo:inline>

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N13FFE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the 

+								<fo:inline font-weight="bold">LabelUtil.QUALIFIED_NAME_REGISTRY</fo:inline> if an 

+								<fo:inline font-weight="bold">org.eclipse.ocl.pivot.label_generator</fo:inline> extension point has a registration for the objects' class

+							</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click on the expand/collapse icon to the left of 

+						<fo:inline font-weight="bold">$pc</fo:inline> to expand it and allow inspection of the OCL AST. A VariableExp is next to execute and its 

+						<fo:inline font-weight="bold">$pc.referredProperty</fo:inline> or 

+						<fo:inline font-weight="bold">$pc.type</fo:inline> may be examined to see more program detail.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click on the expand/collapse icon to the left of 

+						<fo:inline font-weight="bold">self</fo:inline>, which is an 

+						<fo:inline font-weight="bold">ecore::EPackage</fo:inline>, to expand it and shows its fields such as 

+						<fo:inline font-weight="bold">name</fo:inline> which is 

+						<fo:inline font-weight="bold">'tutorial'</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click on the expand/collapse icon to the left of 

+						<fo:inline font-weight="bold">self.eClassifiers</fo:inline> to show the four classifiers.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+						<fo:inline font-weight="bold">self.eClassifiers[ 1 ]</fo:inline> so that the bottom line display shows that the second is named Book. 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N14037"><fo:external-graphic src="url(images/4500-simple-debugger-image.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Variables View provides more insight that the Sample Ecore Properties View, so you may find it convenient to use a trivial OCL debugger session using 

+						<fo:inline font-weight="bold">self</fo:inline> as the OCL expression to browse arbitrary model data.

+					</fo:block></fo:block><fo:block id="SteppingExecution"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.5.3.3. Stepping Execution</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click F5 or the 

+						<fo:inline font-weight="bold">Step Into</fo:inline> icon to advance execution by one AST node evaluation.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1404F"><fo:external-graphic src="url(images/4500-simple-debugger-step1.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The editor now highlights 

+						<fo:inline font-weight="bold">.name</fo:inline>; 

+						<fo:inline font-weight="bold">$pc</fo:inline> shows a PropertCallExp as the next execution. 

+						<fo:inline font-weight="bold">$pc.referredProperty</fo:inline> shows that it is 

+						<fo:inline font-weight="bold">ecore::ENamedElement:name</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An additional synthetic variable 

+						<fo:inline font-weight="bold">$owwnedSource</fo:inline> shows the result of the 

+						<fo:inline font-weight="bold">self</fo:inline> evaluation that forms the source term of the PropertyCallExp. As expected this is the same as 

+						<fo:inline font-weight="bold">self</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click F5 or the 

+						<fo:inline font-weight="bold">Step Into</fo:inline> icon again to advance execution by a further AST node evaluation.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1407D"><fo:external-graphic src="url(images/4500-simple-debugger-step2.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The whole of 

+						<fo:inline font-weight="bold">self.name</fo:inline> is highlighted and 

+						<fo:inline font-weight="bold">$pc</fo:inline> shows that the overall ExpressionInOCL is about to be evaluated. The synthetic 

+						<fo:inline font-weight="bold">$ownedBody</fo:inline> for its input shows that 

+						<fo:inline font-weight="bold">self.name</fo:inline> evaluated to 

+						<fo:inline font-weight="bold">'tutorial'</fo:inline>.

+					</fo:block></fo:block></fo:block><fo:block id="DebuggingaValidationfailure"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Debugging a Validation failure</fo:marker><fo:block font-size="14pt">4.5.4. Debugging a Validation failure</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL is useful for elaborating models with additional well-formedness rules, but when these fail it can be difficult to understand why a failure occurred, particularly if the bug is in the OCL rather than the model. We will now show how the OCL debugger can be used to debug a validation failure.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double click on 

+					<fo:inline font-weight="bold">model/Tutorial.xmi</fo:inline> to open the model, and expand the top two entries to show some detail.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N140A7"><fo:external-graphic src="url(images/4500-validation-debugger-model.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the model opens with another editor, close it, and open with the Sample Reflective Ecore Model Editor by selecting 

+					<fo:inline font-weight="bold">model/Tutorial.xmi</fo:inline> and then 

+					<fo:inline font-weight="bold">Open With-&gt;Sample Reflective Ecore Model Editor</fo:inline> from the context menu.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the first line and invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline> from the context menu. (Wait a second.) Optionally click on Details.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N140BF"><fo:external-graphic src="url(images/4500-validation-debugger-errors.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These error messages provide insufficient precision to really understand the problems, so click 

+					<fo:inline font-weight="bold">OK</fo:inline> to dismiss the popup then select 

+					<fo:inline font-weight="bold">Book b2</fo:inline>, which has an error, and invoke 

+					<fo:inline font-weight="bold">OCL-&gt;Show Validity View</fo:inline> to provide more insight.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the Validity View shows question marks rather than red/green/amber status decorations, Click the Run icon in the Validity View tool bar.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N140D7"><fo:external-graphic src="url(images/4500-validation-debugger-vv1.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click the 

+					<fo:inline font-weight="bold">Pin</fo:inline> icon in the Validity View tool bar to avoid thrashing whenever you change mouse selection.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Uncheck the top 

+					<fo:inline font-weight="bold">ecore</fo:inline> line in the Metamodel Constraints since we are not interested in the successful Ecore metamodel constraints just those in the 

+					<fo:inline font-weight="bold">tutorial</fo:inline> metamodel.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Similarly uncheck the bottom 

+					<fo:inline font-weight="bold">tutorial</fo:inline> line in the Model Elements since we are not interested in the successful metamodel, just those in the tutorial model.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click on the + tool bar icon so that the detail is shown.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N140F7"><fo:external-graphic src="url(images/4500-validation-debugger-vv2.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will now debug the failure of the 

+					<fo:inline font-weight="bold">tutorial::Book::SufficientCopies</fo:inline> on the 

+					<fo:inline font-weight="bold">Library lib::Book b2</fo:inline> model element. Select either of the leaf warnings, that is either the 

+					<fo:inline font-weight="bold">tutorial::Book::SufficientCopies</fo:inline> child of 

+					<fo:inline font-weight="bold">Book b2</fo:inline> in the left hand pane, or the 

+					<fo:inline font-weight="bold">Library lib::Book b2</fo:inline> child of 

+					<fo:inline font-weight="bold">SufficientCopies</fo:inline> in the right hand pane, and invoke 

+					<fo:inline font-weight="bold">Debug Single Enabled Selection</fo:inline>. Wait a second or two and the debugger starts. If it doesn’t, open the Debugger perspective manually.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1411D"><fo:external-graphic src="url(images/4500-validation-debugger-image.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+					<fo:inline font-weight="bold">oclDebuggerExpression()</fo:inline> stack line.

+					The debugger shows 

+					<fo:inline font-weight="bold">library.loans-&gt;select((book = self))-&gt;size() &lt;= copies</fo:inline> with 

+					<fo:inline font-weight="bold">l</fo:inline> highlighted as the next execution. 

+					The outline shows that the 

+					<fo:inline font-weight="bold">VariableExp</fo:inline> for 

+					<fo:inline font-weight="bold">self</fo:inline> is next to execute. The 

+					<fo:inline font-weight="bold">library</fo:inline> in the source code is a shorthand for 

+					<fo:inline font-weight="bold">self.library</fo:inline>

+					so highlighting 

+					<fo:inline font-weight="bold">l</fo:inline> is an approximation to highlighting the invisible 

+					<fo:inline font-weight="bold">source.</fo:inline> in front of 

+					<fo:inline font-weight="bold">library</fo:inline>.

+

+					<fo:inline font-weight="bold">$pc</fo:inline> in the Variables View also shows a VariableExp for self as the next instruction.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click F5 or 

+					<fo:inline font-weight="bold">Step Into</fo:inline> and 

+					<fo:inline font-weight="bold">$pc</fo:inline> advances and the editor highlight changes to 

+					<fo:inline font-weight="bold">library</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Click F5 or 

+					<fo:inline font-weight="bold">Step Into</fo:inline> a few more times and the highlight will show the iteration within the 

+					<fo:inline font-weight="bold">select</fo:inline> body, allowing each state of each element to be examined to determine why the exhibited behavior occurs.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Continue to Click F5 or 

+					<fo:inline font-weight="bold">Step Into</fo:inline> until 

+					<fo:inline font-weight="bold">-&gt;size()</fo:inline> is highlighted. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14175"><fo:external-graphic src="url(images/4500-validation-debugger-step1.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Expanding 

+					<fo:inline font-weight="bold">$ownedSource</fo:inline> in the Variables View shows the Set of three selected Loans each of which has the same book as self.

+				</fo:block>Click F5 or 

+				<fo:inline font-weight="bold">Step Into</fo:inline> three more times until 

+				<fo:inline font-weight="bold">&lt;=</fo:inline> is highlighted. 

+				<fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1418C"><fo:external-graphic src="url(images/4500-validation-debugger-step2.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We can now see that the 

+					<fo:inline font-weight="bold">$ownedSource</fo:inline>, left hand side, of the comparison is 3 and the 

+					<fo:inline font-weight="bold">$ownedArguments[0]</fo:inline> right hand side is 2.

+					A further step and we see the result as 

+					<fo:inline font-weight="bold">$ownedBody</fo:inline> demonstrating why the validation failed.

+				</fo:block></fo:block><fo:block id="DebuggingCompleteOCLvalidationfailure"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Debugging Complete OCL validation failure</fo:marker><fo:block font-size="14pt">4.5.5. Debugging Complete OCL validation failure</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The two preceding examples displayed their source text in a synthesized Complete OCL document.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In this example we debug a failure for which the OCL is already available in a Complete OCL document.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Open the 

+					<fo:inline font-weight="bold">model/EcoreTestFile.ecore</fo:inline> from the 

+					<fo:basic-link internal-destination="CompleteOCLTutorial"><fo:inline color="blue" text-decoration="underline">Complete OCL tutorial</fo:inline></fo:basic-link> project using the Sample Ecore Editor.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Within the Ecore editor use 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> and then drag and drop 

+					<fo:inline font-weight="bold">model/ExtraEcoreValidation.ocl</fo:inline> and click 

+					<fo:inline font-weight="bold">OK</fo:inline> to dismiss the pop up.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Again within the Ecore editor use 

+					<fo:inline font-weight="bold">OCL-&gt;Show Validity View</fo:inline> to see the constraint/element pairs. 

+					<fo:inline font-style="italic">If the Validity View was already visible, close it and re-show it since in Mars addition of a Complete OCL document fails to refresh correctly.</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Validity View, uncheck the 

+					<fo:inline font-weight="bold">ecore</fo:inline> Metamodel Constraint contributions retaining just the 

+					<fo:inline font-weight="bold">ExtraEcoreValidation.ocl</fo:inline> contribution. Click the plus icon in the 

+					<fo:inline font-weight="bold">Metamodel Constraint</fo:inline> tool bar to expand all entries.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N141DA"><fo:external-graphic src="url(images/4500-complete-ocl-debugger-model.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the bottom right 

+					<fo:inline font-weight="bold">BadClass</fo:inline> model element below the 

+					<fo:inline font-weight="bold">DerivationIsVolatile</fo:inline> constraint and invoke 

+					<fo:inline font-weight="bold">Debug Single Enabled Selection</fo:inline>. from the context menu (wait a second or two). The debugger should start, if not open the Debugger perspective manually.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-style="italic">In Mars, select the 

+						<fo:inline font-weight="bold">DerivationIsVolatile</fo:inline> stack line to refresh the selection.

+					</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N141FA"><fo:external-graphic src="url(images/4500-complete-ocl-debugger-image.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Both 

+					<fo:inline font-weight="bold">asError</fo:inline> and 

+					<fo:inline font-weight="bold">hasDerivation</fo:inline> are OCL-defined so as you step you successively navigate into the defined property and operation.

+				</fo:block></fo:block><fo:block id="Consoleexperiments"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Console experiments</fo:marker><fo:block font-size="14pt">4.5.6. Console experiments</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">While debugging, the original OCL expression from the Console is presented in a Complete OCL editor. This editor is readonly so you cannot edit it to correct mistakes or to experiment.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may however safely use the OCL Console to perform further experiments. Select a suitable self object in the Variable View and cut and paste to prepare your experimental OCL expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-style="italic">In Mars, Console selections cannot be Collections so you are unfortunately restricted to single objects.</fo:inline>

+				</fo:block></fo:block><fo:block id="Longerrangestepping"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Longer range stepping</fo:marker><fo:block font-size="14pt">4.5.7. Longer range stepping</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the examples above we have only used F5 or 

+					<fo:inline font-weight="bold">Step Into</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In principle the tedious stepping through an iteration can be avoided by F7 or 

+					<fo:inline font-weight="bold">Step Return</fo:inline> which should terminate on the popped evaluation environment at the end of the iteration. 

+					<fo:inline font-style="italic">This facility has not been adequately tested in Mars</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you arrange for some line breaks in your source text you can use F6 or 

+					<fo:inline font-weight="bold">Step Next</fo:inline> to proceed until the line number advances. 

+					<fo:inline font-style="italic">This facility has not been adequately tested in Mars</fo:inline>. Line breaks can be added in the OCL Console using Shift and Enter together.

+				</fo:block></fo:block><fo:block id="Breakpoints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Break points</fo:marker><fo:block font-size="14pt">4.5.8. Break points</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When debugging OCL from Complete OCL documents, the original document is a suitable source for the debugger and so line breakpoints can be set. 

+					<fo:inline font-style="italic">This facility has not been adequately tested in Mars</fo:inline>

+				</fo:block></fo:block></fo:block><fo:block id="ValidationTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validation tutorial</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.6. Validation tutorial</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial has been updated for Eclipse Mars: Eclipse 4.5, EMF 2.11, OCL 6.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14246"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14247"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard EMF validation facilities are very useful for avoiding model errors and work well when the models are correct or at least nearly correct. In this tutorial we show how the 

+				<fo:basic-link internal-destination="ValidityView"><fo:inline color="blue" text-decoration="underline">Validity View</fo:inline></fo:basic-link> can provide greater insight into what works and what doesn’t.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We will show how to</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14252"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14253"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>identify all constraints applicable to a particular model element</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14256"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14257"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>show the constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1425A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>show the validation status</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1425D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>identify all model elements constrained by a particular constraint</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14260"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14261"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>show the constraint text</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14264"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>show the validation status</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14267"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>filter the displayed model elements and constraints</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1426A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1426B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>by name</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1426E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>by status</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14271"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>by model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14274"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>by metamodel</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14277"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>launch an OCL debugger for a particular model element and constraint</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="LoadCompleteOCLTutorialExampleProject2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Load Complete OCL Tutorial Example Project</fo:marker><fo:block font-size="14pt">4.6.1. Load Complete OCL Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The material for this tutorial is available as part of the Complete OCL Example project that you

+					may load by selecting 

+					<fo:inline font-weight="bold">New</fo:inline> then 

+					<fo:inline font-weight="bold">Example...</fo:inline> using the right button context menu of the Project Explorer. This

+					should give the 

+					<fo:inline font-weight="bold">New Example</fo:inline> dialog in which you can select the OCL (OCL Constraint Language) Plugins and the Complete OCL Tutorial.

+				</fo:block></fo:block><fo:block id="LoadTestModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Load Test Model</fo:marker><fo:block font-size="14pt">4.6.2. Load Test Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double click on 

+					<fo:inline font-weight="bold">model/XMITestFile.xmi</fo:inline> to open the model and expand the top entry to show the EPackage.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the model opens with another editor, close it, and open with the Sample Reflective Ecore Editor by selecting 

+					<fo:inline font-weight="bold">model/Tutorial.ecore</fo:inline> and then 

+					<fo:inline font-weight="bold">Open With-&gt;Sample Reflective Ecore Model Editor</fo:inline> from the context menu.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Within the editor invoke 

+					<fo:inline font-weight="bold">OCL-&gt;Load Document</fo:inline> to load 

+					<fo:inline font-weight="bold">model/ExtraEcoreValidation.ocl</fo:inline> and again to load 

+					<fo:inline font-weight="bold">model/ExtraXMIValidation.ocl</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N142B0"><fo:external-graphic src="url(images/4600-validation-view-model.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Your source ResourceSet now contains four resources</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N142B8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N142B9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the XMITestFile.xmi model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N142BC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the EcoreTestFile.ecore metamodel</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N142BF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the ExtraXMIValidation.ocl additional model validation rules</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N142C2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the ExtraEcoreValidation.ocl additional metamodel validation rules</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="EMFValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">EMF Validation</fo:marker><fo:block font-size="14pt">4.6.3. EMF Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+					<fo:inline font-weight="bold">XMITestFile.xmi</fo:inline> and invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline> from the context menu. Click 

+					<fo:inline font-weight="bold">OK</fo:inline> to dismiss.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N142D9"><fo:external-graphic src="url(images/4600-validation-view-model-errors.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select the 

+					<fo:inline font-weight="bold">EcoreTestFile.ecore</fo:inline> and invoke 

+					<fo:inline font-weight="bold">Validate</fo:inline> from the context menu. Click 

+					<fo:inline font-weight="bold">OK</fo:inline> to dismiss.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N142EF"><fo:external-graphic src="url(images/4600-validation-view-metamodel-errors.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above results clearly show problems, but not necessarily all the problems and do not show what was actually done. Sometimes validation of a model element terminates prematurely once an error has been reported. On other occasions some constraints are not run and so no corresponding errors are detected.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above limitations are not a problem, when everything is working well, but when you have a misunderstanding as to what is being validated, a bad day can get very much worse.</fo:block><fo:block id="ValidityViewValidation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.6.3.1. Validity View Validation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+						<fo:inline font-weight="bold">OCL-&gt;Show Validity View</fo:inline> from the editor context menu.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The left hand pane shows the root model elements in a similar way to the Sample Reflective Ecore Editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The right hand pane shows the root metamodel constraint sources.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N14309"><fo:external-graphic src="url(images/4600-validation-view-roots.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each may be expanded using the control at the start of each line or the more general controls in the tool bars.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Important tip: click the pin icon in the Validity Model tool bar to stop the Validity View chasing your mouse selections.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may now obtain the more detailed validation results by clicking on the green Run icon in the main Validation View tool bar.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N14317"><fo:external-graphic src="url(images/4600-validation-view-root-results.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Use the hover text to see how many validations have been rounded up into each root display.</fo:block></fo:block><fo:block id="FilteringbyRootModels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.6.3.2. Filtering by Root Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There are 34 results in total, which is more than we want to look at, even for this very small model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-weight="bold">ecore in http://www.eclipse.org/emf/2002/Ecore</fo:inline> root constraint is contributing 30 successes without problem, so we ignore it by unchecking the enable checkbox preceding it.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The model is so simple that we can now expand it completely. Click on the + expand icons.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1432F"><fo:external-graphic src="url(images/4600-validation-view-some-results.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the left hand pane, the black text labels show the hierarchy of model elements. At the leaves in blue italic text are the constraints applicable to the model element.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the right hand pane, the blue italic labels show the hierarchy of constraints. At the leaves in black text are the constrained model elements.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You can hover over constraints to see the details and invoke 

+						<fo:inline font-weight="bold">Show In Editor</fo:inline> to navigate to them. 

+					</fo:block></fo:block><fo:block id="FilteringbyStatus"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.6.3.3. Filtering by Status</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The many successes are often of limited interest, so we may concentrate on Errors by invoking 

+						<fo:inline font-weight="bold">Show all Errors</fo:inline> from the Filtering pull down towards the right of the main Validation View tool bar.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N1434B"><fo:external-graphic src="url(images/4600-validation-view-error-results.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Having found an error of interest we can see it in context.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14353"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14354"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Select the 

+								<fo:inline font-weight="bold">Bad::BadClass::uncachedDerived</fo:inline> error in the Constraints pane

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1435B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>remove the 

+								<fo:inline font-weight="bold">Show all Errors</fo:inline> filtering using the Filtering pull down

+							</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14362"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>enable the view of all constraints by clicking the tick icon in the Model Constraint pane tool bar.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N14367"><fo:external-graphic src="url(images/4600-validation-view-results-context.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This shows that the constraint is validated five times with one error, two warnings and two successes.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Double clicking on the erroneous child constraint makes the constraint visible in the right hand pane, showing that the constraint is only applied to this one model element.</fo:block></fo:block><fo:block id="Debuggingconstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.6.3.4. Debugging constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Maybe it’s time for some debugging. Select the leaf constraint below a model element, or the leaf element below a constraint and invoke 

+						<fo:inline font-weight="bold">Debug Single Enabled Selection</fo:inline> to start the OCL debugger to step through the problematic constraint on the problematic model element. (Select the debugger perspective explicitly if it doesn’t open automatically.)

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Use of the OCL debugger is described in the 

+						<fo:basic-link internal-destination="DebuggerTutorial"><fo:inline color="blue" text-decoration="underline">Debugger Tutorial</fo:inline></fo:basic-link>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N14383"><fo:external-graphic src="url(images/4600-validation-view-debugger.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+					</fo:block></fo:block></fo:block></fo:block><fo:block id="OCLInterpreterTutorial"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Working with Classic OCL</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.7. Working with Classic OCL</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="Overview4"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Overview</fo:marker><fo:block font-size="14pt">4.7.1. Overview</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial illustrates the various services provided by the Classic Eclipse OCL

+					implementation.</fo:block></fo:block><fo:block id="References3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">References</fo:marker><fo:block font-size="14pt">4.7.2. References</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This tutorial assumes that the reader is familiar with the Eclipse extension point

+					architecture.  There is an abundance of on-line help in Eclipse for those

+					unfamiliar with extension points.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To see the complete source code for the examples shown in this tutorial, install

+					the 

+					<fo:basic-link internal-destination="OCLInterpreterExample"><fo:inline color="blue" text-decoration="underline">OCL Interpreter Example</fo:inline></fo:basic-link> 

+					plug-in into your workspace.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Other references:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N143A3"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N143A4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>For an environment in which to test the OCL expressions that you will create in this tutorial, install the 

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/examples/exampleOverview.html)">Library Metamodel</fo:basic-link> example.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N143AB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.omg.org/spec/OCL)">OCL 2.0</fo:basic-link> specification.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="ParsingOCLExpressions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing OCL Expressions</fo:marker><fo:block font-size="14pt">4.7.3. Parsing OCL Expressions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The first responsibility of the OCL interpreter is to parse OCL expressions.

+					One of the purposes of parsing an expression is to validate it:  if it can be

+					parsed, it is well-formed (the parser automatically validates the expression

+					against the semantic well-formedness rules).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The main entrypoint into the OCL API is the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html)">OCL</fo:basic-link> class. An 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> provides an autonomous OCL parsing environment.  It tracks all constraints that are parsed in this environment, including the definitions of additional operations and attributes. The 

+					<fo:inline font-family="Inconsolata,Courier">OCL.newInstance()</fo:inline> factory method is used to create a new OCL with an 

+					<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline> that provides the binding to a particular metamodel (Ecore or UML).  In this tutorial, we will use the Ecore binding.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To parse a query expression, we will use the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+					</fo:basic-link> object, which provides convenient operations for parsing queries and constraints

+					(intended for processing constraints embedded in models).

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N143D1"><fo:inline font-family="Inconsolata,Courier">boolean valid;

+OCLExpression&lt;EClassifier&gt; query = null;

+

+try {

+    // create an OCL instance for Ecore

+    OCL&lt;?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject&gt; ocl;

+    ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE);

+    

+    // create an OCL helper object

+    OCLHelper&lt;EClassifier, ?, ?, Constraint&gt; helper = ocl.createOCLHelper();

+    

+    // set the OCL context classifier

+    helper.setContext(EXTLibraryPackage.Literals.WRITER);

+    

+    query = helper.createQuery("self.books-&gt;collect(b : Book | b.category)-&gt;asSet()");

+    

+    // record success

+    valid = true;

+} catch (ParserException e) {

+    // record failure to parse

+    valid = false;

+    System.err.println(e.getLocalizedMessage());

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The example above parses an expression that computes the distinct categories

+					of 

+					<fo:inline font-family="Inconsolata,Courier">Book</fo:inline> s associated with a 

+					<fo:inline font-family="Inconsolata,Courier">Writer</fo:inline>.  The possible

+					reasons why it would fail to parse (in which case a

+

+					<fo:inline font-family="Inconsolata,Courier">ParserException</fo:inline> is thrown) include:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N143E2"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N143E3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>syntactical problems:  misplaced or missing constructs such as closing</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">		parentheses, variable declarations, type expressions, etc.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N143E8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N143E9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>semantic problems:  unknown attributes or operations of the context</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">		type or referenced types, unknown packages, classes, etc.</fo:block></fo:block><fo:block id="ParsingOCLConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing OCL Constraints</fo:marker><fo:block font-size="14pt">4.7.4. Parsing OCL Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL is primarily intended for the specification of 

+					<fo:inline font-style="italic">constraint</fo:inline> s.  Unlike

+					queries, there are a variety of different kinds of constraints used in different

+					places in a model.  These include classifier invariants, operation constraints,

+					and attribute derivation constraints.  The 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+					can parse these for us.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Let’s imagine the confusion that arises from a library that has more than

+					one book of the same title (we are not intending to model copies).  We will

+					create an invariant constraint for @Book@s stipulating

+					that this is not permitted:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N143FD"><fo:inline font-family="Inconsolata,Courier">Constraint invariant = null;

+

+try {

+    // set the OCL context classifier

+    helper.setContext(EXTLibraryPackage.Literals.LIBRARY);

+    

+    invariant = helper.createInvariant(

+        "Library.allInstances()-&gt;forAll(b1, b2 | b1 &lt;&gt; b2 implies b1.title &lt;&gt; b2.title)");

+} catch (ParserException e) {

+    // record failure to parse

+    System.err.println(e.getLocalizedMessage());

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Parsing constraints differs from parsing query expressions because they have

+					additional well-formedness rules that the parser checks.  For example, an

+					invariant constraint must be boolean-valued, an attribute derivation constraint

+					must conform to the type of the attribute, and such constructs as @pre 

+					and 

+					<fo:inline font-family="Inconsolata,Courier">oclIsNew()</fo:inline> may only be used in operation post-condition constraints.

+				</fo:block></fo:block><fo:block id="EvaluatingOCLExpressionsandConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Evaluating OCL Expressions and Constraints</fo:marker><fo:block font-size="14pt">4.7.5. Evaluating OCL Expressions and Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">More interesting than parsing an OCL expression or constraint is evaluating it

+					on some object.  The 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Query.html)">

+						<fo:inline font-family="Inconsolata,Courier">Query</fo:inline>

+					</fo:basic-link> 

+					interface provides two methods for evaluating expressions. Queries are

+					constructed by factory methods on the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class.

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14419"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1441A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Query.html#evaluate(org.eclipse.emf.ecore.EObject))">

+								<fo:inline font-family="Inconsolata,Courier">Object evaluate(Object)</fo:inline>

+							</fo:basic-link> 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">		evaluates the expression on the specified object, returning the result.

+							The caller is expected to know the result type, which could be a

+							primitive, 

+					<fo:inline font-family="Inconsolata,Courier">EObject</fo:inline>, or a collection.  There

+							are variants of this method for evaluation of the query on multiple

+							objects and on no object at all (for queries that require no "self"

+							context).

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14429"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1442A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Query.html#check(org.eclipse.emf.ecore.EObject))">

+								<fo:inline font-family="Inconsolata,Courier">boolean evaluate(Object)</fo:inline>

+							</fo:basic-link> 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">		This method evaluates a special kind of OCL expression called a

+							

+					<fo:inline font-style="italic">constraint</fo:inline>.  Constraints are distinguished from other OCL queries

+							by having a boolean value; thus, they can be used to implement invariant

+							or pre/post-condition constraints.  There are variants for checking

+							multiple objects and for selecting/rejecting elements of a list that

+							satisfy the constraint.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In order to support the 

+					<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline> operation on OCL types,

+					the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> API provides the

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html#setExtentMap(java.util.Map))">

+						<fo:inline font-family="Inconsolata,Courier">setExtentMap(Map&lt;CLS, ? extends Set&lt;? extends E&gt;&gt; extentMap)</fo:inline>

+					</fo:basic-link> 

+					method.  This assigns a mapping of classes (in the Ecore binding,

+

+					<fo:inline font-family="Inconsolata,Courier">EClass</fo:inline> es) to the sets of their instances.  By default,

+					the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> provides a dynamic map that computes the

+					extents on demand from the contents of a 

+					<fo:inline font-family="Inconsolata,Courier">Resource</fo:inline>.

+					An alternative extent map can be

+					found in 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/opposites/ExtentMap.html)">

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore.opposites.ExtentMap</fo:inline>

+					</fo:basic-link> .

+					We will use a custom extent map in evaluating a query expression that finds

+					books that have the same title as a designated book:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1445A"><fo:inline font-family="Inconsolata,Courier">// create an extent map

+Map&lt;EClass, Set&lt;? extends EObject&gt;&gt; extents = new HashMap&lt;EClass, Set&lt;? extends EObject&gt;&gt;();

+Set&lt;Book&gt; books = new HashSet&lt;Book&gt;();

+extents.put(EXTLibraryPackage.Literals.BOOK, books);

+

+// tell the OCL environment what our classifier extents are

+ocl.setExtentMap(extents);

+

+Library library = EXTLibraryFactory.eINSTANCE.createLibrary();

+

+Book myBook = EXTLibraryFactory.eINSTANCE.createBook();

+myBook.setTitle("David Copperfield");

+books.add(myBook);

+

+// this book is in our library

+library.add(myBook);

+

+Writer dickens = EXTLibraryFactory.eINSTANCE.createWriter();

+dickens.setName("Charles Dickens");

+

+Book aBook = EXTLibraryFactory.eINSTANCE.createBook();

+aBook.setTitle("The Pickwick Papers");

+aBook.setCategory(BookCategory.MYSTERY_LITERAL);

+books.add(aBook);

+aBook = EXTLibraryFactory.eINSTANCE.createBook();

+aBook.setTitle("David Copperfield");

+aBook.setCategory(BookCategory.BIOGRAPHY_LITERAL);  // not actually, of course!

+books.add(aBook);

+aBook = EXTLibraryFactory.eINSTANCE.createBook();

+aBook.setTitle("Nicholas Nickleby");

+aBook.setCategory(BookCategory.BIOGRAPHY_LITERAL);  // not really

+books.add(aBook);

+

+dickens.addAll(books);  // Dickens wrote these books

+library.addAll(books);  // and they are all in our library

+

+// use the query expression parsed before to create a Query

+Query&lt;EClassifier, EClass, EObject&gt; eval = ocl.createQuery(query);

+

+Collection&lt;?&gt; result = (Collection&lt;?&gt;) eval.evaluate(dickens);

+System.out.println(result);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The same 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API is used to check constraints.

+					Using the 

+					<fo:inline font-family="Inconsolata,Courier">library</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">extents</fo:inline> map from above and the

+					constraint parsed previously:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1446B"><fo:inline font-family="Inconsolata,Courier">eval = ocl.createQuery(constraint);

+

+boolean ok = eval.check(library);

+

+System.out.println(ok);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="ImplementingContentAssist"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Implementing Content Assist</fo:marker><fo:block font-size="14pt">4.7.6. Implementing Content Assist</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> interface provides an operation that

+					computes content-assist proposals in an abstract form, as

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/Choice.html)">

+						<fo:inline font-family="Inconsolata,Courier">Choice</fo:inline>

+					</fo:basic-link> s.

+					An application’s UI can then convert these to JFace’s

+

+					<fo:inline font-family="Inconsolata,Courier">ICompletionProposal</fo:inline> type.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Obtaining completion choices consists of supplying a partial OCL expression

+					(up to the cursor location in the UI editor) to the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html#getSyntaxHelp(org.eclipse.ocl.helper.ConstraintKind)">

+						<fo:inline font-family="Inconsolata,Courier">OCLHelper::getSyntaxHelp(ConstraintKind, String)</fo:inline>

+					</fo:basic-link>, java.lang.String) 

+					method.  This method requires a 

+					<fo:inline font-family="Inconsolata,Courier">ConstraintKind</fo:inline>

+					enumeration indicating the type of constraint that is to be parsed (some OCL

+					constructs are restricted in the kinds of constraints in which they may be used).

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N14491"><fo:inline font-family="Inconsolata,Courier">helper.setContext(EXTLibraryPackage.Literals.BOOK);

+

+List&lt;Choice&gt; choices = helper.getSyntaxHelp(

+    ConstraintKind.INVARIANT,

+    "Book.allInstances()-&gt;excluding(self).");

+

+for (Choice next : choices) {

+    switch (next.getKind()) {

+    case OPERATION:

+    case SIGNAL:

+        // the description is already complete

+        System.out.println(next.getDescription());

+    case PROPERTY:

+    case ENUMERATION_LITERAL:

+    case VARIABLE:

+        System.out.println(next.getName() + " : " + next.getDescription();

+        break;

+    default:

+        System.out.println(next.getName());

+        break;

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A sample of the output looks like:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N14499"><fo:inline font-family="Inconsolata,Courier">author : Writer

+title : String

+oclIsKindOf(typespec : OclType)

+oclAsType(typespec : OclType) : T

+...

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The choices also provide the model element that they represent, from which a

+					more sophisticated application can construct appropriate JFace completions,

+					including context information, documentation, etc.</fo:block></fo:block><fo:block id="WorkingwiththeAST"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Working with the AST</fo:marker><fo:block font-size="14pt">4.7.7. Working with the AST</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Interpreter models the OCL language using EMF’s Ecore with support for

+					Java-style generic types.  The bindings of this generic Abstract Syntax Model

+					for Ecore and for UML substitutes these metamodels' constructs for the generic

+					type parameters, plugging in the definitions of the “classifier”, “operation”,

+					“constraint”, etc. constructs of the OCL vocabulary.  These bindings, then,

+					support persistence in or as an adjunct to Ecore and UML models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For processing the abstract syntax tree (AST) parsed from OCL text, the API

+					supplies a 

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/Visitor.html)">

+						<fo:inline font-family="Inconsolata,Courier">Visitor</fo:inline>

+					</fo:basic-link> 

+					interface.  By implementing this interface (or extending the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/AbstractVisitor.html)">

+						<fo:inline font-family="Inconsolata,Courier">AbstractVisitor</fo:inline>

+					</fo:basic-link> 

+					class, which is recommended), we can walk the AST of an OCL expression to

+					transform it in some way.

+					This is exactly what the interpreter, itself, does to evaluate an

+					expression:  it just walks the expression using an evaluation visitor.  For

+					example, we can count the number times that a specific attribute is

+					referenced in an expression:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N144B8"><fo:inline font-family="Inconsolata,Courier">helper.setContext(EXTLibraryPackage.Literals.BOOK);

+

+OCLExpression&lt;EClassifier&gt; query = helper.parseQuery(

+    "Book.allInstances()-&gt;select(b : Book | b &lt;&gt; self and b.title = self.title)");

+

+AttributeCounter visitor = new AttributeCounter(

+    EXTLibraryPackage.Literals.BOOK__TITLE);

+

+System.out.println(

+    "Number of accesses to the 'Book::title' attribute: " + query.accept(visitor));

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">where the visitor is defined thus:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N144C0"><fo:inline font-family="Inconsolata,Courier">class AttributeCounter extends AbstractVisitor&lt;Integer,

+		EClassifier, EOperation, EStructuralFeature, EEnumLiteral,

+		EParameter, EObject, EObject, EObject, Constraint&gt; {

+    private final EAttribute attribute;

+    

+    AttributeCounter(EAttribute attribute) {

+        super(0);  // initialize the result of the AST visitiation to zero

+        this.attribute = attribute;

+    }

+    

+    protected Integer handlePropertyCallExp(PropertyCallExp&lt;EClassifier, EStructuralFeature&gt; callExp,

+    		Integer sourceResult, List&lt;Integer&gt; sourceResults) {

+        if (callExp.getReferredProperty() == attribute) {

+            // count one

+            result++;

+        }

+        

+        return result;

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="Serialization"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Serialization</fo:marker><fo:block font-size="14pt">4.7.8. Serialization</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Because the OCL expression AST is a graph of EMF objects, we can serialize it

+					to an XMI file and deserialize it again later.  To save our example expression,

+					we start over by initializing our 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance with

+					a resource in which it will persist the environment and in which we will

+					persist the parsed expression.  The key is in the persistence of the

+					environment:  OCL defines a variety of classes on the fly by template

+					instantiation.  These include collection types, tuple types, and message types.

+					Other elements needing to be persisted are additional operations and attributes

+					that may be defined in the local environment.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N144D0"><fo:inline font-family="Inconsolata,Courier">// create a resource in which to store our parsed OCL expressions and constraints

+Resource res = resourceSet.createResource(

+    URI.createPlatformResourceURI("/MyProject/myOcl.xmi", true);

+

+// initialize a new OCL environment, persisted in this resource

+ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE, res);

+

+// for the new OCL environment, create a new helper

+helper = OCL.createOCLHelper();

+

+helper.setContext(EXTLibraryPackage.Literals.BOOK);

+

+// try a very simple expression

+OCLExpression&lt;EClassifier&gt; query = helper.createQuery("self.title");

+

+// store our query in this resource.  All of its necessary environment has

+// already been stored, so we insert the query as the first resource root

+res.getContents().add(0, query);

+

+res.save(Collections.emptyMap());

+res.unload();

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To load a saved OCL expression is just as easy:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N144D8"><fo:inline font-family="Inconsolata,Courier">Resource res = resourceSet.getResource(

+    URI.createPlatformResourceURI("/MyProject/myOcl.xmi", true),

+    true;

+

+@SuppressWarnings("unchecked")

+OCLExpression&lt;EClassifier&gt; query = (OCLExpression&lt;EClassifier&gt;) res.getContents().get(0);

+

+System.out.println(ocl.evaluate(myBook, query));

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the snippet above, we used the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>'s convenience

+					method for a one-shot evaluation of a query.  Looking at the contents of the

+					XMI document that we saved, we see that the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+					variable declaration is not owned by the query expression, but is, rather,

+					free-standing.  The 

+					<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline> metaclass solves

+					this problem by providing properties that contain context variable declarations,

+					including 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> and (in the context of operations)

+					operation parameters. 

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N144EC"><fo:inline font-family="Inconsolata,Courier">&lt;?xml version="1.0" encoding="ASCII"?&gt;

+&lt;xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:ocl.ecore="http://www.eclipse.org/ocl/1.1.0/Ecore"&gt;

+  &lt;ocl.ecore:PropertyCallExp xmi:id="_897fVPfmEduCQ48h829a5g"&gt;

+    &lt;eType xsi:type="ocl.ecore:PrimitiveType" href="http://www.eclipse.org/ocl/1.1.0/oclstdlib.ecore#/0/String"/&gt;

+    &lt;source xsi:type="ocl.ecore:VariableExp" xmi:id="_897fVvfmEduCQ48h829a5g" name="self" referredVariable="_897fUvfmEduCQ48h829a5g"&gt;

+      &lt;eType xsi:type="ecore:EClass" href="http://www.org.eclipse/ocl/examples/library/extlibrary.ecore/1.0.0#//Book"/&gt;

+    &lt;/source&gt;

+    &lt;referredProperty xsi:type="ecore:EAttribute" href="http://www.org.eclipse/ocl/examples/library/extlibrary.ecore/1.0.0#//Book/title"/&gt;

+  &lt;/ocl.ecore:PropertyCallExp&gt;

+  &lt;ocl.ecore:Variable xmi:id="_897fUvfmEduCQ48h829a5g" name="self"&gt;

+    &lt;eType xsi:type="ecore:EClass" href="http://www.org.eclipse/ocl/examples/library/extlibrary.ecore/1.0.0#//Book"/&gt;

+  &lt;/ocl.ecore:Variable&gt;

+&lt;/xmi:XMI&gt;

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="Summary3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Summary</fo:marker><fo:block font-size="14pt">4.7.9. Summary</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To illustrate how to work with the OCL API, we</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N144F9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N144FA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Parsed and validated OCL expressions and constraints.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N144FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Evaluated OCL query expressions and constraints.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14500"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Obtained content-assist suggestions for the completion of OCL expressions.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14503"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Transformed an OCL expression AST using the 

+							<fo:inline font-style="italic">Visitor</fo:inline> pattern.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14509"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Saved and loaded OCL expressions to/from XMI resources.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:block><fo:block id="Extensions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Extensions (in the Unified/Pivot OCL prototype)</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.8. Extensions (in the Unified/Pivot OCL prototype)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This section highlights some of the OCL extensions prototyped by the Pivot OCL.</fo:block><fo:block id="Models"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Models</fo:marker><fo:block font-size="14pt">4.8.1. Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Abstract Syntax classes and interfaces are autogenerated from Pivot.ecore using standard EMF tooling. Pivot.ecore is auto-generated by custom QVTo transformations from OMG’s UML.xmi and prototype OCL.uml models. This gives some degree of UML alignment.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Standard Library is defined by OCL-2.5.oclstdlib for which an OCLstdlib Xtext editor is available. The library is therefore modelled.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Concrete Syntax classes and editors are also autogenerated from Ecore modesl using standard EMF tooling. Autogeneation of the Ecore models from UML modesl is still work in progress.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The grammars are defined by Xtext models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The run-time Value classes and interfaces are partially generated from Values.ecore. Full auto-generation is still work in progress.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is also a model of the code generation intermediate.</fo:block></fo:block><fo:block id="XMI"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">XMI</fo:marker><fo:block font-size="14pt">4.8.2. XMI</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The abstract syntax models are fully persistable as standard XMI using the *.oclas file extension. Pivot.oclas and OCL-2.5.oclas models form part of the Eclipse OCL distribution.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of interchange of synthetic types such as Sequence(String) is solved by an orphan package in which a singleton copy of every singleton is maintained.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of Complete OCL’s open classes allowing additional features is solved by CompleteModel/CompletePackage/CompleteClass additions to the abstract syntax so that a CompleteClass may aggregate many ordinary Classes; one from the primary user (UML/Ecore) model, any number of further (Compete OCL or OCLstdlib) over;ays.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of references to unnavigable opposites is solved by an OppositePropertyCallExp class.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of references to modelled Iterations is resolved by adding a referredIteration property to IterateExp/IteratorExp.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of references to Stereotype properties is resolved by normalizing the UML representation to exploit regular Class/Property usage.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem of references to Association properties is resolved by normalizing the UML representation to exploit regular Class/Property usage.</fo:block></fo:block><fo:block id="Templates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Templates</fo:marker><fo:block font-size="14pt">4.8.3. Templates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In OMG OCL, types such as Sequence(String) magically associate String and an ill-defined concept of T. In UML and consequently the UML-aligned pivot OCL, String is a TemplateParameter for which further classes such as TemplateParameterSubstitution define bindings. The use of magic T for library classes is genertalized to arbitrary user

+					classes and operations; jusr like UML. Template types of cource conform and since in OCL all values are immutable a

+					Set(Integer) is conformat to a Sert(Real) and a Set(OclAny). This can bew slightly surprising since typos may not lead immediately to type errors, rather an expression with inferred OclAny errors. Use the hovertext to inspect your expression types.</fo:block></fo:block><fo:block id="Extensibility"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Extensibility</fo:marker><fo:block font-size="14pt">4.8.4. Extensibility</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot OCL is extended by the Eclipse QVTd project to support QVTc and QVTr. The models are therefore extensible, but not readily so. Rather too mauch Java programming is required. True extensibilitty and in partocular a modular OCL Standrad Library is still work in progress.</fo:block></fo:block><fo:block id="OperationOverloading"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Operation Overloading</fo:marker><fo:block font-size="14pt">4.8.5. Operation Overloading</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The buck passing between UML and OCL in regards to operation overloading is resolved in the Pivot OCL by implementing a Java-style dynamic dispatch to the most derived implmentation with a matching signature.</fo:block></fo:block><fo:block id="Stereotypes"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Stereotypes</fo:marker><fo:block font-size="14pt">4.8.6. Stereotypes</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML specification hinyts in regards to base_XXX and extension_XXX properties are followed through in conjunction with an ElementExtension lass to model  the instance of a Stereotype. Typesafe stereotype navigation is therefore possible without resorting to the proprietary getXXX Java API of Eclipse UML2.</fo:block></fo:block><fo:block id="SafeNavigation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Safe Navigation</fo:marker><fo:block font-size="14pt">4.8.7. Safe Navigation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML [ 1 ] and [ ?  ] multiplicities are exploited to distinguish nullable and non-null objects and diagnose unsafe navigations. To make this useful an extension to null-free collections is possible by defing e.g Set(String[*|1]) as

+					a Set of String with unbounded [ * ] collection multiplity and never-null [ 1 ] element multiplicity. The additional ?. and “?-&gt;” safe navigation operators avoid nullhazards. See 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.eclipse.org/modeling/mdt/ocl/docs/publications/OCL2015SafeNavigation/SafeNavigation.pdf)">Safe Navigation in OCL</fo:basic-link> for more details.

+				</fo:block></fo:block><fo:block id="Reflection"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Reflection</fo:marker><fo:block font-size="14pt">4.8.8. Reflection</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the Pivot OCL the oclType() libary method has a pivot::Class return type allowing further navigation to make reflective access to the user metamodel.</fo:block></fo:block><fo:block id="LambdaExpressions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Lambda Expressions</fo:marker><fo:block font-size="14pt">4.8.9. Lambda Expressions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL has always had hidden lambda expressions in order to define iteratpr bodies. The Pivot OCL reifies these so that the Standard Library uses a templated LambdaType as part of its modelling. Variables and Parameters may use LamabdaType and so ooffer full lambda expression capability.</fo:block></fo:block><fo:block id="MapKV"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Map(K,V)</fo:marker><fo:block font-size="14pt">4.8.10. Map(K,V)</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Map type provides a familiar functionality comprising a set of keys with associated values.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Like all other OCL types, the Map type is immutable; there are therefore no 

+					<fo:inline font-weight="bold">put</fo:inline> or 

+					<fo:inline font-weight="bold">set</fo:inline> operations, rather a new Map may be created by 

+					<fo:inline font-weight="bold">including</fo:inline> a key-value pair tigether with an old Map.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The content of a Map may be accessed using 

+					<fo:inline font-weight="bold">at</fo:inline>, which returns invalid for an unknown key in the same way as an ordered collection returns invalid for an unknown index.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A Map may be created explicitly using the new Map Literal Syntax. Thus 

+					<fo:inline font-weight="bold">Map(Integer,String){1 &lt;- ‘one’,2 &lt;- ‘two’}</fo:inline>

+					creates a Map of Integer to String with 

+					<fo:inline font-weight="bold">'one'</fo:inline> bound to 

+					<fo:inline font-weight="bold">1</fo:inline> and 

+					<fo:inline font-weight="bold">'two'</fo:inline> bound to 

+					<fo:inline font-weight="bold">2</fo:inline>. The type 

+					<fo:inline font-weight="bold">(Integer,String)</fo:inline>

+					parameterisation can be omitted. 

+					<fo:inline font-weight="bold">null</fo:inline> but not 

+					<fo:inline font-weight="bold">invalid</fo:inline> values are permitted as keys and values.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The new 

+					<fo:inline font-weight="bold">collectBy</fo:inline> iteration may be used to construct a map from a collection or map. The iterators of the 

+					<fo:inline font-weight="bold">collectBy</fo:inline> define the keys and the value of the body of defines the values. For instance 

+					<fo:inline font-weight="bold">Sequence{1..10}-&gt;collectBy(i | i+i)}</fo:inline> builds a map from the values 1 to 10 to the even values 2 to 20.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Most standard collection iteration operations are available for Maps using the map keys as the (primary) iterator. A secondary value iterator may be specified using the new binds-to syntax. Thus 

+					<fo:inline font-weight="bold">Map{1&lt;-1,2&lt;-4,3&lt;-9}-&gt;reject(k&lt;-v | k = 2 or v = 9}</fo:inline> defines a reject iteration over the three entry map, with a primary iterator 

+					<fo:inline font-weight="bold">k</fo:inline> over the set of keys and a secondary co-iterator 

+					<fo:inline font-weight="bold">v</fo:inline> over the values bound to each key. The body causes the second entry with key 2, and the third entry with value 9 to be rejected leaving just a one entry map.

+				</fo:block><fo:block id="Details"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">4.8.10.1. Details</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL metamodel is extended by a MapLiteralExp and MapType. A new abstract IterableType captures the iterable commonality of CollectionType and MapType without making map a collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL standard library defines the new Map operations and the new Collection::collectBy itetation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL syntax is extended by the MapLiteralExp syntax and the binds-to co-iterator syntax for all iterators.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL run-time is extended by a MapValue and an abstract IteravleValue to capture the commonality with CollectionValue.</fo:block></fo:block></fo:block></fo:block><fo:block id="Installation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Installing the Eclipse OCL Examples and Editors</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">4.9. Installing the Eclipse OCL Examples and Editors</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These instructions have been updated for Eclipse Mars; Eclipse 4.5, EMF 2.11, OCL 6.0.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N145CC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N145CD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Some screenshots may be slightly out of date.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL User Interface (console, editors, debugger and validity view) 

+				is not part of the core OCL functionality included in the

+				Eclipse Modeling Tools Package, so although you may have OCL installed and be able

+				to read this tutorial via the 

+				<fo:inline font-weight="bold">Help-&gt;Help Contents-&gt;OCL Documentation</fo:inline>, you may

+				not have the OCL examples installed.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An easy way to test whether you have the OCL Examples installed is

+				to right click on a *.ecore file and see whether

+

+				<fo:inline font-weight="bold">OCLinEcore Editor</fo:inline> appears in the 

+				<fo:inline font-weight="bold">Open With</fo:inline> submenu.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If OCL is not installed at all, or if just the examples are not installed,

+				the following installation step will automatically install the OCL Examples

+				and all required projects such as 

+				<fo:inline font-weight="bold">EMF</fo:inline>, 

+				<fo:inline font-weight="bold">UML2</fo:inline>, 

+				<fo:inline font-weight="bold">MWE2</fo:inline>, 

+				<fo:inline font-weight="bold">Xpand</fo:inline>

+				and 

+				<fo:inline font-weight="bold">Xtext</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Left-click on 

+				<fo:inline font-weight="bold">Help</fo:inline> in the Eclipse menu-bar then left-click on 

+				<fo:inline font-weight="bold">Install New Software...</fo:inline>

+				and select the 

+				<fo:inline font-weight="bold">Luna – http://download.eclipse.org/releases/luna</fo:inline> update site

+				from the pull-down menu to 

+				<fo:inline font-weight="bold">Work with</fo:inline> and be patient while the available updates

+				are identified. Then type 

+				<fo:inline font-weight="bold">OCL</fo:inline> in the filter text, click on the expand item preceding

+				the 

+				<fo:inline font-weight="bold">Modeling</fo:inline> category and then check 

+				<fo:inline font-weight="bold">OCL Examples and Editors SDK</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14616"><fo:external-graphic src="url(images/4900-install_software.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+				<fo:inline font-weight="bold">Next</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14624"><fo:external-graphic src="url(images/4900-install_details.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+				<fo:inline font-weight="bold">Next</fo:inline> again and read the license agreement. Set to accept it.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14632"><fo:external-graphic src="url(images/4900-install_license.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Select 

+				<fo:inline font-weight="bold">Finish</fo:inline> and be patient while the software is downloaded and installed.

+				Select 

+				<fo:inline font-weight="bold">Restart Now</fo:inline> when prompted to do so.

+			</fo:block><fo:block id="Troubleshooting2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Troubleshooting</fo:marker><fo:block font-size="14pt">4.9.1. Troubleshooting</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse Modeling Projects have a large number of classes and so require a

+					large amount of PermGen space on a Sun JVM. If you are using default Eclipse

+					startup settings you are liable to encounter OutOfMemoryExceptions. Therefore

+					follow the advice in 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://wiki.eclipse.org/IRC_FAQ#How_do_I_start_Eclipse.3F)">How do I start Eclipse</fo:basic-link>

+					and set XX:PermSize to at least 64M, either on your Eclipse command line, or your

+					Eclipse shortcut or in the 

+					<fo:inline font-weight="bold">eclipse.ini</fo:inline> adjacent to 

+					<fo:inline font-weight="bold">eclipse.exe</fo:inline>. If you are using a 64 bit machine

+					or plan to use graphical modeling tools such as Papyrus or Sirius, 128M is almost certainly necessary.

+				</fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Examples</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Examples</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="Examples"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 5. Examples</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="RoyalAndLoyalExample"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Royal and Loyal Example Project</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">5.1. Royal and Loyal Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The RoyalAndLoyal example project provides a substantial example of a Complete OCL document

+				complementing an independent Ecore meta-model.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is the standard example used in many OCL texts and courses. It was first produced as part of

+				the 

+				<fo:inline font-style="italic">The Object Constraint Language Second Edition</fo:inline> by 

+				<fo:inline font-style="italic">Jos Warmer</fo:inline> and 

+				<fo:inline font-style="italic">Anneke Kleppe</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example may be used to explore a wide variety of OCL syntaxes and their presentation in the Complete OCL editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may install the example by selecting 

+				<fo:inline font-weight="bold">Example...</fo:inline> from the 

+				<fo:inline font-weight="bold">New</fo:inline> menu, then selecting 

+				<fo:inline font-weight="bold">Royal and Loyal Example</fo:inline> under the 

+				<fo:inline font-weight="bold">OCL (Object Constraint Language) plugins</fo:inline>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Open 

+				<fo:inline font-weight="bold">RoyalAndLoyal.ecore</fo:inline> with the OCLinEcore editor to explore the Ecore metamodel. Note how the Outline can be alphabeticized and so provide a useful overview. The outline very similar to the conventional Sample Ecore Editor tree view.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Open 

+				<fo:inline font-weight="bold">RoyalAndLoyal.ocl</fo:inline> with the CompleteOCL editor to explore the OCL. Note how the full AST can be explored in the Outline.

+			</fo:block></fo:block><fo:block id="EmptyExample"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Empty Example Project</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">5.2. Empty Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Empty example project creates an empty project with a Java class path set up to assist in the use of OCL.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This assistance is not really necessary now that the editors are based on Xtext and now that an XMI representation is not automatically saved in a 

+				<fo:inline font-weight="bold">bin</fo:inline> directory.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL editors can be used wherever Ecore editors can be used. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not necessary for a project to have a Java nature.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not necessary for a project to have an Xtext nature. If you add an Xtext nature, your OCL files will be built automatically when other files in the project or its dependencies change. This can significantly clutter the Problems View if you have problems with your OCL, and may significantly increase build times.</fo:block></fo:block><fo:block id="OCLinEcoreTutorialExampleProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCLinEcore Tutorial Example Project</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">5.3. OCLinEcore Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore Tutorial project provides the conclusion of the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(OCLinEcoreTutorial)">OCLinEcore Tutorial</fo:basic-link> and the material for the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(GettingStarted)">Getting Started</fo:basic-link> quick introduction.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The project provides an example of OCL embedded in Ecore that is also used by the 

+				<fo:basic-link internal-destination="CodeGenerationTutorial"><fo:inline color="blue" text-decoration="underline">Code Generation Tutorial</fo:inline></fo:basic-link> and 

+				<fo:basic-link internal-destination="DebuggerTutorial"><fo:inline color="blue" text-decoration="underline">Debugger tutorial</fo:inline></fo:basic-link>. 

+			</fo:block></fo:block><fo:block id="CompleteOCLTutorialExampleProject"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Complete OCL Tutorial Example Project</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">5.4. Complete OCL Tutorial Example Project</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL Tutorial project provides examples for the the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(CompleteOCLTutorial)">Complete OCL Tutorial</fo:basic-link>.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The project provides examples Complete OCL documents that complement Ecore, UML, Xtext and XMI.</fo:block></fo:block><fo:block id="OCLInterpreterExample"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Interpreter Example</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">5.5. OCL Interpreter Example</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="Introduction"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Introduction</fo:marker><fo:block font-size="14pt">5.5.1. Introduction</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example illustrates the usage of the generic OCL Parser API to parse and evaluate OCL query expressions and constraints within the SDK. It demonstrates how to author OCL expressions and evaluate them against elements of library model instances, or against Ecore and UML elements.  For Ecore and UML models, a further option of parsing (not evaluating) model-level (M1 in the OMG modeling stack) constraints is available.</fo:block></fo:block><fo:block id="References4"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">References</fo:marker><fo:block font-size="14pt">5.5.2. References</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please refer to the document 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(ExamplesOverview)">Object Constraint Language Examples Overview</fo:basic-link> for reviewing the library meta-model used as the basis for demonstrating the capabilities in this example.

+				</fo:block></fo:block><fo:block id="Description"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Description</fo:marker><fo:block font-size="14pt">5.5.3. Description</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This example plug-in is named 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.emf.ocl.examples.interpreter</fo:inline>. This plug-in contributes the 

+					<fo:inline font-family="Inconsolata,Courier">OCL Interpreter</fo:inline> menu to the library editor’s main menu and context menu. The menu has one item:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N146E0"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N146E1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">Show Console</fo:inline>: Opens the interactive OCL console.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please refer to the tutorial 

+					<fo:basic-link internal-destination="OCLInterpreterTutorial"><fo:inline color="blue" text-decoration="underline">OCL Interpreter Tutorial</fo:inline></fo:basic-link> for reviewing the code samples within this example.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N146EF"><fo:external-graphic src="url(images/3200-lib_editor_contrib.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The bottom field in the console accepts OCL expressions (comments supported). You can press 

+					<fo:inline font-weight="bold">Enter</fo:inline> to evaluate on the currently selected element. You can press 

+					<fo:inline font-weight="bold">Ctrl+Enter</fo:inline> or 

+					<fo:inline font-weight="bold">Shift+Enter</fo:inline> to insert a newline. The top field shows the output and errors. The console can be cleared by the 

+					<fo:inline font-weight="bold">Eraser</fo:inline> button and closed by the 

+					<fo:inline font-weight="bold">X</fo:inline> button.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Because the 

+					<fo:inline font-family="Inconsolata,Courier">EXTLibrary</fo:inline> model is based on the Ecore metamodel, ensure that the 

+					<fo:inline font-family="Inconsolata,Courier">Ecore</fo:inline> metamodel is selected in the console’s tool bar.  Also ensure that the 

+					<fo:inline font-family="Inconsolata,Courier">M2</fo:inline> modeling level is selected, as 

+					<fo:inline font-family="Inconsolata,Courier">EXTLibrary</fo:inline> is not a metamodel, so instances of it are not models.  Thus, the OCL expressions that

+					we create will target the Ecore meta-model, as the model of the EXTLibrary model.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Content-assist is automatically activated on typing any of "

+					<fo:inline font-family="Inconsolata,Courier">.</fo:inline>", "

+					<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline>", "

+					<fo:inline font-family="Inconsolata,Courier">::</fo:inline>", and "

+					<fo:inline font-family="Inconsolata,Courier">^</fo:inline>".  Also, 

+					<fo:inline font-family="Inconsolata,Courier">Ctrl+Space</fo:inline> can be used to invoke content-assist at any time.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1472C"><fo:external-graphic src="url(images/3200-lib_console.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block></fo:block><fo:block id="SupportforEcoreandUMLModels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Support for Ecore and UML Models</fo:marker><fo:block font-size="14pt">5.5.4. Support for Ecore and UML Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Console contributes an 

+					<fo:inline font-weight="bold">OCL-&gt;Show OCL Console</fo:inline> menu action to the Ecore and UML editors (for 

+					<fo:inline font-family="Inconsolata,Courier">*.ecore</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">*.uml</fo:inline> models).  These actions automatically select the appropriate metamodel in the console.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For both Ecore and UML, parsing constraints at the 

+					<fo:inline font-family="Inconsolata,Courier">M1</fo:inline> (model) level is supported.  This implements a scratch pad for developing OCL constraints in the context of:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14747"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14748"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>classifiers, for invariant constraints</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1474B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>operations, for pre/post condition constraints and body expressions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1474E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>attributes, for initial-value and derivation constraints</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The console infers the kind of constraint from the selected element; in the case of an operation, it assumes a post-condition constraint as these constraints support a superset of the syntax for pre-conditions and body expressions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14755"><fo:external-graphic src="url(images/3200-ecore_console.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure above shows the parsing of a derivation constraint on an Ecore property (an 

+					<fo:inline font-family="Inconsolata,Courier">EStructuralFeature</fo:inline>).

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14762"><fo:external-graphic src="url(images/3200-uml_console.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The figure above shows the parsing of an invariant constraint on a UML classifier (a 

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>).  Note that UML can model the 

+					<fo:inline font-family="Inconsolata,Courier">Job</fo:inline> as an association class; a roughly equivalent Ecore model is more verbose.

+				</fo:block></fo:block><fo:block id="ExampleCode"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Example Code</fo:marker><fo:block font-size="14pt">5.5.5. Example Code</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Refer to the code in this example if you need to:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14776"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14777"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>parse, validate and evaluate OCL queries and constraints on EMF model elements</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1477A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>implement content-assist for OCL constraints in your model editor</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.eclipse.org/legal/epl-v20.html)">Copyright © 2000, 2007 IBM Corporation and others. All Rights Reserved.</fo:basic-link>

+				</fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Classic Ecore/UML Programmers Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Classic Ecore/UML Programmers Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="ProgrammersGuide"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 6. Classic Ecore/UML Programmers Guide</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML Programmers Guide describes the ways in which the Ecore or UML bindings of Eclipse OCL can be used from Java programs.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore binding has been available since Eclipse OCL 1.0.0 (Callisto). The UML binding was added in 1.1.0 (Europa). Both will remain for as long as necessary. Examples quality prototypes of the new UML-aligned Pivot binding were first available in 3.1.0 (Indigo). The Pivot binding 

+			became the preferred binding in 6.0.0 (Mars). The Pivot binding is described in a separate 

+			<fo:basic-link internal-destination="PivotProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Pivot Programmers Guide</fo:inline></fo:basic-link>.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Parser/Interpreter provides an implementation of the 

+			<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.omg.org/spec/OCL)">Object Constraint Language 2.4</fo:basic-link> specification for EMF-based metamodels and models.  It offers OCL

+			constraint and query parsing and evaluation, model-based validation, and

+			provides an infrastructure for content assist in textual editors.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following features are supported in the current version:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14797"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14798"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Classifier invariant constraints</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1479B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operation precondition and postcondition constraints and body conditions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1479E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Property constraints (initial-value and derivation)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147A1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Attribute and operation definitions (def: expressions)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147A4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Package context declaration</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147A7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Basic values and types</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147AA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Collection types</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147AD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of attributes and association ends</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147B0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operation invocation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147B3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Iteration expressions (all standard iterators)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147B6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Let expressions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147B9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>If expressions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147BC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Tuples</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147BF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Message expressions, including unspecified values</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147C2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operations predefined by OCL:  allInstances(), oclIsKindOf(), oclIsTypeOf(), oclAsType(), oclIsNew()</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147C5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Escape syntax for illegal names:  type, operation, attribute, etc. names that correspond to OCL reserved words can be escaped in the standard fashion using a leading underscore (‘_’).  In addition, names that contain spaces or tabs can be escaped by enclosing them in double-quotes (‘"’; this is non-standard).  e.g., 

+					<fo:inline font-family="Inconsolata,Courier">self.ownedRule-&gt;forAll(c : Constraint | c._context = self)</fo:inline>

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above constructs are supported by the parser for parsing and

+			for evaluation, with the exception of the oclIsNew() operation and

+			message expressions.  All of the above are supported for both Ecore

+			and UML models.  The following are supported by default for UML

+			(both in parsing and evaluation):</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N147CD"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147CE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of non-navigable association ends (including those that are owned by the association)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147D1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Qualified association end navigation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147D4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation to association classes, including source qualifiers</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147D7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operations predefined by OCL: oclIsInState()</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following features are provided in addition to the OCL specification:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N147DC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147DD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>String case conversion operations:  toUpper(), toLower()</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147E0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Support for comparison (&lt;, &lt;=, etc.) and sorting of any java 

+					<fo:inline font-family="Inconsolata,Courier">Comparable</fo:inline> s of conformant types

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147E6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Transitive closure of associations:  closure(expr : OCLExpression) iterator</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147E9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of “hidden” opposites of references specified in Ecore models using a 

+					<fo:inline font-family="Inconsolata,Courier">Property.oppositeRoleName</fo:inline> annotation with source 

+					<fo:inline font-family="Inconsolata,Courier">http://schema.omg.org/spec/MOF/2.0/emof.xml</fo:inline> on the forward reference, producing an 

+					<fo:inline font-family="Inconsolata,Courier">OppositePropertyCallExp</fo:inline> expression

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL implementation is defined in plug-ins for convenient deployment in

+			Eclipse, but as is the case for EMF, it can also be used stand-alone.  The

+			plug-ins are partitioned thus:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N147F7"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147F8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl</fo:inline>:  the core parsing, evaluation, and content assist services.  Definition of the OCL Abstract Syntax Model and Environment API.  These APIs are generic, independent of any particular metamodel (though using Ecore/EMF as the meta-meta-model).

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N147FE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore</fo:inline>:  implementation of the Ecore metamodel environment, binding the generic Environment and AST APIs to the Ecore language.  Provides support for working with OCL constraints and queries targeting Ecore models.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14804"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.uml</fo:inline>:  implementation of the UML metamodel environment, binding the generic Environment and AST APIs to the UML language.  Provides support for working with OCL targeting UML models.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Please refer to the 

+			<fo:basic-link internal-destination="OCLInterpreterTutorial"><fo:inline color="blue" text-decoration="underline">OCL Interpreter Tutorial</fo:inline></fo:basic-link> for review of the code samples.

+		</fo:block><fo:block id="ParsingConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing Constraints and Queries</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.1. Parsing Constraints and Queries</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL parser provides two APIs for parsing constraint and query expressions. The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+				</fo:basic-link> interface is designed primarily for parsing constraints and query expressions

+				embedded in models, such as Ecore or UML models.  The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+				</fo:basic-link> class serves as the main entrypoint into the parsing API but also implements the

+				parsing of 

+				<fo:basic-link internal-destination="ParsingDocuments"><fo:inline color="blue" text-decoration="underline">OCL documents</fo:inline></fo:basic-link>, for example from

+				text files.  In both cases, the concept of 

+				<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+				is crucial.

+			</fo:block><fo:block id="TheOCLEnvironment"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Environment</fo:marker><fo:block font-size="14pt">6.1.1. The OCL Environment</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following diagram shows the core of the 

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+					API, that clients of the OCL parser interact with:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14836"><fo:external-graphic src="url(images/5110-environment.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+					</fo:basic-link> class is a generic type; its type parameters represent the various metaclasses

+					of the metamodels that OCL works with in the UML/MOF family of OMG specifications.

+					For example, 

+					<fo:inline font-family="Inconsolata,Courier">&lt;C&gt;</fo:inline> represents the Classifier

+					concept, 

+					<fo:inline font-family="Inconsolata,Courier">&lt;O&gt;</fo:inline> the Operation concept, etc.  See

+					the discussion of 

+					<fo:basic-link internal-destination="TargetMetamodels"><fo:inline color="blue" text-decoration="underline">metamodels supported by OCL</fo:inline></fo:basic-link> 

+					for details of the mappings.  The same type parameter names are used consistently

+					throughout the OCL APIs to represent the same metaclasses.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class defines instances of autonomous OCL

+					parsing and evaluation environments.  It has a single root

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Environment.html)">

+						<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+					</fo:basic-link> created by an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>

+					</fo:basic-link> 

+					implementation for a particular EMF-based metamodel.  The OCL environment

+					consists, conceptually, of the model that is to be constrained together with

+					all of the constraints and additional operations and attributes defined (via

+					OCL) for the purpose of formulating constraints.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline> s nest.  Usually the root environment has

+					no correlation to an element in the model, or it may correspond to some

+

+					<fo:inline font-family="Inconsolata,Courier">Package</fo:inline> providing a default namespace (called a package

+					context).  Alternatively, it may contain one or more nested environments

+					defining package namespaces.  A package context contains one or more classifier

+					contexts, which in turn can contain operation and/or attribute contexts.  Whereas

+					the purpose of a package context is primarily to assist in the look-up of named

+					model elements, the classifier, operation, and attribute contexts have deeper

+					meaning.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A classifier context defines the type of the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+					variable in OCL constraints and queries.  By itself, it is the context for

+					invariant constraints for the context classifier.  Additionally, as the parent

+					context for operation and attribute constraints, it indicates the classifier

+					in which context an operation or attribute constraint applies; this may be the

+					classifier that defines these features, or it may inherit them from some more

+					general classifier.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An 

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline> may contain named

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/expressions/Variable.html)">

+						<fo:inline font-family="Inconsolata,Courier">Variable</fo:inline>

+					</fo:basic-link> s

+					to which OCL expressions can refer.  The most common of these is

+

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>.  Others include the parameters defined by an

+					operation (and its 

+					<fo:inline font-family="Inconsolata,Courier">result</fo:inline>), in the case of an

+					operation context.  The OCL API even allows clients to add variables, in code,

+					to define “global” names.

+				</fo:block></fo:block><fo:block id="CreatinganOCLEnvironment"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Creating an OCL Environment</fo:marker><fo:block font-size="14pt">6.1.2. Creating an OCL Environment</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The static factory methods on the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class are used

+					to create instances.  It is a good practice to re-use the same OCL instance for

+					all parsing and evaluation of constraints and queries on a model while that

+					model is loaded (usually in some 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> in an

+					editor).  Using the shared environment factory for the Ecore

+

+					<fo:basic-link internal-destination="TargetMetamodels"><fo:inline color="blue" text-decoration="underline">metamodel</fo:inline></fo:basic-link>, we can create an OCL

+					environment suitable for parsing OCL constraints on any Ecore model and

+					evaluating them on instances of the model:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14893"><fo:external-graphic src="url(images/5110-creating.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5110-creating.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Several of the type parameters in the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> generic type

+					signature are useful mostly within the OCL API.  We leave them, here, as wildcards.

+				</fo:block></fo:block><fo:block id="TheOCLHelper"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Helper</fo:marker><fo:block font-size="14pt">6.1.3. The OCL Helper</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From an OCL instance, we can create a helper object with which to parse constraints

+					and additional operation/attribute definitions.  This

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+					</fo:basic-link> 

+					stores all of the instantiations of OCL template metaclasses (such as

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/types/CollectionType.html)">

+						<fo:inline font-family="Inconsolata,Courier">CollectionType(T)</fo:inline>

+					</fo:basic-link> 

+					and 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/types/TupleType.html)">

+						<fo:inline font-family="Inconsolata,Courier">TupleType</fo:inline>

+					</fo:basic-link> 

+					and additional operation/attribute definitions in the root environment of the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> that created it.  This ensures that all of these

+					constructs are available for reuse in subsequent parsing.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N148C2"><fo:external-graphic src="url(images/5110-oclhelper.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block> 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> is primarily designed for parsing

+					constraints and query expressions embedded in models, providing the following

+					API for that purpose:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N148CD"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148CE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createQuery()</fo:inline>: parses a query expression

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148D4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createConstraint()</fo:inline>: parses a constraint of a given 

+							<fo:inline font-family="Inconsolata,Courier">ConstraintKind</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148DD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createInvariant()</fo:inline>: convenience for invariant constraints

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148E3"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createPrecondition()</fo:inline>: convenience for pre-condition constraints

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148E9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createPostcondition()</fo:inline>: convenience for post-condition constraints

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148EF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createBodyCondition()</fo:inline>: convenience for body conditions

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148F5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createInitialValueExpression()</fo:inline>: convenience for attribute initial values

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N148FB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">createDerivedValueExpression()</fo:inline>: convenience for attribute derived values

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14901"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">defineOperation()</fo:inline>: convenience for additional operation definitions

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14907"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">defineAttribute()</fo:inline>: convenience for additional attribute definitions

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Different kinds of constraints require different context environments.  The

+

+					<fo:inline font-family="Inconsolata,Courier">setContext()</fo:inline>, 

+					<fo:inline font-family="Inconsolata,Courier">setOperationContext()</fo:inline>,

+					and 

+					<fo:inline font-family="Inconsolata,Courier">setAttributeContext()</fo:inline> methods create the appropriate

+					nested 

+					<fo:inline font-family="Inconsolata,Courier">Environment@s in the host @OCL</fo:inline>

+					instance’s root environment.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The result of parsing a query expression is an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/expressions/OCLExpression.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCLExpression</fo:inline>

+					</fo:basic-link>,

+					an instance of the 

+					<fo:basic-link internal-destination="AbstractSyntax"><fo:inline color="blue" text-decoration="underline">Abstract Syntax Model</fo:inline></fo:basic-link> .  The

+					result of parsing a constraint is an instance of the

+

+					<fo:inline font-family="Inconsolata,Courier">Constraint</fo:inline> metaclass defined by the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>'s 

+					<fo:basic-link internal-destination="TargetMetamodels"><fo:inline color="blue" text-decoration="underline">target metamodel</fo:inline></fo:basic-link> .

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14934"><fo:external-graphic src="url(images/5110-context.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5110-context.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Ecore does not define a 

+					<fo:inline font-family="Inconsolata,Courier">Constraint</fo:inline> metaclass, so the

+					OCL 

+					<fo:basic-link internal-destination="TargetMetamodels"><fo:inline color="blue" text-decoration="underline">binding</fo:inline></fo:basic-link> for Ecore supplies one.

+				</fo:block></fo:block><fo:block id="OperationandAttributeContexts"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Operation and Attribute Contexts</fo:marker><fo:block font-size="14pt">6.1.4. Operation and Attribute Contexts</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the case of constraints on operations or attributes, the context consists

+					of two elements:  the constrained operation/attribute and a classifier in the

+					context of which the constraint is to apply.  This accounts for the possibility

+					that a classifier defines constraints on inherited features.  As an example,

+					consider the 

+					<fo:inline font-family="Inconsolata,Courier">EModelElement::getEAnnotation(EString)</fo:inline>

+					operation and 

+					<fo:inline font-family="Inconsolata,Courier">EReference::eReferenceType</fo:inline> property in the Ecore

+					metamodel.  These can be constrained as follows:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14955"><fo:external-graphic src="url(images/5110-define.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5110-define.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block></fo:block><fo:block id="EvaluatingConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Evaluating Constraints and Queries</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.2. Evaluating Constraints and Queries</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In 

+				<fo:basic-link internal-destination="ParsingConstraints"><fo:inline color="blue" text-decoration="underline">Parsing Constraints</fo:inline></fo:basic-link>, we saw how to use

+				the 

+				<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> API for parsing OCL constraints and

+				query expressions.  Parsing constraints is very interesting in itself, but

+				we can also make OCL come alive in our applications by evaluating these

+				constraints.  For this, OCL provides a 

+				<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API.

+			</fo:block><fo:block id="TheOCLQuery"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Query</fo:marker><fo:block font-size="14pt">6.2.1. The OCL Query</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Like the 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> for parsing constraints, the OCL

+					facade object provides

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Query.html)">

+						<fo:inline font-family="Inconsolata,Courier">Query</fo:inline>

+					</fo:basic-link>

+					objects for evaluating constraints and query expressions.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14981"><fo:external-graphic src="url(images/5115-query.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> encapsulates an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EvaluationEnvironment.html)">

+						<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline>

+					</fo:basic-link>

+					providing the run-time values of context variables to the OCL interpreter.  These

+					context variables are set and retrieved using the following methods:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14992"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14993"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">add(String, Object)</fo:inline>: adds a name-value binding for a variable

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14999"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">replace(String, Object)</fo:inline>:  replaces an existing variable binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1499F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">remove()</fo:inline>:  removes a variable binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N149A5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">getValueOf(String)</fo:inline>: obtains a variable value

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context variables of primary interest are 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+					and, in operation constraints, the variables corresponding to its parameters.

+					The 

+					<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline> API is also used to supply

+					values for “global” variables added to the parsing 

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+					by the client.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Another important consideration in the evaluation environment is the

+

+					<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline> operation, which obtains the entire

+					extent of a classifier.  For data types, this is a simple problem:  the extent

+					of an 

+					<fo:inline font-family="Inconsolata,Courier">Enumeration</fo:inline> is well defined and the extents of

+					other kinds of 

+					<fo:inline font-family="Inconsolata,Courier">DataType</fo:inline> s are undefined.  For

+

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> extents, the 

+					<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline>

+					provides support for an extent map, mapping classes to the sets of their

+					instances, as determined by the client.  A client sets the extent map using the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html#setExtentMap(java.util.Map))">

+						<fo:inline font-family="Inconsolata,Courier">OCL.setExtentMap()</fo:inline>

+					</fo:basic-link>

+					method.  The default extent map, if none is provided by the client, lazily

+					computes the extent of a class from the EMF 

+					<fo:inline font-family="Inconsolata,Courier">Resource</fo:inline>

+					containing the context element of the evaluation. An alternative extent map can be

+					found in 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/opposites/ExtentMap.html)">

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore.opposites.ExtentMap</fo:inline>

+					</fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">So, after optionally setting values of context variables (other than

+

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>; the 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> takes care

+					of this) and an extent map, simply construct a query and use it to evaluate

+					the expression or check the constraint:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N149E2"><fo:external-graphic src="url(images/5115-check-all.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5115-check-all.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">One of the advantages of the 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API is that a

+					query’s evaluation environment can be reused for multiple evaluations, as

+					above.  The extent of any classifier is only computed once.  For convenience,

+					however, in situations where only a single evaluation is required, the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class provides shortcuts:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N149F6"><fo:external-graphic src="url(images/5115-check-one.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5115-check-one.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API also provides methods that work on

+					multiple elements.  The first example, above, could be written more succinctly as:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14A07"><fo:external-graphic src="url(images/5115-check-quick.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5115-check-quick.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block></fo:block><fo:block id="ParsingDocuments"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing OCL Documents</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.3. Parsing OCL Documents</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As we saw in the 

+				<fo:basic-link internal-destination="ParsingConstraints"><fo:inline color="blue" text-decoration="underline">Parsing Constraints and Queries</fo:inline></fo:basic-link> topic, the OCL parser provides an 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+				</fo:basic-link> API for parsing constraints embedded in models.  OCL also permits constraints

+				to be specified in a text document, as an adjunct to the model.  In this case,

+				the concrete syntax for context declarations indicates the context of

+				constraints, equivalent to their placement in models.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As an example, consider the following Complete OCL document: "</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14A26"><fo:external-graphic src="url(images/5120-extlibrary.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5120-extlibrary.ocl)">[Text for cut and paste]</fo:basic-link>

+			</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					The 

+					<fo:inline font-style="italic">import</fo:inline> on the first line is an extension supported by the Complete OCL editor for use with the Pivot meta-model. The 

+					<fo:inline font-style="italic">import</fo:inline> is ignored by the parsers for the Ecore or UML bindings, which assume that the relevant metamodels have been registered in either the global EPackage.Registry or the local EPackage.Registry passed to the EnvironmentFactory..

+				</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block id="TheOCLInput"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Input</fo:marker><fo:block font-size="14pt">6.3.1. The OCL Input</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCLInput.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCLInput</fo:inline>

+					</fo:basic-link> class encapsulates an OCL document.  An input can be created from a string or an

+					input stream.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14A49"><fo:external-graphic src="url(images/5120-input.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Given an 

+					<fo:inline font-family="Inconsolata,Courier">OCLInput</fo:inline>, simply ask an 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> to parse it: "

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14A59"><fo:external-graphic src="url(images/5120-parsing.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5120-parsing.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="AccessingtheConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Accessing the Constraints</fo:marker><fo:block font-size="14pt">6.3.2. Accessing the Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> returns the list of constraints if they were

+					successfully parsed.  They are retained by the OCL (available via the

+

+					<fo:inline font-family="Inconsolata,Courier">getConstraints()</fo:inline> method at any time), and in particular,

+					any definitions of additional operations or attributes are available for

+					subsequent constraint parsing.  Any number of OCL documents may be parsed by

+					the same 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance, combined also with constraints

+					parsed by 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelpers</fo:inline>.  All of these constraints are

+					retained by the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> environment.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14A7A"><fo:external-graphic src="url(images/5120-accessing.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/5120-accessing.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The source for these examples may be found in the org.eclipse.ocl.ecore.tests plugin in model/parsingDocumentsExample.ocl and in src/org/eclipse/ocl/ecore/tests/DocumentationExamples.java.</fo:block></fo:block></fo:block><fo:block id="TargetMetamodels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Relationship to Metamodels</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.4. OCL Relationship to Metamodels</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL implementation provides support for models defined using either the

+				Ecore or the UML metamodel (as implemented by the Eclipse EMF and UML2 projects),

+				and an 

+				<fo:basic-link internal-destination="AdvancedMetamodelBindings"><fo:inline color="blue" text-decoration="underline">extensibility API</fo:inline></fo:basic-link> that allows

+				additional EMF-based metamodels to be plugged in.

+			</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					The direct and indirect coupling of the Ecore and UML2 meta-models to Ecore makes exact compliance with the OMG specification very difficult, particularly in the area of reflection. Eclipse OCL is therefore migrating to a new potentially 100% OMG compliant Pivot metamodel that hides the differencess between OMG’s UML and EMOF and Eclipse’s UML and Ecore. The Pivot binding is described in the 

+					<fo:basic-link internal-destination="PivotProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Pivot Programmers Guide</fo:inline></fo:basic-link>.

+				</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				The OCL API implements support for different target metamodels via the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EnvironmentFactory.html)">

+					<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>

+				</fo:basic-link> interface. An implementation of this interface binds the metamodel’s metaclasses to the generic type parameters of the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+				</fo:basic-link> class. The metamodel-specific 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Environment.html)">

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+				</fo:basic-link> implementation constructed by this factory implements the reflection capability required by OCL to discover the elements of the model being constrained and the relationships between them.

+			</fo:block><fo:block id="TheEcoreMetamodelBinding"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Ecore Metamodel Binding</fo:marker><fo:block font-size="14pt">6.4.1. The Ecore Metamodel Binding</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OCL binding for the Ecore metamodel is provided by the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore</fo:inline> plug-in.  It is best suited to parsing and evaluating OCL constraints on Ecore models.  Evaluation of constraints is supported on instances of the EMF-generated Java API (Ecore as the source for the genmodel) and on dynamic EObjects.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As is illustrated by most of the examples in this documentation, the Ecore binding is provided by the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/EcoreEnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory</fo:inline>

+					</fo:basic-link> class.  By default, the Ecore environment uses the static 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> registry to look up package names.  It can also be supplied with an alternative package registry (for example, one local to a 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>) but it will always use the static registry as a backup.  Aside from the package registry, the Ecore environment factory maintains no state.  So, when the shared registry is to be used, the static 

+					<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory.INSTANCE</fo:inline> is most practical.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore binding for OCL provides the following capabilities, reflecting the subset of Ecore’s modeling constructs with respect to UML:</fo:block><fo:block xmlns:rx="http://www.renderx.com/XSL/Extensions" space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="N14ACB"><fo:table border-before-width.conditionality="retain" border-collapse="collapse" width="100%" border-start-style="solid" border-end-style="solid" border-top-style="solid" border-bottom-style="solid" border-start-width="0.5pt" border-end-width="0.5pt" border-top-width="0.5pt" border-bottom-width="0.5pt" border-start-color="black" border-end-color="black" border-top-color="black" border-bottom-color="black"><fo:table-body end-indent="0pt" start-indent="0pt"><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Capability</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Parse</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Evaluate</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Classifier invariant constraints</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operation precondition and postcondition constraints and body conditions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Property constraints (initial-value and derivation)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y*</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Attribute and operation definitions (def: expressions)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Package context declaration</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>n/a</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Basic values and types, mapped from the standard EDataTypes to OCL’s primitive types</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Collection types</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Navigation of attributes and references</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operation invocation</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Iteration expressions (all standard iterators)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Let expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>If expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Tuples</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Message expressions, including unspecified values</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  allInstances()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  oclIsKindOf(), oclIsTypeOf(), oclAsType()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  oclIsNew()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>@pre expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>* derivation only</fo:block></fo:table-cell>

+					</fo:table-row></fo:table-body></fo:table></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-weight="bold">Ecore metamodel capability matrix</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Because Ecore does not define analogues of some of the UML metaclasses required by the OCL Abstract Syntax Model, the Ecore binding defines these on its behalf, in the 

+					<fo:inline font-family="Inconsolata,Courier">platform:/plugin/org.eclipse.ocl.ecore/model/OCLEcore.ecore</fo:inline> metamodel.  These include:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14C21"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C22"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">Constraint</fo:inline>: the model of an OCL constraint (when the 

+							<fo:inline font-family="Inconsolata,Courier">language</fo:inline> is OCL)

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C2B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">CallOperationAction</fo:inline>:  used in the model of message expressions

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C31"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">SendSignalAction</fo:inline>: used in the model of message expressions

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C37"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline>:  it is this metaclass’s general class 

+							<fo:inline font-family="Inconsolata,Courier">OpaqueExpression</fo:inline> that Ecore does not define.  It is elided in the Ecore binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C40"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">State</fo:inline>:  Ecore provides no behavior modeling capabilities.  The Ecore binding simply substitutes 

+							<fo:inline font-family="Inconsolata,Courier">EObject</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For applications that work exclusively with the Ecore binding for OCL, the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore</fo:inline> package defines a subclass of the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class that supplies all of the generic type parameter bindings to simplify typing (in the absence of type aliasing in Java). It also provides Ecore-specific convenience factory methods for the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>, itself, and narrows the return type of the factory methods for the 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> interfaces.  These specialized interfaces likewise supply the generic type parameter bindings for Ecore.

+				</fo:block></fo:block><fo:block id="TheUMLMetamodelBinding"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The UML Metamodel Binding</fo:marker><fo:block font-size="14pt">6.4.2. The UML Metamodel Binding</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An OCL binding for the UML metamodel is provided by the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.uml</fo:inline> plug-in.  It is best suited to parsing and evaluating OCL constraints on UML models.  Evaluation of constraints is supported on instances of the UML2-generated Java API (UML as the source for the genmodel), on dynamic EObjects (using an Ecore model created by the UML-to-Ecore converter), and on 

+					<fo:inline font-family="Inconsolata,Courier">InstanceSpecification</fo:inline> elements in the UML model.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML binding is provided by the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/uml/UMLEnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">UMLEnvironmentFactory</fo:inline>

+					</fo:basic-link> class.  By default, the UML environment factory and all of the environment contexts that it creates use a private 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> to look up the corresponding UML model(s) against which OCL constraints are parsed.

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14C72"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14C73"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>It is the client’s responsibility to ensure that the UML model is loaded in the resource set used by the UML environment factory instance.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML environment factory can alternatively be initialized with a resource set of the client’s choosing.  Ordinarily, the UML environment uses its resource set’s local 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> registry to look up EMF-generated 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> names corresponding to UML models.  A custom package registry may be provided by the client if necessary.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The UML binding for OCL provides the following capabilities:</fo:block><fo:block xmlns:rx="http://www.renderx.com/XSL/Extensions" space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="N14C80"><fo:table border-before-width.conditionality="retain" border-collapse="collapse" width="100%" border-start-style="solid" border-end-style="solid" border-top-style="solid" border-bottom-style="solid" border-start-width="0.5pt" border-end-width="0.5pt" border-top-width="0.5pt" border-bottom-width="0.5pt" border-start-color="black" border-end-color="black" border-top-color="black" border-bottom-color="black"><fo:table-body end-indent="0pt" start-indent="0pt"><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Capability</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Parse</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Evaluate</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Classifier invariant constraints</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operation precondition and postcondition constraints and body conditions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Property constraints (initial-value and derivation)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y*</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Attribute and operation definitions (def: expressions)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Package context declaration</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>n/a</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Basic values and types</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y+</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Collection types</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operation invocation</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y-</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Navigation of attributes and references</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Navigation of non-navigable association ends (including those that are owned by the association)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Qualified association end navigation</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y=</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Navigation to association classes, including source qualifiers</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y=</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Iteration expressions (all standard iterators)</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Let expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>If expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Tuples</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Message expressions, including unspecified values</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  allInstances()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  oclIsKindOf(), oclIsTypeOf(), oclAsType()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  oclIsInState()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations predefined by OCL:  oclIsNew()</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>@pre expressions</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Y</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>N</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>* derivation only</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>+ OCL defines the Real primitive type that is missing from UML, but not a LiteralReal</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>- with InstanceSpecifications, only where body constraints are defined</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>= only with InstanceSpecifications</fo:block></fo:table-cell>

+					</fo:table-row></fo:table-body></fo:table></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-weight="bold">UML metamodel capability matrix</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A special case of the UML environment’s support for dynamic EObjects, mentioned

+					above, is stereotype applications.  The Eclipse UML2 component uses dynamic

+					EMF in the implementation of stereotype applications, by converting UML

+

+					<fo:inline font-family="Inconsolata,Courier">Profile</fo:inline> s to 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> s.

+					Constraints parsed in the context of a UML 

+					<fo:inline font-family="Inconsolata,Courier">Stereotype</fo:inline>

+					can be evaluated on applications (instances) of that stereotype or on model

+					elements to which the stereotype is applied.  This applies only to UML models,

+					themselves, as instances of the UML metamodel (stereotyping is only available

+					in the UML metamodel).

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For applications that work exclusively with the UML binding for OCL, the

+

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.uml</fo:inline> package defines a subclass of

+					the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class that supplies all of the generic type

+					parameter bindings to simplify typing (in the absence of type aliasing in Java).

+					It also provides UML-specific convenience factory methods for the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>, itself, and narrows the return type of the factory

+					methods for the 

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> and

+

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> interfaces.  These specialized interfaces likewise

+					supply the generic type parameter bindings for UML.

+				</fo:block></fo:block></fo:block><fo:block id="ContentAssistSupport"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Content Assist Support</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.5. Content Assist Support</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					The Content Assist facilities described here are used by the Interactive OCL Console. They are not used by the new Xtext-based Editors or the Interactive Xtext OCL Console.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/OCLHelper.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline>

+				</fo:basic-link> API provides support for content-assist in rich editors, by parsing partial OCL

+				expressions and supplying completion suggestions. The

+

+				<fo:inline font-family="Inconsolata,Courier">List&lt;Choice&gt; getSyntaxHelp(ConstraintKind, String)</fo:inline> operation

+				returns a list of suggestions for the next token to follow the end of the

+				expression fragment.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14E5B"><fo:external-graphic src="url(images/5140-contentassist.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/helper/Choice.html)">

+					<fo:inline font-family="Inconsolata,Courier">Choice</fo:inline>

+				</fo:basic-link> objects returned by the helper include some convenient text strings (name and

+				description) to formulate basic JFace content-assist proposals.  Each choice

+				also carries a reference to the element that it represents, the kind of element

+				indicated by the 

+				<fo:inline font-family="Inconsolata,Courier">ChoiceKind</fo:inline> enumeration, for a more

+				sophisticated content assist that might inlude context information, documentation,

+				etc. as in Eclipse JDT.  The list of choices depends in part on the kind of

+				constraint expression that is to be completed, as for example, the

+

+				<fo:inline font-family="Inconsolata,Courier">oclIsNew()</fo:inline> operation is only permitted in operation

+				post-conditions.

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N14E70"><fo:inline font-family="Inconsolata,Courier">helper.setContext(EXTLibraryPackage.Literals.BOOK);

+

+List&lt;Choice&gt; choices = helper.getSyntaxHelp(ConstraintKind.INVARIANT,

+    "Book.allInstances()-&gt;collect(author)-&gt;");

+

+for (Choice next : choices) {

+    switch (next.getKind()) {

+    case OPERATION:

+    case SIGNAL:

+        // the description is already complete

+        System.out.println(next.getDescription());

+    case PROPERTY:

+    case ENUMERATION_LITERAL:

+    case VARIABLE:

+        System.out.println(next.getName() + " : " + next.getDescription();

+        break;

+    default:

+        System.out.println(next.getName());

+        break;

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block id="SyntaxCompletionChoices"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Syntax Completion Choices</fo:marker><fo:block font-size="14pt">6.5.1. Syntax Completion Choices</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The computation of 

+					<fo:inline font-family="Inconsolata,Courier">Choice</fo:inline> s is supported for the

+					following tokens, which may be used by a client as auto-assist triggers:

+				</fo:block><fo:block xmlns:rx="http://www.renderx.com/XSL/Extensions" space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="N14E7F"><fo:table border-before-width.conditionality="retain" border-collapse="collapse" width="100%" border-start-style="solid" border-end-style="solid" border-top-style="solid" border-bottom-style="solid" border-start-width="0.5pt" border-end-width="0.5pt" border-top-width="0.5pt" border-bottom-width="0.5pt" border-start-color="black" border-end-color="black" border-top-color="black" border-bottom-color="black"><fo:table-body end-indent="0pt" start-indent="0pt"><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Token</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Completion choices</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">.</fo:inline>

+						</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Features applicable to the type of the expression to the left of the dot, or its element type if it is a collection. association classes (in the UML environment only)</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">-&gt;</fo:inline>

+						</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Collection operations and iterators</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">::</fo:inline>

+						</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Packages, types, enumeration literals, and states (in the UML environment only)</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">^</fo:inline>

+						</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Operations and signals (in the UML environment only)</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">^^</fo:inline>

+						</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block/></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block/></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>In other situations, the choices the current context variables and implicit references to features of the 

+							<fo:inline font-family="Inconsolata,Courier">self</fo:inline> variable.  For example, if the input is something like 

+							<fo:inline font-family="Inconsolata,Courier">""</fo:inline> or 

+							<fo:inline font-family="Inconsolata,Courier">"self.isOrdered and "</fo:inline>

+						</fo:block></fo:table-cell>

+					</fo:table-row></fo:table-body></fo:table></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:inline font-weight="bold">Content-assist triggers</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The completion of partially specified identifiers is also supported, by

+					backtracking to look for one of these triggering tokens.  This supports

+					interactively narrowing the choices while the content-assist window is active.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N14EF2"><fo:inline font-family="Inconsolata,Courier">choices = helper.getSyntaxHelp(ConstraintKind.POSTCONDITION,

+    "self.author.oclIs");

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="AbstractSyntax"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Abstract Syntax Model</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.6. OCL Abstract Syntax Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Abstract Syntax Model is defined by the

+

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.omg.org/spec/OCL)">OCL Language 2.4 specification</fo:basic-link> .

+				We will not attempt to describe this model, here.  However, the Eclipse

+				implementation of OCL defines some extensions to this model that provide

+				additional services.  The most important of these is support for the

+

+				<fo:inline font-style="italic">Visitor</fo:inline> design pattern.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N14F07"><fo:external-graphic src="url(images/5150-ast.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+			</fo:block><fo:block id="TheVisitableandVisitorInterfaces"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Visitable and Visitor Interfaces</fo:marker><fo:block font-size="14pt">6.6.1. The Visitable and Visitor Interfaces</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All of the metaclasses in the Abstract Syntax Model (nodes in the AST) that can be visited implement the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/Visitable.html)">

+						<fo:inline font-family="Inconsolata,Courier">Visitable</fo:inline>

+					</fo:basic-link> interface.  It define a single operation 

+					<fo:inline font-family="Inconsolata,Courier">accept(Visitor)</fo:inline>. This method delegates to the appropriate 

+					<fo:inline font-family="Inconsolata,Courier">visitXyz(Xyz)</fo:inline> method of the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/Visitor.html)">

+						<fo:inline font-family="Inconsolata,Courier">Visitor</fo:inline>

+					</fo:basic-link> . The direct implementors of the 

+					<fo:inline font-family="Inconsolata,Courier">Visitable</fo:inline> interface are the 

+					<fo:inline font-family="Inconsolata,Courier">OCLExpression</fo:inline> and those metaclasses of the 

+					<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package that do not conform to 

+					<fo:inline font-family="Inconsolata,Courier">OCLExpression</fo:inline>:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14F33"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14F34"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">Variable</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14F3A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">CollectionLiteralPart</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14F40"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">TupleLiteralPart</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14F46"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline>

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This last is not defined in the 

+					<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package

+					because it pertains to the placement of OCL in 

+					<fo:inline font-family="Inconsolata,Courier">Constraint</fo:inline>

+					elements in models.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL parser, internally, defines a few implementations of visitors, including

+					a 

+					<fo:inline font-family="Inconsolata,Courier">ValidationVisitor</fo:inline> for validating OCL expressions and an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EvaluationVisitor.html)">

+						<fo:inline font-family="Inconsolata,Courier">EvaluationVisitor</fo:inline>

+					</fo:basic-link> for evaluating OCL expressions.

+				</fo:block></fo:block><fo:block id="ImplementingaVisitor"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Implementing a Visitor</fo:marker><fo:block font-size="14pt">6.6.2. Implementing a Visitor</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The best way to implement a visitor is to extend the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/AbstractVisitor.html)">

+						<fo:inline font-family="Inconsolata,Courier">AbstractVisitor</fo:inline>

+					</fo:basic-link> class.  It provides a 

+					<fo:inline font-family="Inconsolata,Courier">result</fo:inline> variable of the generic

+					type parameter type 

+					<fo:inline font-family="Inconsolata,Courier">T</fo:inline> to store the result computed

+					by the visitor (optional) and a convenient pattern of selective method overrides

+					to process only those nodes of interest for the task at hand.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">AbstractVisitor</fo:inline> provides implementations of all

+					of the 

+					<fo:inline font-family="Inconsolata,Courier">visitXyz()</fo:inline> interface methods that simply

+					return the current 

+					<fo:inline font-family="Inconsolata,Courier">result</fo:inline> value.  Furthermore, for

+					any internal nodes of the syntax tree (such as

+

+					<fo:inline font-family="Inconsolata,Courier">OperationCallExp</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">IfExp</fo:inline>),

+					the 

+					<fo:inline font-family="Inconsolata,Courier">visitXyz()</fo:inline> methods recursively visit the child

+					nodes, feeding the results of those descents into a 

+					<fo:inline font-family="Inconsolata,Courier">handleXyz()</fo:inline>

+					method that the subclass can override to compute some result from the child

+					results.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Thus, a subclass needs only to selectively override the default implementations

+					of 

+					<fo:inline font-family="Inconsolata,Courier">visitXyz()</fo:inline> methods for leaf tree nodes and

+

+					<fo:inline font-family="Inconsolata,Courier">handleXyz()</fo:inline> methods for non-leaves.  For example, to

+					find all variables that are declared but never used:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N14F92"><fo:inline font-family="Inconsolata,Courier">OCLExpression&lt;Classifier&gt; expr = getExpression();  // hypothetical source of an expression

+

+Set&lt;Variable&lt;Classifier, Parameter&gt;&gt; variables = expr.accept(

+    new AbstractVisitor&lt;Set&lt;Variable&lt;Classifier, Parameter&gt;&gt;,

+                Classifier, Operation, Property, EnumerationLiteral,

+                Parameter, State, CallOperationAction, SendSignalAction, Constraint&gt;(

+            new HashSet&lt;Variable&lt;Classifier, Parameter&gt;&gt;()) {  // initialize the result

+        

+        @Override

+        protected Set&lt;Variable&lt;Classifier, Parameter&gt;&gt; handleVariable(

+                Variable&lt;Classifier, Parameter&gt; variable,

+                Set&lt;Variable&lt;Classifier, Parameter&gt;&gt; initResult) {

+            

+            result.add(variable);

+            

+            return result;

+        }

+    

+        @Override

+        public Set&lt;Variable&lt;Classifier, Parameter&gt;&gt; visitVariableExp(

+                VariableExp&lt;Classifier, Parameter&gt; v) {

+            

+            result.remove(v.getReferredVariable());

+        

+            return result;

+        }

+    }});

+

+Set&lt;String&gt; varNames = new HashSet&lt;String&gt;();

+for (Variable&lt;?, ?&gt; next : variables) {

+    varNames.add(next.getName());

+}

+

+System.out.println("Unused variables: + " varNames);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="HiddenOpposites"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OppositePropertyCallExp Extension</fo:marker><fo:block font-size="14pt">6.6.3. The OppositePropertyCallExp Extension</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In Ecore models, a reference may have defined an 

+					<fo:inline font-family="Inconsolata,Courier">opposite</fo:inline> reference, usually owned by the class that is

+					the type of the forward reference. An opposite reference has several, often undesirable or even

+					prohibitive, implications on the class owning it:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N14FA1"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14FA2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>A getter and, for settable features with upper multiplicity 1, a setter will be added, requiring the class to know the class owning the forward reference. This would create cyclic component references if the two classes lived in different components and would therefore not be possible.</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N14FA5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>The default serialization format and usually the storage format for non-default model stores changes to include the opposite reference.</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Yet, particularly for expressing constraints over the instance models it is often instrumental

+					to be able to navigate such forward references also in reverse. The 

+					<fo:inline font-family="Inconsolata,Courier">OppositePropertyCallExp</fo:inline>

+					class which inherits from 

+					<fo:inline font-family="Inconsolata,Courier">NavigationCallExp</fo:inline> and is sibling of

+

+					<fo:inline font-family="Inconsolata,Courier">PropertyCallExp</fo:inline> allows for this reverse navigation in OCL. It

+					points to the forward reference, and its semantics are to navigate this reference in reverse.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To allow for convenient creation of such expressions in the OCL concrete syntax, the standard

+					property call syntax, such as 

+					<fo:inline font-family="Inconsolata,Courier">self.x</fo:inline> can be used, where 

+					<fo:inline font-family="Inconsolata,Courier">x</fo:inline>

+					is not the name of a forward reference on 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>'s class but rather

+					an annotated name on a reference using 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>'s class or any of its

+					base classes as its type. To enable this feature, use the special environment factory class

+

+					<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactoryWithHiddenOpposites</fo:inline> when initializing the

+					OCL environment, e.g., by passing such an object to the 

+					<fo:inline font-family="Inconsolata,Courier">OCL.newInstance(...)</fo:inline>

+					method.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The name for the reverse navigation can be specified by an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/modeling/emf/emf/javadoc/2.6.0/org/eclipse/emf/ecore/EAnnotation.html)">

+						<fo:inline font-family="Inconsolata,Courier">EAnnotation</fo:inline>

+					</fo:basic-link> with

+					source 

+					<fo:inline font-family="Inconsolata,Courier">http://schema.omg.org/spec/MOF/2.0/emof.xml</fo:inline> and with

+					details key 

+					<fo:inline font-family="Inconsolata,Courier">Property.oppositeRoleName</fo:inline>. The details value

+					contains the name by which the “hidden” opposite can be referred to in OCL

+					expressions.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If OCL delegates are to be used, the standard EPackage annotations with 

+					<fo:inline font-family="Inconsolata,Courier">invocationDelegate</fo:inline>, 

+					<fo:inline font-family="Inconsolata,Courier">settingDelegate</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">validationDelegate</fo:inline> details for the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline> source must be augmented as shown by a further 

+					<fo:inline font-family="Inconsolata,Courier">hiddenOpposites</fo:inline> detail for the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> source.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N14FEC"><fo:external-graphic src="url(images/5155-hidden-opposites.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This additional annotation causes the 

+					<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>

+					functionality for the EPackage to be provided by an instance of the

+

+					<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactoryWithHiddenOpposites</fo:inline> class

+					which uses the 

+					<fo:inline font-family="Inconsolata,Courier">DefaultOppositeEndFinder</fo:inline> class will be used for finding

+					and navigating the hidden opposites. More substantial customisation is possible by specifying

+					an 

+					<fo:inline font-family="Inconsolata,Courier">environmentFactoryClass</fo:inline> detail with the fully qualified

+					name of a derived 

+					<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory</fo:inline> that

+					provides a constructor taking an 

+					<fo:inline font-family="Inconsolata,Courier">EPackage.Registry</fo:inline> argument.

+					Note, that the class specified must be visible by your Ecore model’s bundle.

+				</fo:block></fo:block></fo:block><fo:block id="CustomizingtheEnvironment"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Customizing the Environment</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.7. Customizing the Environment</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An application that integrates OCL may find it advantageous to provide its users with an

+				enhanced OCL environment, to simplify their task of formulating OCL constraints and queries.

+				For example, an application might define additional “primitive” operations on the OCL

+				standard data types that are pertinent to its domain, or “global” variables that inject

+				useful objects into the user’s context. It is also possible to customize the way

+				“hidden” opposites are looked up and navigated, specifically to allow reverse navigation

+				across Ecore references that have no opposite defined.</fo:block><fo:block id="DefiningGlobalVariables"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Defining Global Variables</fo:marker><fo:block font-size="14pt">6.7.1. Defining Global Variables</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Consider an application that allows end-users to specify conditions, using OCL, to filter

+					the objects that are shown in the user interface.  Given a sufficiently rich model

+					(expressed in Ecore or UML) of the objects that the UI presents, many conditions can be

+					expressed entirely in terms of this model.  However, some queries might depend on state

+					of the application, itself, not the data:  which perspective is active, whether some view

+					is showing, or even the time of day.  These are not characteristics of the objects that the

+					user wishes to filter.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Such an application might, then, choose to define application-specific variables that a

+					filter condition can query:  

+					<fo:inline font-family="Inconsolata,Courier">app$perspective</fo:inline>, 

+					<fo:inline font-family="Inconsolata,Courier">app$views</fo:inline>, 

+					<fo:inline font-family="Inconsolata,Courier">app$time</fo:inline>.  Or, perhaps a

+					single variable 

+					<fo:inline font-family="Inconsolata,Courier">app$</fo:inline>, that has properties that a condition can access:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1501F"><fo:inline font-family="Inconsolata,Courier">-- filter out OCL files in the Web Development perspective

+self.extension = 'ocl' and app$.perspective = 'Web Development'

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To do this, we define a small Ecore model of our application context, e.g.:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15029"><fo:external-graphic src="url(images/5160-appcontext.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Then, in the code that parses a user’s filter condition:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15031"><fo:inline font-family="Inconsolata,Courier">OCL&lt;?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject&gt; ocl;

+ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE);

+

+OCLHelper&lt;EClassifier, ?, ?, Constraint&gt; helper = ocl.createOCLHelper();

+helper.setContext(MyPackage.Literals.FILE);

+

+// create a variable declaring our global application context object

+Variable&lt;EClassifier, EParameter&gt; appContextVar =

+        ExpressionsFactory.eINSTANCE.createVariable();

+appContextVar.setName("app$");

+appContextVar.setType(AppPackage.Literals.APP_CONTEXT);

+

+// add it to the global OCL environment

+ocl.getEnvironment().addElement(appContextVar.getName(), appContextVar, true);

+

+List&lt;Constraint&gt; conditions = new ArrayList&lt;Constraint&gt;();

+

+// parse the user's filter conditions

+for (String cond : getFilterConditions()) {

+    conditions.add(helper.createInvariant(cond));

+}

+

+// apply the filters

+applyFilters(conditions);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The body of our hypothetical 

+					<fo:inline font-family="Inconsolata,Courier">applyFilters()</fo:inline> method must bind this

+					context variable to a value.  In this case, the value can be computed when we apply the

+					filters:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1503C"><fo:inline font-family="Inconsolata,Courier">AppContext appContext = AppFactory.eINSTANCE.createAppContext();

+

+// hypothetical workbench utilities

+appContext.setPerspective(WorkbenchUtil.getCurrentPerspective());

+appContext.getViews().addAll(WorkbenchUtil.getOpenViewIDs());

+appContext.setTime(new Date());

+

+List&lt;Query&lt;EClassifier, EClass, EObject&gt;&gt; queries =

+    new ArrayListlt;Query&lt;EClassifier, EClass, EObject&gt;&gt;(constraints.size());

+

+for (Constraint next : constraints) {

+    Query&lt;EClassifier, EClass, EObject&gt; query = ocl.createQuery(next);

+

+    // bind the variable value

+    query.getEvaluationEnvironment().add("app$", appContext());

+    

+    queries.add(query);

+}

+

+filter(queries);  // applies these filters to the current objects

+                  // by evaluating the OCLS on them.

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="DefiningHelperOperationsinJava"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Defining Helper Operations in Java</fo:marker><fo:block font-size="14pt">6.7.2. Defining Helper Operations in Java</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL allows the definition of additional operations and attributes using 

+					<fo:inline font-family="Inconsolata,Courier">def:</fo:inline> expressions.  This is very convenient for the formulation of constraints, but what if the operation that we need is something like a regex pattern match?

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1504B"><fo:inline font-family="Inconsolata,Courier">class Person

+inv valid_ssn: self.ssn.regexMatch('\d{3}-\d{3}-\d{3}') &lt;&gt; null

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">We might try to define this using OCL, as an additional operation on the OCL Standard

+					Library’s 

+					<fo:inline font-family="Inconsolata,Courier">String</fo:inline> primitive type:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15056"><fo:inline font-family="Inconsolata,Courier">class String

+def: regexMatch(pattern : String) : String =

+    -- ???

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The operations available in the OCL Standard Library simply are not sufficient to express

+					the value of this operation, which should return the substring matching a regex pattern or

+

+					<fo:inline font-family="Inconsolata,Courier">null</fo:inline> if the pattern does not match.  We need to implement this

+					operation in Java.  We can do that by creating a custom 

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+					that knows how to look up this operation, and an 

+					<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline>

+					that knows how it is implemented.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">First, let’s start by defining a specialization of the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/EcoreEnvironment.html)">

+						<fo:inline font-family="Inconsolata,Courier">EcoreEnvironment</fo:inline>

+					</fo:basic-link> . The constructor that is used to initialize the root environment of an 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+					instance will add our 

+					<fo:inline font-family="Inconsolata,Courier">regexMatch</fo:inline> additional operation to the

+

+					<fo:inline font-family="Inconsolata,Courier">String</fo:inline> primitive type.  The constructor that is used to create

+					nested environments copies the operation from its parent.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15079"><fo:inline font-family="Inconsolata,Courier">class MyEnvironment extends EcoreEnvironment {

+    EOperation regexMatch;

+    

+    // this constructor is used to initialize the root environment

+    MyEnvironment(EPackage.Registry registry) {

+        super(registry);

+        

+        defineCustomOperations();

+    }

+    

+    // this constructor is used to initialize child environments

+    MyEnvironment(MyEnvironment parent) {

+        super(parent);

+        

+        // get the parent's custom operations

+        regexMatch = parent.regexMatch;

+    }

+	

+	// override this to provide visibility of the inherited protected method

+    @Override

+    protected void setFactory(

+      EnvironmentFactory&lt;EPackage, EClassifier, EOperation,

+      EStructuralFeature, EEnumLiteral, EParameter, EObject,

+      CallOperationAction, SendSignalAction, Constraint, EClass, EObject&gt;

+      factory) {

+        super.setFactory(factory);

+    }

+    

+    // use the AbstractEnvironment's mechanism for defining

+    // "additional operations" to add our custom operation to

+    // OCL's String primitive type

+    private void defineCustomOperations() {

+        // pattern-matching operation

+        regexMatch = EcoreFactory.eINSTANCE.createEOperation();

+        regexMatch.setName("regexMatch");

+        regexMatch.setEType(getOCLStandardLibrary().getString());

+        EParameter parm = EcoreFactory.eINSTANCE.createEParameter();

+        parm.setName("pattern");

+        parm.setEType(getOCLStandardLibrary().getString());

+        regexMatch.getEParameters().add(parm);

+        

+        // annotate it so that we will recognize it

+        // in the evaluation environment

+        EAnnotation annotation = EcoreFactory.eINSTANCE.createEAnnotation();

+        annotation.setSource("MyEnvironment");

+        regexMatch.getEAnnotations().add(annotation);

+        

+        // define it as an additional operation on OCL String

+        addOperation(getOCLStandardLibrary().getString(), regexMatch);

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Next, we will define the corresponding specialization of the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/EcoreEvaluationEnvironment.html)">

+						<fo:inline font-family="Inconsolata,Courier">EcoreEvaluationEnvironment</fo:inline>

+					</fo:basic-link> that will know how to evaluate calls to this custom operation:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15088"><fo:inline font-family="Inconsolata,Courier">class MyEvaluationEnvironment extends EcoreEvaluationEnvironment {

+    MyEvaluationEnvironment() {

+        super();

+    }

+

+    MyEvaluationEnvironment(

+            EvaluationEnvironment&lt;EClassifier, EOperation, EStructuralFeature,

+            EClass, EObject&gt; parent) {

+        super(parent);

+    }

+    

+    public Object callOperation(EOperation operation, int opcode,

+            Object source, Object[] args) {

+        if (operation.getEAnnotation("MyEnvironment") == null) {

+            // not our custom regex operation

+            return super.callOperation(operation, opcode, source, args);

+        }

+        

+        if ("regexMatch".equals(operation.getName())) {

+            Pattern pattern = Pattern.compile((String) args[0]);

+            Matcher matcher = pattern.matcher((String) source);

+            

+            return matcher.matches()? matcher.group() : null;

+        }

+        

+        throw new UnsupportedOperationException();  // unknown operation

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Finally, we define a specialization of the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/EcoreEnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory</fo:inline>

+					</fo:basic-link> that creates our custom environments:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15097"><fo:inline font-family="Inconsolata,Courier">class MyEnvironmentFactory extends EcoreEnvironmentFactory {

+    public Environment&lt;EPackage, EClassifier, EOperation, EStructuralFeature,

+      EEnumLiteral, EParameter, EObject, CallOperationAction,

+      SendSignalAction, Constraint, EClass, EObject&gt; createEnvironment() {

+        MyEnvironment result = new MyEnvironment(getEPackageRegistry());

+        result.setFactory(this);

+        return result;

+    }

+    

+    public Environment&lt;EPackage, EClassifier, EOperation, EStructuralFeature,

+      EEnumLiteral, EParameter, EObject, CallOperationAction,

+      SendSignalAction, Constraint, EClass, EObject&gt;

+      createEnvironment(Environment&lt;EPackage, EClassifier, EOperation,

+      EStructuralFeature, EEnumLiteral, EParameter, EObject,

+      CallOperationAction, SendSignalAction, Constraint, EClass,

+      EObject&gt; parent) {

+        if (!(parent instanceof MyEnvironment)) {

+            throw new IllegalArgumentException(

+                "Parent environment must be my environment: " + parent);

+        }

+        

+        MyEnvironment result = new MyEnvironment((MyEnvironment) parent);

+        result.setFactory(this);

+        return result;

+    }

+

+    public EvaluationEnvironment&lt;EClassifier, EOperation, EStructuralFeature,

+      EClass, EObject&gt; createEvaluationEnvironment() {

+        return new MyEvaluationEnvironment();

+    }

+

+    public EvaluationEnvironment&lt;EClassifier, EOperation, EStructuralFeature,

+      EClass, EObject&gt; createEvaluationEnvironment(

+      EvaluationEnvironment&lt;EClassifier, EOperation, EStructuralFeature,

+      EClass, EObject&gt; parent) {

+        return new MyEvaluationEnvironment(parent);

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Now, we can use our environment to parse the kind of expression that we were looking for:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1509F"><fo:inline font-family="Inconsolata,Courier">OCL&lt;?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject&gt; ocl;

+ocl = OCL.newInstance(new MyEnvironmentFactory());

+

+OCLHelper&lt;EClassifier, ?, ?, Constraint&gt; helper = ocl.createOCLHelper();

+helper.setContext(MyPackage.Literals.PERSON);

+

+// double the '\' to escape it in a Java string literal

+Constraint validSSN = helper.createInvariant(

+        "self.ssn.regexMatch('\\d{3}-\\d{3}-\\d{3}') &lt;&gt; null");

+        

+Person person = getPersonToValidate();

+

+System.out.printf("%s valid SSN: %b%n", person, ocl.check(person, validSSN));

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="SelectingaPackageLookupStrategy"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Selecting a Package Lookup Strategy</fo:marker><fo:block font-size="14pt">6.7.3. Selecting a Package Lookup Strategy</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When package names are provided in OCL expressions, e.g., when representing types in an

+

+					<fo:inline font-family="Inconsolata,Courier">oclIsKindOf</fo:inline> call, these names are looked up using a specific

+					strategy. By default, the lookup proceeds starting at the parsing context, traversing

+					up the package hierarchy. If the package name cannot be resolved this way, for the Ecore

+					binding a lookup is performed in the 

+					<fo:inline font-family="Inconsolata,Courier">EPackage.Registry</fo:inline>. By

+					default, the package name provided is compared to the names of the packages that are

+					contained as values in the registry.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In rare cases there may be ambiguous package names. For example, if an OCL expression

+					is to be parsed using a classifier from the OCL AST metamodel as its context, the

+					context package is 

+					<fo:inline font-family="Inconsolata,Courier">ocl::ecore</fo:inline>. If such an expression is

+					trying to reference a type from the EMF Ecore package with package name

+

+					<fo:inline font-family="Inconsolata,Courier">ecore</fo:inline>, the EMF Ecore package is hidden by the lookup

+					happening relative to the context package. Instead of the EMF Ecore package, the

+

+					<fo:inline font-family="Inconsolata,Courier">ocl::ecore</fo:inline> package will be found.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Such an ambiguity can be resolved by using a dedicated 

+					<fo:inline font-family="Inconsolata,Courier">EPackage.Registry</fo:inline>

+					which registers the otherwise ambiguous packages with a special “URI” that represents a

+					simple alias name for the package. In order to force the OCL parser to look up packages

+					by those alias names, an option needs to be set on the OCL environment, as follows:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N150C1"><fo:inline font-family="Inconsolata,Courier">    Registry r = new EPackageRegistryImpl();

+    r.putAll(EPackage.Registry.INSTANCE);

+    r.put("EMFEcore", EcorePackage.eINSTANCE);

+    r.put("OCLEcore", org.eclipse.ocl.ecore.EcorePackage.eINSTANCE);

+    OCL ocl = OCL.newInstance(new EcoreEnvironmentFactory(r));

+    ((EcoreEnvironment) ocl.getEnvironment()).setOption(

+        ParsingOptions.PACKAGE_LOOKUP_STRATEGY,

+        ParsingOptions.PACKAGE_LOOKUP_STRATEGIES.

+            LOOKUP_PACKAGE_BY_ALIAS_THEN_NAME);

+    Helper helper = ocl.createOCLHelper();

+    helper.setContext(

+        org.eclipse.ocl.ecore.EcorePackage.eINSTANCE.getOCLExpression());

+    org.eclipse.ocl.ecore.OCLExpression expr = helper.createQuery(

+        "self.oclIsKindOf(EMFEcore::EClassifier) and not

+         self.oclIsKindOf(OCLEcore::OCLExpression)");

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the example above, two packages with ambiguous simple names (EMF Ecore package and

+					OCL Ecore package, both with simple name 

+					<fo:inline font-family="Inconsolata,Courier">ecore</fo:inline>) are added with

+					alias names 

+					<fo:inline font-family="Inconsolata,Courier">EMFEcore</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">OCLEcore</fo:inline>,

+					respectively. The package lookup strategy is then set to

+

+					<fo:inline font-family="Inconsolata,Courier">LOOKUP_PACKAGE_BY_ALIAS_THEN_NAME</fo:inline> which allows OCL expressions to reference

+					the packages by their aliases, as in

+

+					<fo:inline font-family="Inconsolata,Courier">self.oclIsKindOf(EMFEcore::EClassifier) and not self.oclIsKindOf(OCLEcore::OCLExpression)</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note, that the use of a delegating registry (constructor

+

+					<fo:inline font-family="Inconsolata,Courier">EPackageRegistryImpl(EPackage.Registry)</fo:inline>) does not work

+					because a registry initialized this way does not forward the call to

+

+					<fo:inline font-family="Inconsolata,Courier">values()</fo:inline> which would be required by the OCL

+					package lookup implementation. Instead, if the packages registered with the

+					default registry are required, they need to be copied to a new registry

+					using 

+					<fo:inline font-family="Inconsolata,Courier">putAll</fo:inline> as shown above.

+				</fo:block></fo:block><fo:block id="CustomizingHiddenOppositeLookupandNavigation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Customizing Hidden Opposite Lookup and Navigation</fo:marker><fo:block font-size="14pt">6.7.4. Customizing Hidden Opposite Lookup and Navigation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The default 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/EcoreEnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory</fo:inline>

+					</fo:basic-link> produces environments which can find references that have an annotation with source 

+					<fo:inline font-family="Inconsolata,Courier">http://schema.omg.org/spec/MOF/2.0/emof.xml</fo:inline>

+					that have a detail with key 

+					<fo:inline font-family="Inconsolata,Courier">Property.oppositeRoleName</fo:inline>. In the class that is the type of the reference,

+					and all its subclasses, for OCL this annotation defines an otherwise “hidden” opposite property which can be used

+					in OCL expressions. This can be convenient when it is not possible or desirable to define an explicit

+					opposite reference, e.g., because the class that would have to own the opposite reference can’t easily be

+					modified or the serialization of that class must not be changed.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The logic used to find these “hidden” opposites and to navigate them is provided by implementations

+					of the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/OppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">OppositeEndFinder</fo:inline>

+					</fo:basic-link> interface. By default, the 

+					<fo:inline font-family="Inconsolata,Courier">EcoreEnvironmentFactory</fo:inline> uses the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/DefaultOppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">DefaultOppositeEndFinder</fo:inline>

+					</fo:basic-link> implementation. It performs the lookup of annotated references by maintaining a cache based on

+					the Ecore package registry. Successful navigation of those “hidden” opposites requires an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/modeling/emf/emf/javadoc/2.6.0/org/eclipse/emf/ecore/util/ECrossReferenceAdapter.html)">

+						<fo:inline font-family="Inconsolata,Courier">ECrossReferenceAdapter</fo:inline>

+					</fo:basic-link> to be registered for the containment hierarchy or the resource or resource set that should be used as the scope of the navigation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Obviously, 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/modeling/emf/emf/javadoc/2.6.0/org/eclipse/emf/ecore/util/ECrossReferenceAdapter.html)">

+						<fo:inline font-family="Inconsolata,Courier">ECrossReferenceAdapter</fo:inline>

+					</fo:basic-link> has a significant downside: it responds to “hidden” opposite navigation requests only based on what has so far been loaded by EMF. If the set of resources held by an underlying EMF storage system contains more resources than have so far been loaded into the resource set, non-loaded content from that storage system won’t be considered by the 

+					<fo:inline font-family="Inconsolata,Courier">ECrossReferenceAdapter</fo:inline>. Given a store with reasonable search capabilities it is desirable to take advantage of these capabilities also to perform reverse navigation of those “hidden” opposites. To achieve this, a specific implementation of the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/OppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">OppositeEndFinder</fo:inline>

+					</fo:basic-link> interface can be provided. It may be a specialization of

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/DefaultOppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">DefaultOppositeEndFinder</fo:inline>

+					</fo:basic-link>, e.g., when the reference lookup based on the Ecore package registry is sufficient and only the navigation behavior shall be redefined:

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1512A"><fo:inline font-family="Inconsolata,Courier">class MyOppositeEndFinder extends DefaultOppositeEndFinder {

+    MyOppositeEndFinder(EPackage.Registry registry) {

+        super(registry);

+    }

+      

+    @Override

+    public Object navigateOppositeProperty(EStructuralFeature property, Object target) {

+        Collection&lt;Object&gt; result = null;

+        EObject eTarget = (EObject) target;

+        // do something clever, e.g., using your underlying store's query facility or

+        // the new EMF Query2 component (incubation)

+        // ...

+        return result;

+    }

+}

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">With this, OCL can be instantiated using the custom opposite end finder as follows:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15132"><fo:inline font-family="Inconsolata,Courier">  OCL ocl = OCL.newInstance(new EcoreEnvironmentFactoryWithHiddenOpposites(

+                     EPackage.Registry.INSTANCE, new MyOppositeEndFinder()));

+  ...

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">With this, when the use of a property in an OCL expression cannot be resolved to an attribute

+					or reference, the opposite end finder is asked to look for a correspondingly-named "hidden"

+					opposite. Navigation across this “hidden” opposite will then call the 

+					<fo:inline font-family="Inconsolata,Courier">navigateOppositeProperty</fo:inline> method on 

+					<fo:inline font-family="Inconsolata,Courier">MyOppositeEndFinder</fo:inline>.

+				</fo:block></fo:block></fo:block><fo:block id="Persistence"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Persistence</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.8. OCL Persistence</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL component implements the OCL Abstract Syntax model as an EMF-based metamodel.

+				Thus, parsed OCL expressions and constraints can be serialized, for example in XMI documents.

+				The OCL 2.4 specification is unclear about how the serialization of expressions should look (this will be solved in the next OCL 2.5 specification),

+				especially where references to demand-created types are concerned.  This topic discusses the

+				approach taken by the Eclipse OCL component to provide a practical solution to this problem.</fo:block><fo:block id="TheTypeResolver"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Type Resolver</fo:marker><fo:block font-size="14pt">6.8.1. The Type Resolver</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL defines a number of template metaclasses, including the 

+					<fo:inline font-family="Inconsolata,Courier">CollectionType</fo:inline>

+					metaclass and its specializations, 

+					<fo:inline font-family="Inconsolata,Courier">MessageType</fo:inline>, and

+

+					<fo:inline font-family="Inconsolata,Courier">TupleType</fo:inline>.  In all of these cases, OCL specifies that these

+					templates are instantiated as needed in the OCL environment, and that only one instance

+					of a template exists for any given combination of template arguments.  For example, only one

+

+					<fo:inline font-family="Inconsolata,Courier">OrderedSet(String)</fo:inline> exists and it is created on the occasion when

+					it is first needed.  Likewise, the 

+					<fo:inline font-family="Inconsolata,Courier">OclMessage</fo:inline> type for invocations

+					of the 

+					<fo:inline font-family="Inconsolata,Courier">EModelElement::getEAnnotation(EString)</fo:inline> operation and the

+

+					<fo:inline font-family="Inconsolata,Courier">Tuple{a : String, b : EClass}</fo:inline> type.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The problem is, that the OCL Specification does not indicate how expressions that reference

+					such demand-created types can be persisted, because it does not define what should own these

+					types.    A similar problem exists for additional operations and attributes defined in OCL

+					via 

+					<fo:inline font-family="Inconsolata,Courier">def:</fo:inline> expressions.  The

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/TypeResolver.html)">

+						<fo:inline font-family="Inconsolata,Courier">TypeResolver</fo:inline>

+					</fo:basic-link> API is responsible for the demand-creation of these types and for their persistence.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1516F"><fo:external-graphic src="url(images/5170-persistence.png)" width="auto" height="auto" content-width="auto" content-height="auto"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Every 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Environment.html)">

+						<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+					</fo:basic-link> has a 

+					<fo:inline font-family="Inconsolata,Courier">TypeResolver</fo:inline> that persists demand-created types and additional features.  For a client that doesn’t require persistence, the 

+					<fo:inline font-family="Inconsolata,Courier">TypeResolver</fo:inline> will create a 

+					<fo:inline font-family="Inconsolata,Courier">Resource</fo:inline> with the dummy 

+					<fo:inline font-family="Inconsolata,Courier">ocl://</fo:inline> scheme (no resource factory is provided for this scheme).

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A client that does require persistence of OCL expressions and these demand-created elements

+					should provide a specific resource in which to store them, either via the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/OCL.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+					</fo:basic-link> class’s

+

+					<fo:inline font-family="Inconsolata,Courier">newInstance(EnvironmentFactory, Resource)</fo:inline> factory method or via

+					the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/EnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>

+					</fo:basic-link> interface’s 

+					<fo:inline font-family="Inconsolata,Courier">load(Resource)</fo:inline> method.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1519F"><fo:inline font-family="Inconsolata,Courier">Resource modelResource = getResourceSet().getResource(

+        URI.createPlatformResourceURI("/models/My.ecore", true), true);

+

+// persist demand-created types etc. in my model resource

+OCL&lt;?, EClassifier, ?, ?, ?, ?, ?, ?, ?, Constraint, EClass, EObject&gt; ocl;

+ocl = OCL.newInstance(EcoreEnvironmentFactory.INSTANCE, myResource);

+

+// use the OCL to parse constraints, store them in the Ecore model,

+//	  and save everything together in one resource for a consistent,

+//   self-contained OCL environment

+

+...

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/AbstractTypeResolver.html)">

+						<fo:inline font-family="Inconsolata,Courier">AbstractTypeResolver</fo:inline>

+					</fo:basic-link> class creates packages in which to store the different elements that it creates: collection types, message types, tuple types, and additional operations and attributes.  These last are owned by classes that “shadow” the classifiers in which context they are defined, in

+					the manner by which the OCL specification’s adaptation for EMOF indicates that operations

+					are to be “owned” by EMOF 

+					<fo:inline font-family="Inconsolata,Courier">DataType</fo:inline> s.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An environment implementation can customize the way these demand-created elements are

+					stored, by choosing different packages or using some other strategy altogether.  Or, using

+					the default 

+					<fo:inline font-family="Inconsolata,Courier">TypeResolver</fo:inline> implementation, a client of the OCL

+					parser can find the demand-created objects in the resolver’s resource and relocate them

+					as needed.

+				</fo:block></fo:block></fo:block><fo:block id="AdvancedMetamodelBindings"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Creating Metamodel Bindings</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.9. Creating Metamodel Bindings</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Eclipse OCL component provides a generic specification of the OCL Abstract Syntax Model

+				plus bindings for two popular Eclipse metamodels:  Ecore and UML.  Users of the OCL API

+				can likewise create bindings for their metamodels, to integrate OCL with their modeling

+				languages.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/Environment.html)">

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+				</fo:basic-link> interface has a generic type signature with several parameters, representing the metamodeling

+				constructs required by OCL, that it borrows from UML, EMOF, and the other metamodels that

+				it targets.  The Javadoc for that interface defines the mappings, and the same type parameter

+				names are used consistently throughout the OCL API.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N151C7"><fo:external-graphic src="url(images/5180-bindings.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">To provide a metamodel binding, a client must provide implementations of the following interfaces:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N151CF"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N151D0"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline> and 

+						<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>, supplying suitable substitutions for the generic type parameters.  Note that not all of these are actually required; for example, Ecore does not have the concept of 

+						<fo:inline font-family="Inconsolata,Courier">State</fo:inline>, so it just substitutes 

+						<fo:inline font-family="Inconsolata,Courier">EObject</fo:inline>

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N151DF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline> for accessing properties of run-time instances of models

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N151E5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-family="Inconsolata,Courier">UMLReflection</fo:inline> for introspecting models (instances of thetarget metamodel)

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N151EB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-family="Inconsolata,Courier">OCLStandardLibrary</fo:inline>, providing the instances of the metamodel’s 

+						<fo:inline font-family="Inconsolata,Courier">Classifier</fo:inline> metaclass that implement the OCL Standard Library types

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N151F4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+						<fo:inline font-family="Inconsolata,Courier">OCLFactory</fo:inline>, providing a factory for all of the metaclasses of the Abstract Syntax Model

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This last item, above, necessitates furthermore that the metamodel binding provide a

+				concrete specialization of the Abstract Syntax Model (in its entirety) that mixes in the

+				target metamodel’s correspondents of the UML 

+				<fo:inline font-family="Inconsolata,Courier">Classifier</fo:inline> and

+

+				<fo:inline font-family="Inconsolata,Courier">TypedElement</fo:inline> metaclasses.  The former is required to provide

+				compatibility of the metaclasses in the OCL 

+				<fo:inline font-family="Inconsolata,Courier">Types</fo:inline> with the

+				target metamodel’s type system.  The latter is required for compatibility of the metaclasses

+				in the OCL 

+				<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package with the target metamodel’s

+				typed elements.

+			</fo:block><fo:block id="TheOCLAbstractSyntaxModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Abstract Syntax Model</fo:marker><fo:block font-size="14pt">6.9.1. The OCL Abstract Syntax Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following diagram summarizes the metaclasses of the OCL 

+					<fo:inline font-family="Inconsolata,Courier">Types</fo:inline> package:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15213"><fo:external-graphic src="url(images/5180-ocltypes.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following diagram summarizes the call expression metaclasses of the OCL 

+					<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15220"><fo:external-graphic src="url(images/5180-callexp.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following diagram summarizes the literal expression metaclasses of the OCL 

+					<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1522D"><fo:external-graphic src="url(images/5180-literalexp.png)" width="auto" height="auto" content-width="40%" content-height="40%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following diagram summarizes the remaining metaclasses of the OCL 

+					<fo:inline font-family="Inconsolata,Courier">Expressions</fo:inline> package:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1523A"><fo:external-graphic src="url(images/5180-miscexp.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+				</fo:block></fo:block></fo:block><fo:block id="ImpactAnalyzer"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Incrementally Re-Evaluating OCL Expressions Using the Impact Analyzer</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.10. Incrementally Re-Evaluating OCL Expressions Using the Impact Analyzer</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When Ecore metamodels use many OCL invariants and the models constrained by these invariants

+				grow large, re-evaluating the invariants becomes a performance challenge. As OCL expressions

+				can navigate freely across resource boundaries, changes to a model element in one resource

+				can easily affect invariants for model elements in other resources. To reliably catch all

+				invalidated constraints after a change it would be necessary to re-evaluate all invariants

+				on all their context objects regardless their resource. This does not scale sufficiently well.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/impactanalyzer/ImpactAnalyzerFactory.html)">

+					<fo:inline font-family="Inconsolata,Courier">ImpactAnalyzerFactory</fo:inline>

+				</fo:basic-link> interface allows tool builders to efficiently determine a much smaller set of model elements on which re-evaluation of expressions is necessary after a change.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Given an 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/OCLExpression.html)">OCL expression</fo:basic-link>, the factory can be used to create an impact analyzer for a single expression as follows:

+			</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15255"><fo:inline font-family="Inconsolata,Courier">final OCLExpression e = ...;

+final ImpactAnalyzer impactAnalyzer =

+		ImpactAnalyzerFactory.INSTANCE.createImpactAnalyzer(

+    			e,      // the expression to re-evaluate incrementally

+    			false,  // whether to re-evaluate when new context objects appear

+    			OCLFactory.INSTANCE);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The impact analyzer obtained this way can create a change notification filter which

+				can then be used to register for notifications that indicate a change which may affect

+				the value of the expression. Consider the following example:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1525D"><fo:inline font-family="Inconsolata,Courier">ResourceSet myResourceSet = ...;

+EventFilter filter = impactAnalyzer.createFilterForExpression();

+EventManager eventManager =

+	EventManagerFactory.eINSTANCE.getEventManagerFor(myResourceSet);

+eventManager.subscribe(filter, new AdapterImpl() {

+    public void notifyChanged(Notification notification) {

+        Collection&lt;EObject&gt; valueMayHaveChangedOn =

+            impactAnalyzer.getContextObjects(notification);

+        for (EObject eo : valueMayHaveChangedOn) {

+        	// ... perform some re-evaluation action of e for context eo here

+        }

+    }

+});

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The event manager can be used to register the event filters of several OCL expressions with their respective

+				adapters. The adapters for different expressions do not have to be distinct but may optionally be shared. The

+				following figure shows how the classes relate, as a UML class diagram:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N15267"><fo:external-graphic src="url(images/5190-impact-analyzer-classes.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For each OCL expression a new impact analyzer is used. The event filters produced by them can be registered

+				with the same event manager. The following figure shows a typical instance collaboration diagram in UML

+				notation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N15271"><fo:external-graphic src="url(images/5190-impact-analyzer-instances.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/eventmanager/EventManagerFactory.html)">event manager factory</fo:basic-link> and the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/eventmanager/EventManager.html)">event managers</fo:basic-link> it produces lay the scalable foundation for the re-evaluation process. Even if it has to manage many subscriptions, its performance does not degrade as it would if the change notification filters were evaluated one after the other. With this it becomes possible to register many OCL expressions for change impact analysis as shown above. The figure below shows a typical default configuration of an event manager, as a UML instance collaboration diagram.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N15283"><fo:external-graphic src="url(images/5190-event-manager-default-config.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The event manager in the figure is configured to listen to the change events coming

+				from anything inside the resource set. In this example it is shown with three different

+				event filters, each coming with its own adapter handling those change notifications

+				matches by the respective filter.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As described in more detail in the Javadoc, event managers may be re-used,

+				temporarily deactivated and new ones may be created specifically upon request. This way

+				it is possible to have several event managers, e.g., listening for changes during different

+				phases of a model’s life cycle without having to create and initialize the event managers

+				again and again. Also, an event manager is not restricted to listen to the changes of

+				exactly one resource set. The following figure shows a not so typical configuration, again as a

+				UML instance collaboration diagram.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N1528F"><fo:external-graphic src="url(images/5190-event-manager-instances.png)" width="auto" height="auto" content-width="50%" content-height="50%"/></fo:block>

+			</fo:block><fo:block id="UsingtheImpactAnalyzerinEMFEditors"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Using the Impact Analyzer in EMF Editors</fo:marker><fo:block font-size="14pt">6.10.1. Using the Impact Analyzer in EMF Editors</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.impactanalyzer.ui</fo:inline> package provides experimental support

+					for embedding the impact analyzer in EMF editors. Adding the lines

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1529E"><fo:inline font-family="Inconsolata,Courier">@SuppressWarnings("unused") 			// not read; just used to avoid GC  

+private Revalidator revalidator;		//  from collecting re-validator

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">to the field declarations of an editor class, and adding the lines</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N152A6"><fo:inline font-family="Inconsolata,Courier">revalidator = new Revalidator(editingDomain, OCLFactory.INSTANCE,

+                              DefaultOppositeEndFinder.getInstance(),

+                              MyMetamodelEcorePackage.eINSTANCE);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">at the end of the editor class’s 

+					<fo:inline font-family="Inconsolata,Courier">createModel()</fo:inline> method turns on this experimental

+					support for the respective editors. Consequently, changes in the editor’s 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>

+					will trigger the re-evaluation of the affected invariants on the set of context objects

+					determined by the impact analyzer. Error markers of successfully validated constraints will

+					be removed, markers for invalid constraints are produced. As is obvious also from the

+

+					<fo:inline font-family="Inconsolata,Courier">examples</fo:inline> part of the package name, this is not yet production-ready code. It

+					may change or disappear without notice.

+				</fo:block></fo:block><fo:block id="AlgorithmOutline"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Algorithm Outline</fo:marker><fo:block font-size="14pt">6.10.2. Algorithm Outline</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The basic idea on which the impact analyzer’s algorithm is based is this: take the EMF

+					change notification and see which elementary subexpressions, such as property call expressions,

+					are immediately affected by the change. From these pairs of 

+					<fo:inline font-family="Inconsolata,Courier">(subexpression, model element)</fo:inline>

+					it is possible to walk the expression tree and navigate “backwards” from the model element

+					to the candidates for the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> variable for which the subexpression

+					may evaluate to the model element indicated by the notification.

+					Recursive operation calls and general 

+					<fo:inline font-family="Inconsolata,Courier">-&gt;iterate(...)</fo:inline> expressions complicate

+					matters and lead to a recursive algorithm for the impact analysis.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is permissible to use calls to OCL-specified operations. The impact analyzer will trace

+					changes considering the called operation’s body expression.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of 

+					<fo:inline font-family="Inconsolata,Courier">allInstances</fo:inline> inside an expression may be nasty for analyzing the

+					impact of a change because then it may no longer be possible to trace the change back to

+					the possible values for 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. In those cases the impact analyzer will simply

+					“give up” and return a collection of all instances of the expression’s context type and

+					its subtypes. 

+				</fo:block></fo:block><fo:block id="ImpactAnalyzerConfigurationScopes"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Impact Analyzer Configuration, Scopes</fo:marker><fo:block font-size="14pt">6.10.3. Impact Analyzer Configuration, Scopes</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The impact analyzer can be created in several different configurations as explained in

+					detail in the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/impactanalyzer/ImpactAnalyzerFactory.html)">Javadocs</fo:basic-link> . Particularly noteworthy is the relationship between the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/opposites/OppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">OppositeEndFinder</fo:inline>

+					</fo:basic-link> and the way an 

+					<fo:inline font-family="Inconsolata,Courier">allInstance</fo:inline> expression is evaluated. Both depend on a notion of lookup 

+					<fo:inline font-family="Inconsolata,Courier">scope</fo:inline>. EMF does not provide any particular rules or conventions in this regard other than assuming that what has been loaded into a 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> is what tools can see. While this is a working procedure for forward navigation, it doesn’t help in defining a scope for 

+					<fo:inline font-family="Inconsolata,Courier">allInstances</fo:inline> and reverse navigation when there is no explicit opposite property.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For this purpose, Eclipse OCL has introduced the 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/ecore/opposites/OppositeEndFinder.html)">

+						<fo:inline font-family="Inconsolata,Courier">OppositeEndFinder</fo:inline>

+					</fo:basic-link> interface through which reverse navigations

+					of references and 

+					<fo:inline font-family="Inconsolata,Courier">allInstances</fo:inline> lookups can be performed. Its default implementation

+					is based on the EMF default which is to consider the contents of a 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> the

+					universe. Other implementations are possible, however, such as one that uses

+					EMF Query2 to perform the necessary lookups.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A default OCL evaluator will always use the current 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> to determine

+					the set of all instances of a type. If a client has used an opposite end finder that implements

+					a certain lookup strategy then the default 

+					<fo:inline font-family="Inconsolata,Courier">allInstances</fo:inline> evaluation is most likely

+					inconsistent with the scope definitions of that opposite end finder. To avoid such problems,

+					a 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/impactanalyzer/util/OCL.html)">specific OCL factory</fo:basic-link> can create OCL instances that ensure consistency between opposite navigation and 

+					<fo:inline font-family="Inconsolata,Courier">allInstances</fo:inline> evaluation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Other configuration options (see 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/impactanalyzer/configuration/ActivationOption.html))">

+						<fo:inline font-family="Inconsolata,Courier">ActivationOption</fo:inline>

+					</fo:basic-link> concern the specific algorithm used for tracing back from a change notification to the set of context objects for which the expression

+					may have changed its value. The default selection has proven to be the fastest for a set

+					of benchmarks. However, mileage may vary, and we’d like to encourage users to experiment

+					also with the non-default configurations.

+				</fo:block></fo:block></fo:block><fo:block id="Delegates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Delegates</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.11. Delegates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF provides three delegation mechanisms that enable functionality not directly supported by EMF to be delegated to a technology that can support it.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1531A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1531B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+						<fo:basic-link internal-destination="ValidationDelegate"><fo:inline color="blue" text-decoration="underline">Validation Delegate</fo:inline></fo:basic-link> supports checking additional invariants on an EClassifier 

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15322"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+						<fo:basic-link internal-destination="SettingDelegate"><fo:inline color="blue" text-decoration="underline">Setting Delegate</fo:inline></fo:basic-link> supports getting an initial or derived computed value for an EStructuralFeature

+					</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15329"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>an 

+						<fo:basic-link internal-destination="InvocationDelegate"><fo:inline color="blue" text-decoration="underline">Invocation Delegate</fo:inline></fo:basic-link> supports the execution of a function defined by an EOperation

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">and also</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15332"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15333"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>a 

+						<fo:basic-link internal-destination="QueryDelegate"><fo:inline color="blue" text-decoration="underline">Query Delegate</fo:inline></fo:basic-link> supports the execution of a function not defined by an EOperation

+					</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When you use the 

+				<fo:basic-link internal-destination="OCLinEcore"><fo:inline color="blue" text-decoration="underline">OCLinEcore</fo:inline></fo:basic-link> editor, the required EAnnotations to support delegation are provided automatically. This section provides sufficient detail to allow them to be maintained manually using the Sample Ecore Editor or Java code.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These EAnnotations ensure that delegates can be used for both genmodeled and reflective models.  The use of genmodel to generate Java classes for your metamodel has significant performance benefits for modeling, but currently makes little difference for OCL execution. The use of genmodel has the disadvantage that you must install the Java classes and so the user of the Java classes must run in a different Eclipse or standalone session to the developer. Conversely, using reflective models allows both developer and user to share the same Eclipse session.</fo:block><fo:block id="GenModelSettings"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">GenModel Settings</fo:marker><fo:block font-size="14pt">6.11.1. GenModel Settings</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is one GenModel setting that needs to be correctly set to ensure that OCL within generated Java classes can successfully be invoked by itself. Make sure that support for reflective operation invocation is generated by setting the 

+					<fo:inline font-family="Inconsolata,Courier">Operation Reflection</fo:inline> option to 

+					<fo:inline font-family="Inconsolata,Courier">true</fo:inline>.

+				</fo:block></fo:block><fo:block id="OCLDelegateURI"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Delegate URIs</fo:marker><fo:block font-size="14pt">6.11.2. OCL Delegate URIs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each application implementing delegation has an associated Delegate URI, which is</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15354"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15355"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> for the classic evaluator

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1535B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:inline> for the Pivot evaluator

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Only the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> was available in the Helios release and so the Helios release of the OCLinEcore editor used that URI.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCLinEcore editor uses the Pivot metamodel which is more accurate and OMG compliant and so in the Indigo release, the OCLinEcore editor uses the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:inline> URI and converts all incoming usage of 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL</fo:inline> URI to 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As described in 

+					<fo:basic-link internal-destination="EclipseOCLs"><fo:inline color="blue" text-decoration="underline">The two Eclipse OCLs</fo:inline></fo:basic-link> the Pivot evaluator uses an intermediate Pivot model to hide Ecore and UML2 and so allow full OMG-compliance. The Pivot evaluator is only available when the OCL Examples and Editors feature has been installed as described in 

+					<fo:basic-link internal-destination="Installation"><fo:inline color="blue" text-decoration="underline">Installation</fo:inline></fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Delegate URIs are registered using the</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1537D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1537E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.emf.ecore.invocation_delegate</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15381"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.emf.ecore.setting_delegate</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15384"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.emf.ecore.query_delegate</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15387"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>org.eclipse.emf.ecore.validation_delegate</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">extension points. </fo:block></fo:block><fo:block id="StandaloneInitialization"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Standalone Initialization</fo:marker><fo:block font-size="14pt">6.11.3. Standalone Initialization</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The initialization code for standalone usage of EMF delegates is given in the 

+					<fo:basic-link internal-destination="Standalone"><fo:inline color="blue" text-decoration="underline">Standalone</fo:inline></fo:basic-link> section.

+				</fo:block></fo:block><fo:block id="InvocationDelegate"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Invocation Delegates </fo:marker><fo:block font-size="14pt">6.11.4. Invocation Delegates </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An invocation delegate is invoked to execute the body of an EOperation. An invocation delegate must be registered for the EPackage of the EClassifier of the EOperation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EPackage registration is provided by an EAnnotation on the EPackage</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1539E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1539F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N153A8"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153A9"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">invocationDelegates</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153B2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The invocation delegate is provided by an EAnnotation on the EOperation</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N153C0"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153C1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-style="italic">

+								<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+							</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N153CD"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153CE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">body</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153D7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> is evaluated to provide the EOperation value with the containing EClassifier as the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context object and the EParameters accessible as parameters from OCL. The return type of the 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> must conform to the return type of the EOperation.

+				</fo:block></fo:block><fo:block id="SettingDelegate"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Setting Delegates </fo:marker><fo:block font-size="14pt">6.11.5. Setting Delegates </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A setting delegate is invoked to provide the initial or derived value of an EStructuralFeature.  A setting delegate must be been registered for the EPackage of the EClassifier of the EStructuralFeature.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EPackage registration is provided by an EAnnotation on the EPackage</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N153FC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N153FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15406"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15407"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">settingDelegates</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15410"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The setting delegate is provided by an EAnnotation on the EStructuralFeature</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1541E"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1541F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-style="italic">

+								<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+							</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1542B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1542C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">derivation</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15435"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> is evaluated to provide the EStructuralFeature value with the containing EClassifier as the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context object. The result type of the 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> must conform to the type of the EStructuralFeature.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An 

+					<fo:inline font-family="Inconsolata,Courier">initial</fo:inline> rather than 

+					<fo:inline font-family="Inconsolata,Courier">derivation</fo:inline> value may be specified. The 

+					<fo:inline font-family="Inconsolata,Courier">initial</fo:inline> is ignored if a 

+					<fo:inline font-family="Inconsolata,Courier">derivation</fo:inline> is also specified.

+				</fo:block></fo:block><fo:block id="ValidationDelegate"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validation Delegates</fo:marker><fo:block font-size="14pt">6.11.6. Validation Delegates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A validation delegate is invoked to provide additional validation of an EClassifier. A validation delegate must be registered for the EPackage of the EClassifier for which the EClassifier provides any Ecore invariants or Ecore constraints.  Both Ecore constraints and invariants constrain an EClassifier, the difference is that an Ecore invariant is realised by an EOperation and so an Ecore invariant may be re-used by modeling environments that may wish to selectively check or re-check constraints.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The EPackage registration is provided by an EAnnotation on the EPackage</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15468"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15469"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15472"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15473"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">validationDelegates</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1547C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">All Ecore constraints must be listed in an EAnnotation on the EClassifier</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1548A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1548B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/emf/2002/Ecore</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15494"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15495"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">constraints</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1549E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">constraintName1 constraintName2 constraintName3</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The validation delegate for each Ecore constraint is provided by a further EAnnotation on the EClassifier</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N154AC"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154AD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-style="italic">

+								<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+							</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N154B9"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154BA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">constraintName</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154C6"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The validation delegate for each Ecore invariant is provided by an EAnnotation on the EOperation</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N154D4"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154D5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-style="italic">

+								<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+							</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N154E1"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154E2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-family="Inconsolata,Courier">body</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N154EB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> is evaluated to validate the EClassifier with the EClassifier as the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context object. The result type of the 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> must be Boolean.

+				</fo:block></fo:block><fo:block id="ValidationMessages"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validation Messages</fo:marker><fo:block font-size="14pt">6.11.7. Validation Messages</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When a validation fails EMF generates a default diagnostic of the form 

+					<fo:inline font-family="Inconsolata,Courier">The</fo:inline> 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">'constraintName'</fo:inline>

+					</fo:inline> 

+					<fo:inline font-family="Inconsolata,Courier">is violated on</fo:inline> 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">'constrainedObject'</fo:inline>

+					</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the 

+					<fo:basic-link internal-destination="OCLinEcoreEObjectValidator"><fo:inline color="blue" text-decoration="underline">OCLinEcoreEObjectValidator</fo:inline></fo:basic-link> or 

+					<fo:basic-link internal-destination="CompleteOCLEObjectValidator"><fo:inline color="blue" text-decoration="underline">CompleteOCLEObjectValidator</fo:inline></fo:basic-link> are used a custom message may be supplied using an additional EAnnotation on the EClassifier.

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1552A"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1552B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">source</fo:inline> = 

+							<fo:inline font-style="italic">

+								<fo:inline font-family="Inconsolata,Courier">OCL-Delegate-URI</fo:inline>

+							</fo:inline>

+						</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15537"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15538"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">key</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">constraintName</fo:inline>

+									</fo:inline>

+									<fo:inline font-family="Inconsolata,Courier">$message</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15547"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+									<fo:inline font-family="Inconsolata,Courier">value</fo:inline> = 

+									<fo:inline font-style="italic">

+										<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+									</fo:inline>

+								</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> is evaluated to produce the custom message with the EClassifier as the 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> context object. The result type of the 

+					<fo:inline font-style="italic">

+						<fo:inline font-family="Inconsolata,Courier">OCL-expression</fo:inline>

+					</fo:inline> must be String.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The severity of the diagnostic can also be customized by exploiting the four values of the Boolean value of the constraint evaluation.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15566"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15567"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">true</fo:inline> indicates successful validation

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1556D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">false</fo:inline> indicates unsuccessful validation with warning severity

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15573"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">null</fo:inline> indicates unsuccessful validation with error severity

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15579"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">invalid</fo:inline> indicates a failure to perform validation (error severity)

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block><fo:block id="QueryDelegate"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Query Delegates </fo:marker><fo:block font-size="14pt">6.11.8. Query Delegates </fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A query delegate is invoked to evaluate a parameterized query on a EObject for which there is no corresponding EOperation. A query delegate is registered to install this query and allow its compiled form to be cached. The delegate may then be invoked as many times as required for compatible context objects and parameters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This facility enables an EMF application to execute OCL without declaring or instantiating any OCL classes.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The query delegate registration is analogous to direct use of 

+					<fo:inline font-family="Inconsolata,Courier">OCL.newInstance().createHelper().createQuery()</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The query delegate execution is analogous to

+

+					<fo:inline font-family="Inconsolata,Courier">OCL.evaluate()</fo:inline> 

+				</fo:block></fo:block></fo:block><fo:block id="Standalone"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Ecore/UML Standalone Configuration</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">6.12. Ecore/UML Standalone Configuration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you use Eclipse OCL within Eclipse you should find that the appropriate registrations are provided for you automatically by the plugin registration mechanisms.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">However if you use Eclipse OCL outside Eclipse, for instance in JUnit tests, you must provide the corresponding registrations in your code.</fo:block><fo:block id="Ecore"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Ecore</fo:marker><fo:block font-size="14pt">6.12.1. Ecore</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For the Ecore metamodel, the required registrations should be provided by invoking

+

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore.OCL.initialize(ResourceSet)</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This may be invoked with a null argument to install the registrations in the global EPackage.Registry. This is not normally recommended, but since this is for your application, the integrity of the global registry is your responsibility.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is normally recommended to install the registrations solely for use in your own ResourceSet and to pass that to the initialize routine.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This initialization ensures that *.ecore is understood.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use EMF delegates to dispatch OCL, the required registrations may be

+					provided by 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.ecore.delegate.OCLDelegateDomain.initialize(ResourceSet)</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This may be invoked with a null argument to install the registrations in the global EPackage.Registry rather than a specified local registry. </fo:block></fo:block><fo:block id="UML"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">UML</fo:marker><fo:block font-size="14pt">6.12.2. UML</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For the UML metamodel, the required registrations should be provided in a similar way by invoking

+

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.uml.OCL.initialize(ResourceSet)</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This initialization ensures that *.uml is understood that  http://www.eclipse.org/ocl/1.1.0/oclstdlib.uml is known and that standard pathmap: locations are resolvable. It also invokes 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.uml2.uml.resources.util.UMLResourcesUtil.init(ResourceSet)</fo:inline> to ensure that all Eclipse and OMG UML namespaces and extensions are registered..

+				</fo:block></fo:block><fo:block id="Classpath"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Classpath</fo:marker><fo:block font-size="14pt">6.12.3. Classpath</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A precise Java 5 classpath for the current release may be obtained as a diagnostic output near the end of the console output of the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(https://ci.eclipse.org/ocl/job/ocl-ecore-standalone/lastBuild/console)">Jenkins Ecore Classpath</fo:basic-link> or 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(https://ci.eclipse.org/ocl/job/ocl-uml-standalone/lastBuild/console)">Jenkins UML Classpath</fo:basic-link> jobs.

+				</fo:block></fo:block><fo:block id="XtextEditors"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Xtext Editors</fo:marker><fo:block font-size="14pt">6.12.4. Xtext Editors</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Xtext Editors use the Pivot binding and so their initialiation is described in “Pivot Standalone Configuration”#PivotStandalone.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Xtext editors may be used with the Ecore or UML bindings in so far as the Complete OCL editor provides a *.ocl document that may be parsed by the LPG parser, and the OCLinEcore editor provides embedded OCL that may be executed by either evaluator.</fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Unified or Pivot Programmers Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Unified or Pivot Programmers Guide</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="PivotProgrammersGuide"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 7. Unified or Pivot Programmers Guide</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Unified or Pivot Programmers Guide describes the ways in which the Pivot binding Eclipse OCL can be used from Java programs.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding was first available as an examples quality prototype in 3.1.0 (Indigo). The Pivot binding 

+			became the preferred binding in 6.0.0 (Mars). The older Ecore and UML bindings are described in a separate 

+			<fo:basic-link internal-destination="ProgrammersGuide"><fo:inline color="blue" text-decoration="underline">Ecore/UML Programmers Guide</fo:inline></fo:basic-link>.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Parser/Interpreter provides an implementation of the 

+			<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://www.omg.org/spec/OCL)">Object Constraint Language 2.4</fo:basic-link> specification for EMF-based metamodels and models.  It offers OCL

+			constraint and query parsing and evaluation, model-based validation, and

+			provides an infrastructure for content assist in textual editors.

+		</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following features are supported in the current version:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N155E7"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155E8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Classifier invariant constraints</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155EB"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operation precondition and postcondition constraints and body conditions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155EE"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Property constraints (initial-value and derivation)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155F1"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Attribute and operation definitions (def: expressions)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155F4"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Package context declaration</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155F7"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Basic values and types</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155FA"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Collection types</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N155FD"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of attributes and association ends</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15600"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operation invocation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15603"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Iteration expressions (all standard iterators)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15606"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Let expressions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15609"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>If expressions</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1560C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Tuples</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1560F"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Message expressions, including unspecified values</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15612"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operations predefined by OCL:  allInstances(), oclIsKindOf(), oclIsTypeOf(), oclAsType(), oclIsNew()</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15615"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Escape syntax for illegal names:  type, operation, attribute, etc. names that correspond to OCL reserved words can be escaped in the standard fashion using a leading underscore (‘_’).  In addition, names that contain spaces or tabs can be escaped by enclosing them in double-quotes (‘"’; this is non-standard).  e.g., 

+					<fo:inline font-family="Inconsolata,Courier">self.ownedRule-&gt;forAll(c : Constraint | c._context = self)</fo:inline>

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above constructs are supported by the parser for parsing and

+			for evaluation, with the exception of the oclIsNew() operation and

+			message expressions.  All of the above are supported for both Ecore

+			and UML models.  The following are supported by default for UML

+			(both in parsing and evaluation):</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1561D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1561E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of non-navigable association ends (including those that are owned by the association)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15621"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Qualified association end navigation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15624"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation to association classes, including source qualifiers</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15627"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Operations predefined by OCL: oclIsInState()</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The following features are provided in addition to the OCL specification:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N1562C"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1562D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>String case conversion operations:  toUpper(), toLower()</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15630"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Support for comparison (&lt;, &lt;=, etc.) and sorting of any java 

+					<fo:inline font-family="Inconsolata,Courier">Comparable</fo:inline> s of conformant types

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15636"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Transitive closure of associations:  closure(expr : OCLExpression) iterator</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15639"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Navigation of “hidden” opposites of references specified in Ecore models using a 

+					<fo:inline font-family="Inconsolata,Courier">Property.oppositeRoleName</fo:inline> annotation with source 

+					<fo:inline font-family="Inconsolata,Courier">http://schema.omg.org/spec/MOF/2.0/emof.xml</fo:inline> on the forward reference, producing an 

+					<fo:inline font-family="Inconsolata,Courier">OppositePropertyCallExp</fo:inline> expression

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL implementation is defined in plug-ins for convenient deployment in

+			Eclipse, but as is the case for EMF, it can also be used stand-alone.  The

+			plug-ins are partitioned thus:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15647"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15648"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot</fo:inline>:  the neutral Pivot model, interfaces, Standard Library and evaluator.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1564E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.codegen</fo:inline>:  the OCL to Java code generator.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15654"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.debug...</fo:inline>:  the extensible debugger.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1565A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.validity</fo:inline>:  the Validation View.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15660"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.xtext...</fo:inline>:  Xtext editors.

+				</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block id="OCL-Environment"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Environment</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.1. OCL Environment</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based Eclips OCL maintains signifcant amount of working state to cache aspects of the user metamodels and models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL working meta-state used for OCL parsing and analysis comprises at least a <fo:inline font-family="Inconsolata,Courier">CompleteEnvironment</fo:inline>, <fo:inline font-family="Inconsolata,Courier">CompleteModel</fo:inline>, <fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>, <fo:inline font-family="Inconsolata,Courier">MetamodelManager</fo:inline>, <fo:inline font-family="Inconsolata,Courier">Orphanage</fo:inline> and <fo:inline font-family="Inconsolata,Courier">StandardLibrary</fo:inline>.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The additional OCL working state for OCL execution comprises an <fo:inline font-family="Inconsolata,Courier">Executor</fo:inline> and a <fo:inline font-family="Inconsolata,Courier">ModelManager</fo:inline>.</fo:block><fo:block id="OCLproblem"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Implementation Problem</fo:marker><fo:block font-size="14pt">7.1.1. OCL Implementation Problem</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse OCL exploits the Eclipse Modeling Framework (EMF) and so has to comply with EMF APIs. Unfortunately the most basic EMF API <fo:inline font-family="Inconsolata,Courier">getXXX()</fo:inline> to access the feature <fo:inline font-family="Inconsolata,Courier">xxx</fo:inline> provides no ability to pass any OCL working state to an OCL implementation of <fo:inline font-family="Inconsolata,Courier">getXXX()</fo:inline>. There is also no ability to create or destroy the OCL working state before and after a sequence of activities for which the OCL requirement of model invariance is satisfied.</fo:block></fo:block><fo:block id="OCLwithAdapters"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL adapters pre-2021-03</fo:marker><fo:block font-size="14pt">7.1.2. OCL adapters pre-2021-03</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Prior to the 2021-03 (6.14.0) release, the OCL working meta-state was lazily created on demand and eventually garbage collected. The working meta-state was persisted by use of an <fo:inline font-family="Inconsolata,Courier">EnvironmentFactoryAdapter</fo:inline> to attach the state to the <fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> containing the user model / metamodel. The state could be recovered by a hiearchical search of the user model’s containment hierarchy. The <fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> facade supports multiple usage of the state via a share count so that GC only kicks in once all usage is done. A <fo:inline font-family="Inconsolata,Courier">WeakOCLRef</fo:inline> provides another mechanism for sharing. </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL working state is similarly maintained via <fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> adapters and also by an entry in the validation context of the EMF <fo:inline font-family="Inconsolata,Courier">validate()</fo:inline> API.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The above approaches work for straightforward usage. But...</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When OCL invariants or getters are executed from an installed model, there is no <fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> and so the user’s OCL context is not available. Rather a special global OCL working meta-state is used; it ignores any Complete OCL contributions from the user’s application.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Models shared between applications are isolated by careful use of <fo:inline font-family="Inconsolata,Courier">ValidationAdapter</fo:inline>s to identify which OCL is involved.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Multi-threaded applications may successfully share the working state provided the user has resolved all other threading hazards.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Applications using multiple OCLs such as one reference OCL for an old-way, and another experimental OCL for a new way, may successfully use distinct adapters.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">However from a developer’s perspective it’s all very fragile and complicated and metamodel schizophrenia is always waiting for an opportunity to bite.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Avoiding leakage with EMF applications is quite hard since a single refernce from one of the global registries can easily lock everything into memory,</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Identifying when the user model analysis in the working state can be re-used and when it must be recomputed is hard since there is no mechanism for a user to delimit the duration of model invariance.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Investigation of a bug in the implicit opposites underpinning a stereotype in a static UMLprofioe revealed that the analyses supporting 

+					<fo:inline font-style="italic">allInstances</fo:inline> and 

+					<fo:inline font-style="italic">implicitOpposites</fo:inline> was very very pessimitic and consequently very inefficient.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The major use cases for OCL applications are model validation and model transformation. For the latter, the transformation tool can easily initialize the OCL state prior to transformation and clean up afterwards. For the former case, a massive performance improvement is possible if the one working state can be re-used throughout the model validation.</fo:block></fo:block><fo:block id="OCLperThread"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL per Thread post-2021-03</fo:marker><fo:block font-size="14pt">7.1.3. OCL per Thread post-2021-03</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For the 2021-03 (6.14.0) release a new approach is taken. The OCL working state is referenced by a thread local variable making discovery easy and cleanup inherent in the demise of the thread. Lazy creation is fairly easy too.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is no need for a special global OCL context with defective capabilities; the <fo:inline font-family="Inconsolata,Courier">GlobalEnvironmentFactory</fo:inline> and its <fo:inline font-family="Inconsolata,Courier">INSTANCE</fo:inline> is obsolete.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">But, by default multi-threaded applications have a distinct OCL working state per-thread, which may be beneficial or inefficient. if the programmer is able to manage thread safety, then the <fo:inline font-family="Inconsolata,Courier">ThreadLocalExecutor.set</fo:inline> API may be used to share the same OCL state on more than one theead. NB the current OCL code has some synchronizations that may help with thread safety but overall there is no guarantee of thread safety.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">But, multi-OCL applications cannot have more than one active OCL per-thread.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">One variation of the multi-OCL use case was prevalent in the OCL JUnit tests where one OCL processed a reference model while another OCL processed an application model. The solution for interleaved usages is to invoke <fo:inline font-family="Inconsolata,Courier">OCL.deactivate</fo:inline> or <fo:inline font-family="Inconsolata,Courier">ThreadLocalExecutor.detachEnvironmentFactory</fo:inline> to suspend one OCL before <fo:inline font-family="Inconsolata,Courier">OCL.activate</fo:inline> or <fo:inline font-family="Inconsolata,Courier">ThreadLocalExecutor.attachEnvironmentFactory</fo:inline> resumes another OCL. The multiple OCLs can therefore co=exist till eventually <fo:inline font-family="Inconsolata,Courier">OCL.dispose()</fo:inline> cleans up.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Another variation of the multi-OCL use case was prevalent in the QVTd JUnit tests where one main extended OCL processed an application model while a nested OCL validated/serialized intermediate results. The same <fo:inline font-family="Inconsolata,Courier">deactivate</fo:inline>/<fo:inline font-family="Inconsolata,Courier">activate</fo:inline> solution again ensures that only one OCL is actve.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The use of concurrent OCLs on the same thread is diagnosed and results in a log message such as 

+					<fo:inline font-style="italic">Concurrent EnvironmentFactory instances inhibit local thread Executor passing</fo:inline> forcing th code to fall back on the old adapter mased approach. The solution, as described above, is to use <fo:inline font-family="Inconsolata,Courier">deactivate</fo:inline>/<fo:inline font-family="Inconsolata,Courier">activate</fo:inline> to eliminate the concuurent activity.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">But, whereas the old approach was very pessimistic creating a new OCL working state far too often, the thread-based OCL state must be invalidated by invoking <fo:inline font-family="Inconsolata,Courier">ThreadLocalExecutor.reset()</fo:inline> whenever the user models are changed in any way that might undermine the OCL assumption that models do not change. (This change could be automated using EMF’s TrackingModificatinAdapters but the cost is considered too high compared to a manual reset).</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">But, there is currently no support for sharing the UI thread across many <fo:inline font-family="Inconsolata,Courier">IWorkbenchPart</fo:inline>. i.e if two views both use OCL on the UI thread, the state of one view may confuse the other. Fortunately OCL activity such as validation is generally delegated to a worker thread avoiding the confusion and guaranteeing a new OCL per usage.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The adapters associated with the old approach are now obsolete but remain for now as legacy/compatibility clutter. They will be removed in a future release.</fo:block></fo:block></fo:block><fo:block id="Validators"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Validators</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.2. Validators</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When using the Pivot metamodel, there are two specialized validators available to support integration of OCL in to a larger Ecore environment. </fo:block><fo:block id="OCLinEcoreEObjectValidator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCLinEcoreEObjectValidator</fo:marker><fo:block font-size="14pt">7.2.1. OCLinEcoreEObjectValidator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Unfortunately, in the Indigo release, EMF does not support this customization and so must be activated by explicitly using an EValidator that is aware of the ValidationDelegateExtension extended API. This is available by using the OCLinEcoreEObjectValidator, which you may install globally by:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15722"><fo:inline font-family="Inconsolata,Courier">EValidator.Registry.INSTANCE.put(null, new OCLinEcoreEObjectValidator());

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">or more selectively by adjusting the inheritance of the Validator class generated by EMF from (for a model of a Company):</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1572A"><fo:inline font-family="Inconsolata,Courier">import org.eclipse.emf.ecore.util.EObjectValidator;

+

+/**

+ * &lt;!-- begin-user-doc --&gt;

+ * The &lt;b&gt;Validator&lt;/b&gt; for the model.

+ * &lt;!-- end-user-doc --&gt;

+ * @see company.CompanyPackage

+ */

+public class CompanyValidator extends EObjectValidator {

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">to</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15732"><fo:inline font-family="Inconsolata,Courier">import org.eclipse.ocl.xtext.oclinecore.validation.OCLinEcoreEObjectValidator;

+

+/**

+ * &lt;!-- begin-user-doc --&gt;

+ * The &lt;b&gt;Validator&lt;/b&gt; for the model.

+ * &lt;!-- end-user-doc --&gt;

+ * @see company.CompanyPackage

+ * @generated not

+ */

+public class CompanyValidator extends OCLinEcoreEObjectValidator {

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note the 

+					<fo:inline font-weight="bold">@generated not</fo:inline> that indicates that the class interface is manually defined. Do not use 

+					<fo:inline font-weight="bold">@generated NOT</fo:inline> since that indicates that the whole class is manually defined.

+				</fo:block></fo:block><fo:block id="CompleteOCLEObjectValidator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">CompleteOCLEObjectValidator</fo:marker><fo:block font-size="14pt">7.2.2. CompleteOCLEObjectValidator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The CompleteOCLEObjectValidator is used to enable Complete OCL documents to participate in the validation processing of an Xtext editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The APIs for merging Complete OCL and Ecore as intermediate Pivots and then migrating the Pivot back to Ecore are experimental.</fo:block></fo:block></fo:block><fo:block id="PivotEvaluator"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Pivot Evaluator</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.3. The Pivot Evaluator</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot evaluator is a complete reimplementation of the classic evaluator to exploit experience and the Pivot metamodel</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15750"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15751"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>numeric growth beyond 32/64 bits is accommodated</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15754"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>equal numbers are equal regardless of type</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15757"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>templated types are supported</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1575A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>library operations are modeled and extensible</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N1575D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>oclType() returns a Class offering full reflection without loss of static typing</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15760"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>optimised virtual function dispatch tables</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15763"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>code generation to Java</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The APIs of the two evaluators are very similar since Ecore compatibility is very important. For basic OCL evaluation, users should not notice any functional difference between the two evaluators. The Pivot evaluator is generally between 2 and 5 times faster as well as being more accurate. The code generated evaluation may be a further 20 times faster.</fo:block><fo:block id="PivotValue-History"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Evolving Pivot Value System</fo:marker><fo:block font-size="14pt">7.3.1. The Evolving Pivot Value System</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic evaluator uses Ecore and Java library representations such as EObject, Integer, String and Set directly for evaluation. This avoids conversion costs but incurs OCL accuracy challenges for numeric equality and growth.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Juno release of the Pivot evaluator use polymorphic 

+					<fo:inline font-family="Inconsolata,Courier">Value</fo:inline> representations such as EObjectValue, IntegerValue, StringValue and SetValue. This avoids the OCL accuracy difficulties but requires wrapper objects and incurs conversion costs wherever a compatible Ecore API is in use.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The IntegerValue and RealValue classes avoid the equivalence and accuracy problems of Integer and Double by implementing Object.equals(Object) with OCL semantics.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The costs of the polymorphic Boolean, String and EObject wrappers became apparent when testing the code generator and so the Kepler and Luna releases use a hybrid representation. Unboxed values (the natural Ecore and Java representation) are used wherever OCL and Java have compatible semantics, that is for Boolean, String, null, invalid/exception and EObjects that are not Types. Boxed polymorphic value representations are used wherever OCL and Java semantics differ, that is for IntegerValue, RealValue, CollectionValue, TupleValue and TypeValue. This avoids unnecessary conversion costs, but requires many instanceof tests to compensate for the lack of Value polymorphism. When generating code, static analysis can often eliminate many of the instanceof cases and so the hybrid representation is faster.</fo:block></fo:block><fo:block id="PivotValues"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Pivot Value System</fo:marker><fo:block font-size="14pt">7.3.2. The Pivot Value System</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Every value has a unique type identity supervised by the 

+					<fo:inline font-family="Inconsolata,Courier">IdManager</fo:inline> class. This unique identity can be shared by multiple OCL applications that may have distinct type systems as a result of Complete OCL complements.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Every value has a type that is determined from its type identity by a type-system-specific 

+					<fo:inline font-family="Inconsolata,Courier">IdResolver</fo:inline> instance, which also supports conversion between boxed and unboxed value representations.

+				</fo:block><fo:block id="PivotValueConversions"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">7.3.2.1. Value Conversions</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The values are managed by a 

+						<fo:inline font-family="Inconsolata,Courier">ValueFactory</fo:inline> which provides many utility methods such as 

+						<fo:inline font-family="Inconsolata,Courier">ValueFactory.valueOf(Object)</fo:inline> for creating a 

+						<fo:inline font-family="Inconsolata,Courier">Value</fo:inline> from a naked Java object. The reverse conversion from a value to a naked Java object may be be performed by 

+						<fo:inline font-family="Inconsolata,Courier">Value.asObject()</fo:inline> with

+						methods in derived value classes providing stronger type returns.

+					</fo:block></fo:block><fo:block id="PivotIntegers"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">7.3.2.2. Polymorphic Integers</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">IntegerValue</fo:inline> interface has a family of IntIntegerValueImpl, LongIntegerValueImpl and BigIntegerValueImpl realizations that use Java types internally but support numeric growth where necessary without imposing the overheads of BigInteger on the vast majority of mundane usages. The wrapping of 

+						<fo:inline font-family="Inconsolata,Courier">int</fo:inline> in 

+						<fo:inline font-family="Inconsolata,Courier">IntegerIntValueImpl</fo:inline> is very comparable to the wrapping of 

+						<fo:inline font-family="Inconsolata,Courier">int</fo:inline> in 

+						<fo:inline font-family="Inconsolata,Courier">java.lang.Integer</fo:inline> so there is little performance or representation cost.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This enables the Pivot evaluator to handle unlimited integers as specified by the OMG OCL specification.</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							Prior to the Juno release the handling of greater than 32 bit integers in the classic evaluator was suspect. The Juno release enhances support to allow for 64 bit integers but makes no provision for greater than 64 bit evaluations.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="PivotCollections"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">7.3.2.3. Polymorphic Collections</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">CollectionValue</fo:inline> interface has multiple implementations for Bag, OrderedSet, Sequence and Set with implementations that observe OMG OCL semantics.

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							The classic implementation uses Java collections directly, which unfortunately means that the Java semantics for equality is used. Consequently the classic evaluator incorrectly evaluates 

+							<fo:inline font-family="Inconsolata,Courier">Set{1,1.0}-&gt;size()</fo:inline> as 

+							<fo:inline font-family="Inconsolata,Courier">2</fo:inline>.

+						</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Using a distinct hierarchy of collection classes opens up opportunities for smart operation, such as in-place update for collections that are rendered redundant by a calculation.</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							The classic implementation creates a new collection at every opportunity.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="PivotObjects"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">7.3.2.4. Polymorphic Objects</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">ObjectValue</fo:inline> interface has an implementation for EObject and further implementations for more specialized objects such as types.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot evaluator can be used on alternate data models by providing an alternate 

+						<fo:inline font-family="Inconsolata,Courier">ObjectValue</fo:inline> to wrap

+						an alternative form of data object.

+					</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+							The classic implementation uses EObject directly, which makes use of non-EObject data models rather hard.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="ThePivotEvaluatorTypeSystem"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Pivot Evaluator Type System</fo:marker><fo:block font-size="14pt">7.3.3. The Pivot Evaluator Type System</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot Evaluator uses a very lightweight type system so that alternate implementations can be used.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For compiled evaluation, a dispatch-table based implementation is used.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For OCL compilation, a UML-aligned representation of the combined UML, OCL, library and user type systems is used.</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						The classic implementation uses either UML or Ecore meta-models directly, with Ecore as the meta-meta-model. Consequently there was no support for oclType(). Reflection was available in the non-OMF Ecore domain, so

+						the meta-meta-class is “EClass” rather than “Class”.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="ThePivotEvaluatorImplementationSystem"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Pivot Evaluator Implementation System</fo:marker><fo:block font-size="14pt">7.3.4. The Pivot Evaluator Implementation System</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot evaluator may be used in an interpreted form similar to the classic evaluator. In this form the evaluator performs a tree-walk over the Abstract Syntax Tree of the OCL expression. Languages that extend OCL may extend this tree-walk by implementing the relevant visitor evaluations for additional AST nodes.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A partially optimized code generator is available for the Pivot evaluator for which the code generator walks the AST at compile-time. The code generator may be extended to support code generation for languages that extend OCL. See the QVTi code generator in the QVTd project as an example.</fo:block></fo:block><fo:block id="PolymorphicImplementations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Polymorphic Implementations</fo:marker><fo:block font-size="14pt">7.3.5. Polymorphic Implementations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL Standard Library comprises packages of classes with one class per library feature, each class implementing the polymorphic implementation interface.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Provision of additional library function therefore requires</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N157FB"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N157FC"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>provision of the Java class for the library feature</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N157FF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>declaration of the library feature </fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Library features (properties, operations and iterations) are declared in a Standard Library model that identifies the invocation signature and binds it to a Java implementation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15806"><fo:external-graphic src="url(images/6200-library-declarations.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The extract from 

+					<fo:inline font-family="Inconsolata,Courier">/org.eclipse.ocl.pivot/model/OCL-2.5.oclstdlib</fo:inline> shows the declaration of the 

+					<fo:inline font-family="Inconsolata,Courier">Collection</fo:inline> type as a templated type with a 

+					<fo:inline font-family="Inconsolata,Courier">T</fo:inline> parameter. The 

+					<fo:inline font-family="Inconsolata,Courier">Collection</fo:inline> type conformsTo (extends/inherits/generalizes) the 

+					<fo:inline font-family="Inconsolata,Courier">OclAny</fo:inline> type and is an instance of the 

+					<fo:inline font-family="Inconsolata,Courier">CollectionType</fo:inline> meta-type.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">asSet</fo:inline> operation takes no arguments and returns a 

+					<fo:inline font-family="Inconsolata,Courier">Set(T)</fo:inline>, a set of the collection template type. The declaration is bound to 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.library.collection.CollectionAsSetOperation</fo:inline> which is the Java class name of the implementation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">exists</fo:inline> iteration has two overloads, taking one or two iterators of the collection template type. The iteration body is a lambda expression operating on a collection template element with no additional arguments to return a Boolean value. The iteration also returns a Boolean value. The same Java implementation class is used for both one and two argument forms.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						The corresponding implementations in the classic evaluator were mostly inlined within the 

+						<fo:inline font-family="Inconsolata,Courier">EvaluationVisitorImpl.visitOperationCallExp</fo:inline> method and so were difficult to extend.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The corresponding declarations in the classic evaluator were partially modeled in 

+						<fo:inline font-weight="bold">oclstdlib.ecore</fo:inline> or 

+						<fo:inline font-weight="bold">oclstdlib.uml</fo:inline>, although in practice an equivalent manually code model initialization is used. The type declarations used by the parser and analyzer are independently coded and do not support iterations as modeled concepts.

+					</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="PivotStandalone"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Pivot Standalone Configuration</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.4. Pivot Standalone Configuration</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you use Eclipse OCL within Eclipse you should find that the appropriate registrations are provided for you automatically by the plugin registration mechanisms.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">However if you use Eclipse OCL outside Eclipse, for instance in JUnit tests, you should initialize the appropriate language support using at least one of.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15849"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.xtext.completeocl.

+    CompleteOCLStandaloneSetup.doSetup();  // *.ocl

+org.eclipse.ocl.xtext.essentialocl.

+    EssentialOCLStandaloneSetup.doSetup(); // *.essentialocl

+org.eclipse.ocl.xtext.oclinecore.

+    OCLinEcoreStandaloneSetup.doSetup();   // *.ecore, *.oclinecore

+org.eclipse.ocl.xtext.oclstdlib.

+    OCLstdlibStandaloneSetup.doSetup();    // *.oclstdlib

+

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				Failure to initialize language support usually results in one of the following diagnostics.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15850"><fo:inline font-family="Inconsolata,Courier">No OCL Standard Library content available

+No 'XXX' type in the OCL Standard Library

+

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use UML models, the optional functionality must be activated.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15858"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.uml.UMLStandaloneSetup.init(); 							// *.uml

+

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				The following initializations that were once recommended should happen automatically.</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N1585F"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.OCL.initialize(resourceSet);

+org.eclipse.ocl.pivot.uml.internal.es2as.

+    UML2AS.initialize(resourceSet);

+org.eclipse.ocl.pivot.model.OCLstdlib.install();

+org.eclipse.ocl.pivot.internal.delegate.

+    OCLDelegateDomain.initialize(resourceSet);

+org.eclipse.ocl.pivot.internal.resource.

+    StandaloneProjectMap.getAdapter(resourceSet);

+

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">These are elaborated on below.</fo:block><fo:block id="Models2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Models</fo:marker><fo:block font-size="14pt">7.4.1. Models</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For the Pivot metamodel, the required registrations should be provided by invoking

+

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.OCL.initialize(ResourceSet)</fo:inline>. This initialization ensures that *.ecore is understood.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If *.uml support is also required, invoke

+

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.uml.internal.es2as.UML2AS.initialize(ResourceSet)</fo:inline> as well. 

+					This initialization ensures that *.uml is understood and that standard pathmap: locations are resolvable. It also invokes 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.uml2.uml.resources.util.UMLResourcesUtil.init(ResourceSet)</fo:inline> to ensure that all Eclipse and OMG UML namespaces and extensions are registered.

+				</fo:block></fo:block><fo:block id="OCLStandardLibrary"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Standard Library</fo:marker><fo:block font-size="14pt">7.4.2. OCL Standard Library</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use the default OCL Standard Library you should invoke 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.model.OCLstdlib.install()</fo:inline> which installs a compiled shareable form of 

+					<fo:inline font-family="Inconsolata,Courier">/org.eclipse.ocl.pivot/model/OCL-2.5.oclstdlib</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to use an alternate library examine the code for the standard installation above, and if you want to compile your library examine the 

+					<fo:inline font-family="Inconsolata,Courier">/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/GenerateOCLstdlibModel.mwe2</fo:inline> launcher for the

+

+					<fo:inline font-family="Inconsolata,Courier">/org.eclipse.ocl.examples.build/src/org/eclipse/ocl/examples/build/xtend/GenerateOCLstdlibXtend.xtend</fo:inline> Xtend template.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the library is extensible and importable so you may import your own library that in turn imports the standard library.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you neglect to install an OCL Standard Library, you get the error “No OCL Standard Library content available”. If you provide a custom library that fails to meet the miinimal requirements of defining the basic library types (e.g. Boolean, Set, Tuple) and methods (e.g. OclAny::“=”) you get an error such as “No 'Boolean' type in the OCL Standard Library”.</fo:block></fo:block><fo:block id="PivotDelegates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Pivot Delegates</fo:marker><fo:block font-size="14pt">7.4.3. Pivot Delegates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you have textual OCL embedded within Ecore models you need to register the EMF delegates so that EMF gets, calls or validates dispatch the embedded OCL to the OCL delegates. The required registrations may be provided by 

+					<fo:inline font-family="Inconsolata,Courier">OCLDelegateDomain.initialize(ResourceSet)</fo:inline> from the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.internal.delegate</fo:inline> package.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This may be invoked with a null argument to install the registrations in the global EPackage.Registry rather than a specified local registry.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you neglect to register delegates before generated EMF classes are initialized, you may get an NPE or an error of the form "An exception occurred while delegating evaluation of the ..."</fo:block></fo:block><fo:block id="XtextParsers"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Xtext Parsers</fo:marker><fo:block font-size="14pt">7.4.4. Xtext Parsers</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to be able to convert any textual form of OCL to its internal pivot form you need to initialize the relevant parser.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">*.ocl Complete OCL documents are initialized by 

+					<fo:inline font-family="Inconsolata,Courier">CompleteOCLStandaloneSetup.doSetup()</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">*.oclinecore metamodels are initialized by 

+					<fo:inline font-family="Inconsolata,Courier">OCLinEcoreStandaloneSetup.doSetup()</fo:inline>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">*.oclstdlib OCL Standard Library definitions are initialized by 

+					<fo:inline font-family="Inconsolata,Courier">OCLstdlibStandaloneSetup.doSetup()</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">*.ecore, *.essentialocl, *.uml files or general use of the query API is initialized by 

+					<fo:inline font-family="Inconsolata,Courier">EssentialOCLStandaloneSetup.doSetup()</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Each of the above ensures that everything that it requires is installed. The various set ups can be found in one of the following packages:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N158BC"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.xtext.completeocl.

+org.eclipse.ocl.xtext.essentialocl.

+org.eclipse.ocl.xtext.oclinecore.

+org.eclipse.ocl.xtext.oclstdlib.

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block><fo:block id="platformpluginandplatformresourceURIs"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">platform:/plugin and platform:/resource URIs</fo:marker><fo:block font-size="14pt">7.4.5. platform:/plugin and platform:/resource URIs</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you want to be able to use 

+					<fo:inline font-family="Inconsolata,Courier">platform:/plugin/...</fo:inline> or 

+					<fo:inline font-family="Inconsolata,Courier">platform:/resource/...</fo:inline> URIs in a standalone configuration you need to configure the EMF package and URI map registries appropriately. This is a costly activity that involves scanning the classpath and exploiting the content of any plugin.xml and MANIFEST.MF files that are found.

+				</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N158CE"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot.internal.resource.StandaloneProjectMap.getAdapter(resourceSet);

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">creates a 

+					<fo:inline font-family="Inconsolata,Courier">StandaloneProjectMap</fo:inline> to cache all the scan results, initializes the ResourceSet and installs itself as an adapter on the ResourceSet so that it can be retrieved again if needed. Users are strongly recommended to ensure that a single 

+					<fo:inline font-family="Inconsolata,Courier">StandaloneProjectMap</fo:inline> is shared by all clients and so avoid incurring the classpath scan cost more than once.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">(The 

+					<fo:inline font-family="Inconsolata,Courier">StandaloneProjectMap</fo:inline> has no OCL-specific functionality; it just cures a major problem in the standalone usage of EMF.)

+				</fo:block></fo:block><fo:block id="Classpath2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Classpath</fo:marker><fo:block font-size="14pt">7.4.6. Classpath</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If your standalone environment supports OSGI bundles, as will be the case when you use Eclipse to launch a JUnit test or a transformation, the required plugin dependencies are easily configured in the MANIFEST.MF using JDT quick fixes, or the Manifest editor.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For a totally standalone Java launch, you must identify the exact spelling of each JAR that you require and identify it on your Java classpath. The Eclipse JARs may be found in the plugins folder adjacent to your eclipse.exe. So you may need 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.common_1.0.0.v20120516-1543.jar</fo:inline> amongst many others. The required JARs can be recursively determined by looking at the Class Not Found Exceptions from the Java launch and locating the plugin with a similar name prefix. This is very tedious and has to be repeated each time you upgrade, so don’t do it. Use OSGI. However if you must, the following dependency trees may provide some clues.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The dependency tree for the basic parsing and evaluation is:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N158EE"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.common

+  org.eclipse.ocl.pivot

+    org.eclipse.ocl.xtext.base

+      org.eclipse.ocl.xtext.essentialocl

+        org.eclipse.ocl.xtext.completeocl

+        org.eclipse.ocl.xtext.oclinecore

+        org.eclipse.ocl.xtext.oclstdlib

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Additionally the UI requires</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N158F6"><fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.common.ui

+  org.eclipse.ocl.examples.markup

+    org.eclipse.ocl.examples.markup.ui

+      org.eclipse.ocl.xtext.essentialocl.ui

+        org.eclipse.ocl.xtext.completeocl.ui

+        org.eclipse.ocl.xtext.oclinecore.ui

+        org.eclipse.ocl.xtext.oclstdlib.ui

+        org.eclipse.ocl.examples.xtext.console

+          org.eclipse.ocl.pivot.ui

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">You may also need the Xtext, EMF, MWE, Orbit plugins and their dependencies</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N158FE"><fo:inline font-family="Inconsolata,Courier">com.google.guava

+com.google.inject

+org.apache.log4j

+org.eclipse.emf.common

+  org.eclipse.emf.ecore

+    org.eclipse.emf.codegen

+    org.eclipse.emf.ecore.xmi

+org.eclipse.xtext

+  org.eclipse.xtext.common.types

+    org.eclipse.xtext.common.types.ui

+  org.eclipse.xtext.ui

+    org.eclipse.xtext.ui.shared

+  org.eclipse.xtext.util

+

+

+

+</fo:inline></fo:block></fo:block></fo:block><fo:block id="PivotThreadSafety"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Pivot Thread Safety</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.5. Pivot Thread Safety</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">OCL is declarative and side effect free and so particularly suitable for execution on multiple threads, provided all shared context is maintained in ways that avoid inter-thread conflicts.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The classic Ecore-based OCL evaluation makes no attempt to guarantee thread safety and some of the more recent functionality involving EMF delegate caches is very suspect for multiple thread usage. So if you want thread safety use the Pivot-based evaluation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The thread safety of interpreted Pivot evaluation is similarly suspect, however the much faster code generated evaluation is designed for thread safety.</fo:block><fo:block id="CodeGeneratedEvaluation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Code Generated Evaluation</fo:marker><fo:block font-size="14pt">7.5.1. Code Generated Evaluation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The code-generated evaluator is intended to be thread-safe; all shared objects update their caches within relatively fine-grained synchronized regions. However there are a number of class static variables that are not synchronized and might therefore experience at best a redundant multiple initialization and at worst an assumed uniqueness violation. Thread safe code must therefore invoke:</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15913"><fo:inline font-family="Inconsolata,Courier">	org.eclipse.ocl.pivot.utilities.ValueUtil.initAllStatics()

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">to ensure eager initialization of unsynchronized class variables. This routine is itself synchronized and so may be safely invoked on all threads, if it is not practical to invoke it solely from just a startup thread.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is not permissible to modify any part of any OCL object, array or collection.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Application code should not assume that the getter for a protected final field is invoked internally and so should not attempt to modify behavior by overriding it.</fo:block><fo:block id="DesignNotes"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">7.5.1.1. Design Notes</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Loose miscellaneous static fields are initialized by ValueUtil.initAllStatics().</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Most non-static fields are @NonNull and final eliminating thread hazards. However lazy caches cannot be avoided and these require manual review. Caches shared across OCl invocations use Weak references to avoid leakage.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">ElementIds are unique and shared across OCL evaluations and so IdManager maintains a hierarchy of synchronized caches for distinct forms of ElementId.

+						Some ElementIds such as TemplateParameterId are subject to two-phase construction (constructor followed by install). It is assumed that a half-constructed ElementId will not be made visible to other threads.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Values are optionally shared and so ValueUtil has a few loose statics for simple values such as FALSE, and a synchronized cache for integers in the range -256 to 1024.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EvaluatorIterationManagers do not currently permit forking of iterations to multiple threads and may malfunction if application code does so.</fo:block></fo:block></fo:block><fo:block id="InterpretedEvaluation"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Interpreted Evaluation</fo:marker><fo:block font-size="14pt">7.5.2. Interpreted Evaluation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This is not considered thread-safe. Superficial consideration suggests that the EMF delegate dispatching in particular needs careful attention.</fo:block></fo:block><fo:block id="OCLAnalysis"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Analysis</fo:marker><fo:block font-size="14pt">7.5.3. OCL Analysis</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Xtext-based functionality is only thread-safe in so far as Xtext imposes strict main/worker thread disciplines. It is very unlikely that activating additional worker threads will give satisfactory results.</fo:block></fo:block></fo:block><fo:block id="PivotParsingConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing Constraints and Queries</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.6. Parsing Constraints and Queries</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This section may be contrasted with the corresponding 

+				<fo:basic-link internal-destination="ParsingConstraints"><fo:inline color="blue" text-decoration="underline">Parsing Constraints and Queries</fo:inline></fo:basic-link> for the Ecore binding to see examples of the changes needed to migrate from the Ecore binding to the Pivot binding.

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL parser provides two APIs for parsing constraint and query expressions using the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/OCL.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+				</fo:basic-link> Facade.

+			</fo:block><fo:block id="TheOCLFacade2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Facade</fo:marker><fo:block font-size="14pt">7.6.1. The OCL Facade</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/OCL.html)">

+						<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+					</fo:basic-link> class provides both a Facade and a Handle for the various objects that support different aspects of OCL parsing and evaluation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N1595B"><fo:external-graphic src="url(images/6310-environment.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class is a simple type.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						There is no need for the many template parameters that parameterize the equivalent OCL class for the Ecore/UML bindings.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Behind the scenes, 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instances share an 

+					<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline> that creates and owns the primary support objects and provides an API to create these and other important artefacts.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">ProjectManager</fo:inline> supports the discovery of metamodels to resolve URI references.

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15977"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15978"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">OCL.NO_PROJECTS</fo:inline> is a very lightweight 

+							<fo:inline font-family="Inconsolata,Courier">ProjectManager</fo:inline> supporting access only to those models known to the external

+							<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>. 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15984"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">OCL.CLASS_PATH</fo:inline> is a heavyweight 

+							<fo:inline font-family="Inconsolata,Courier">ProjectManager</fo:inline> supporting access to models registered with plugins on the Java classpath. 

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The external

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> is a potentially user-supplied 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline> to manage the external metamodels such as Ecore or UML models or Xtext Concrete Syntax models.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The external metamodels are converted to the normalized Pivot representation under control of the 

+					<fo:inline font-family="Inconsolata,Courier">MetamodelManager</fo:inline> which maintains the normalized representation in an Abstract Syntax as

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A merged view of the normalized metamodels is provided by the 

+					<fo:inline font-family="Inconsolata,Courier">CompleteModel</fo:inline>  under control of the 

+					<fo:inline font-family="Inconsolata,Courier">CompleteEnvironment</fo:inline> that also supervises a 

+					<fo:inline font-family="Inconsolata,Courier">StandardLibrary</fo:inline>, 

+					<fo:inline font-family="Inconsolata,Courier">TupleManager</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">LambdaManager</fo:inline> for more specialized aspects of the merge. The 

+					<fo:inline font-family="Inconsolata,Courier">CompleteEnvironment</fo:inline> API supports synthesis of Collection and Map types.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Access to the normalized representations from diverse contexts, in particular from generated Java code, requires an ability to discover the merged representation of e.g. the 

+					<fo:inline font-weight="bold">Boolean</fo:inline> type from the minimal concept of a 

+					<fo:inline font-weight="bold">Boolean</fo:inline> type-id. The 

+					<fo:inline font-family="Inconsolata,Courier">IdResolver</fo:inline> performs the id-to-object conversion.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When Pivot models are derived from Xtext source text, a Concrete Syntax representation is converted to the normalized Abstract Syntax. The 

+					<fo:inline font-family="Inconsolata,Courier">CS2ASMapping</fo:inline> tracks the equivalences in this conversion so that tooling can reverse the navigation to discover appropriate text to highlight in a source editor for an underlying model element.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> handle may also reference a 

+					<fo:inline font-family="Inconsolata,Courier">ModelManager</fo:inline>. This is used to identify objects during evaluation of operations such as 

+					<fo:inline font-family="Inconsolata,Courier">allInstnaces()</fo:inline>.

+				</fo:block></fo:block><fo:block id="OCLHandles"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Handles</fo:marker><fo:block font-size="14pt">7.6.2. OCL Handles</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The static factory methods of the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class are used to create new instances. These are suitable for suitable for parsing OCL constraints

+					on any Ecore or UML model and evaluating them on instances of the model.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If you already have models loaded in a 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>, you may activate OCL functionality by creating a new 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance specifying that OCL should exploit that ResourceSet.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N159E1"><fo:external-graphic src="url(images/6310-creating-external.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-creating-external.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Alternatively you may leave the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance to create the 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N159F5"><fo:external-graphic src="url(images/6310-creating-internal.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-creating-internal.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is good practice to invoke 

+					<fo:inline font-family="Inconsolata,Courier">dispose()</fo:inline> explicitly to release all

+					OCL-related Resource references promptly rather than rely on garbage collection.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15A06"><fo:external-graphic src="url(images/6310-dispose.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-dispose.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">When repeated parsing and evaluation occurs on a model, it is very beneficial to re-use rather than

+					re-create the underyling OCL support objects. This is easily achieved in simple scenarios by re-using the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance directly. In more complex scenarios the handle behavior of an 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> instance can be exploited

+					to create multiple handles for diverse usages each of which is disposed when complete. The dispose of the

+					underlying OCL support occurs when the final handle disposes.

+				</fo:block></fo:block><fo:block id="ClassContext"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Class Context</fo:marker><fo:block font-size="14pt">7.6.3. Class Context</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Parsing an OCL expression requires a classifier to define the type of 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>. This is passed to 

+

+					<fo:inline font-family="Inconsolata,Courier">createInvariant()</fo:inline>, which enforces a Boolean result type, or to 

+					<fo:inline font-family="Inconsolata,Courier">createQuery()</fo:inline>, which allows any result type.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The result of parsing a query expression or a constraint is an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/ExpressionInOCL.html)">

+						<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline>

+					</fo:basic-link>,

+					an instance of the 

+					<fo:basic-link internal-destination="AbstractSyntax"><fo:inline color="blue" text-decoration="underline">Abstract Syntax Model</fo:inline></fo:basic-link>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15A36"><fo:external-graphic src="url(images/6310-context.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-context.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="OperationandPropertyContexts"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Operation and Property Contexts</fo:marker><fo:block font-size="14pt">7.6.4. Operation and Property Contexts</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In the case of constraints on operations or properties, the context consists

+					of two elements: the constrained operation/property and a classifier that

+					defines the type of 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline> while parsing the OCL. The classifier is deduced as the

+					container of the operation or property. These can be constrained as follows:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15A4B"><fo:external-graphic src="url(images/6310-define.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-define.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="Errors"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Errors</fo:marker><fo:block font-size="14pt">7.6.5. Errors</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The preceding examples are simplified by the assumption that there will be no parsing errors. In practice 

+					<fo:inline font-family="Inconsolata,Courier">ParserException</fo:inline>s should be caught and handled in an appropriate way by the application.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15A60"><fo:external-graphic src="url(images/6310-errors.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6310-errors.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="TheOCLHelper2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Helper</fo:marker><fo:block font-size="14pt">7.6.6. The OCL Helper</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						The Ecore/UML bindings for OCL provide an OCLHelper class to assist in creating queries. A similar

+						class is available with the Pivot binding for compatibility although it is largely redundant since

+						the 

+						<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class class be used directly. An 

+						<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> will give a small performance benefit

+						for multiple parses but not as much as direct use of an underlying 

+						<fo:inline font-family="Inconsolata,Courier">ParserContext</fo:inline> or a structuring

+						multiple queries in a Complete OCL document.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">From an OCL instance, we can create a helper object with which to parse constraints

+						and additional operation/attribute definitions.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						<fo:block id="N15A7E"><fo:external-graphic src="url(images/6310-oclhelper.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block> 

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">OCLHelper</fo:inline> is primarily designed for parsing

+						constraints and query expressions embedded in models, providing the following

+						API for that purpose:

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createQuery()</fo:inline>: parses a query expression

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createConstraint()</fo:inline>: parses a constraint of a given 

+						<fo:inline font-family="Inconsolata,Courier">ConstraintKind</fo:inline>

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createInvariant()</fo:inline>: convenience for invariant constraints

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createPrecondition()</fo:inline>: convenience for pre-condition constraints

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createPostcondition()</fo:inline>: convenience for post-condition constraints

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createBodyCondition()</fo:inline>: convenience for body conditions

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">* 

+						<fo:inline font-family="Inconsolata,Courier">createDerivedValueExpression()</fo:inline>: convenience for attribute derived values

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Different kinds of constraints require different context environments.  The

+

+						<fo:inline font-family="Inconsolata,Courier">setContext()</fo:inline>, 

+						<fo:inline font-family="Inconsolata,Courier">setOperationContext()</fo:inline>,

+						and 

+						<fo:inline font-family="Inconsolata,Courier">setAttributeContext()</fo:inline> methods create the appropriate

+						nested 

+						<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline> s in the host 

+						<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+						instance’s root environment.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore/UML bindings variously produce a Constraint or OCLExpression result. A Constraint has too much context and an OCLExpression too little. An ExpressionInOCL produced by the Pivot binding is just right.</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em"/></fo:block></fo:block><fo:block id="PivotEvaluatingConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Evaluating Constraints and Queries</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.7. Evaluating Constraints and Queries</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In 

+				<fo:basic-link internal-destination="PivotParsingConstraints"><fo:inline color="blue" text-decoration="underline">Parsing Constraints</fo:inline></fo:basic-link>, we saw how to use

+				the 

+				<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> Facade to parse a textual OCL constraint or query expressions to give its

+

+				<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline> compiled representation. Parsing constraints is interesting,

+				but evaluating them using the 

+

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/Query.html)">

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline>

+				</fo:basic-link>

+				API is much more useful. 

+			</fo:block><fo:block id="TheOCLQuery2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Query</fo:marker><fo:block font-size="14pt">7.7.1. The OCL Query</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/Query.html)">

+						<fo:inline font-family="Inconsolata,Courier">Query</fo:inline>

+					</fo:basic-link>

+					class wraps the minimal 

+					<fo:inline font-family="Inconsolata,Courier">ExpressionInOCL</fo:inline> parse result to provide evaluation capabilities.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15AEC"><fo:external-graphic src="url(images/6315-query.png)" width="auto" height="auto" content-width="60%" content-height="60%"/></fo:block>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> encapsulates an

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/evaluation/EvaluationEnvironment.html)">

+						<fo:inline font-family="Inconsolata,Courier">EvaluationEnvironment</fo:inline>

+					</fo:basic-link>

+					providing the run-time values of context variables to the OCL interpreter.  These

+					context variables are set and retrieved using the following methods:

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15AFE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15AFF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">add(TypedElement, Object)</fo:inline>: adds a TypedElement-to-value binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B05"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">replace(TypedElement, Object)</fo:inline>:  replaces an existing binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B0B"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">remove(TypedElement)</fo:inline>:  removes a binding

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B11"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:inline font-family="Inconsolata,Courier">getValueOf(TypedElement)</fo:inline>: obtains a binding value

+						</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">.bq 

+					The Ecore/UML binding of Eclipse OCL used String rather than TypedElement to support name-to-value bindings.

+					The use of TypedElement rather than String avoids whereby the same name refers to multiple Variables depending on context.

+					.p </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The context variables of primary interest are 

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>

+					and, in operation constraints, the variables corresponding to its parameters.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An important consideration for OCL evaluation is the

+

+					<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline> operation, which obtains the entire

+					extent of a classifier. For data types, this is a simple problem:  the extent

+					of an 

+					<fo:inline font-family="Inconsolata,Courier">Enumeration</fo:inline> is well defined and the extents of

+					other kinds of 

+					<fo:inline font-family="Inconsolata,Courier">DataType</fo:inline>s are undefined.  For

+

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> extents, the 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> handle references a 

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/evaluation/ModelManager.html)">

+						<fo:inline font-family="Inconsolata,Courier">ModelManager</fo:inline>

+					</fo:basic-link>

+					that provides access to the user’s models. The default

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/internal/evaluation/PivotModelManager.html)">

+						<fo:inline font-family="Inconsolata,Courier">PivotModelManager</fo:inline>

+					</fo:basic-link>

+					lazily computes the extent of a class from the EMF 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>

+					containing the context element of the evaluation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">So, after optionally setting values of context variables (other than

+

+					<fo:inline font-family="Inconsolata,Courier">self</fo:inline>; the 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> takes care

+					of this) and an extent map, simply construct a query and use it to evaluate

+					the expression or check the constraint:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15B4A"><fo:external-graphic src="url(images/6315-check-all.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6315-check-all.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="Objectrepresentations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Object representations</fo:marker><fo:block font-size="14pt">7.7.2. Object representations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The example above uses 

+					<fo:inline font-family="Inconsolata,Courier">evaluateUnboxed()</fo:inline> so that the return value is unboxed and so compatible with the Classic Ecore/UML OCL binding.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding of OCL supports three distinct Java representations.</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15B5F"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B60"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>boxed for internal use</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B63"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>unboxed for traditional API compatibility</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15B66"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Ecore for Ecore API compatibility</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block xmlns:rx="http://www.renderx.com/XSL/Extensions" space-before.minimum="0.5em" space-before.optimum="1em" space-before.maximum="2em" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em" id="N15B69"><fo:table border-before-width.conditionality="retain" border-collapse="collapse" width="100%" border-start-style="solid" border-end-style="solid" border-top-style="solid" border-bottom-style="solid" border-start-width="0.5pt" border-end-width="0.5pt" border-top-width="0.5pt" border-bottom-width="0.5pt" border-start-color="black" border-end-color="black" border-top-color="black" border-bottom-color="black"><fo:table-body end-indent="0pt" start-indent="0pt"><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>OCL</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Unboxed</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Ecore</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boxed</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boolean</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boolean</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boolean</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Boolean</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>String</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>String</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>String</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>String</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Integer</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Integer/Long/BigDecimal</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Integer/Long/BigDecimal</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>IntegerValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Real</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Float/Double</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Float/Double</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>RealValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Object</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EObject</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EObject</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EObject</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Type</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EClassifier</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EClassifier</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>TypeValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>null</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>null</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>null</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>null</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>invalid</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>InvalidValueException</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>InvalidValueException</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>InvalidValueException</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Collection</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Collection</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EList</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>CollectionValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Bag</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Bag</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EList</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>BagValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Sequence</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>List</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EList</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>SequenceValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>OrderedSet</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>OrderedSet</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EList</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>OrderedSetValue</fo:block></fo:table-cell>

+					</fo:table-row><fo:table-row>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Set</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>Set</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>EList</fo:block></fo:table-cell>

+						<fo:table-cell padding-start="2pt" padding-end="2pt" padding-top="2pt" padding-bottom="2pt" border-start-style="none" border-end-style="none" border-top-style="none" border-bottom-style="none"><fo:block>SetValue</fo:block></fo:table-cell>

+					</fo:table-row></fo:table-body></fo:table></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The boxed representation is used wherever the Java semantics of 

+					<fo:inline font-family="Inconsolata,Courier">Object.equals(Object)</fo:inline> is different

+					to the OCL semantics of 

+					<fo:inline font-family="Inconsolata,Courier">OclAny::_'='(OclAny)</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The unboxed representation is used when a similar representation to the Ecore/UML binding is required.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Ecore representation is used for all interchange with Ecore EStructuralFeature values or EOperation

+					arguments and returns.</fo:block></fo:block><fo:block id="MultipleEvaluations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Multiple Evaluations</fo:marker><fo:block font-size="14pt">7.7.3. Multiple Evaluations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">One of the advantages of the 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API is that a

+					query’s evaluation environment can be reused for multiple evaluations, as

+					above.  The extent of any classifier is only computed once.  For convenience,

+					however, in situations where only a single evaluation is required, the

+

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class provides shortcuts:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15CB8"><fo:external-graphic src="url(images/6315-check-one.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6315-check-one.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="SuccintEvaluations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Succint Evaluations</fo:marker><fo:block font-size="14pt">7.7.4. Succint Evaluations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+					<fo:inline font-family="Inconsolata,Courier">Query</fo:inline> API also provides methods that work on

+					multiple elements.  The first example, above, could be written more succinctly as:

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15CCD"><fo:external-graphic src="url(images/6315-check-quick.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6315-check-quick.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block></fo:block><fo:block id="PivotParsingDocuments"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Parsing OCL Documents</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.8. Parsing OCL Documents</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As we saw in the 

+				<fo:basic-link internal-destination="PivotParsingConstraints"><fo:inline color="blue" text-decoration="underline">Parsing Constraints and Queries</fo:inline></fo:basic-link> topic, the  

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/utilities/OCL.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+				</fo:basic-link>

+				Facade provides an API for parsing OCL expressions embedded in models as constraints. 

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The OCL specification defines a Complete OCL text document with which a UML (or Ecore) metamodel

+				may be completed by providing many complementary constraints and expressions. In this case,

+				the concrete syntax for context declarations indicates the context of

+				constraints, equivalent to their placement in models.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As an example, consider the following Complete OCL document:</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:block id="N15CEE"><fo:external-graphic src="url(images/6320-extlibrary.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-extlibrary.ocl)">[Text for cut and paste]</fo:basic-link>

+			</fo:block><fo:block id="TheOCLInput2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The OCL Input</fo:marker><fo:block font-size="14pt">7.8.1. The OCL Input</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding provides a UML-aligned representation and so a Complete OCL document can be parsed to provide a similar Resource to that

+					derived from a UML or Ecore metamodel. A 

+					<fo:inline font-family="Inconsolata,Courier">Root</fo:inline> contains a 

+					<fo:inline font-family="Inconsolata,Courier">Model</fo:inline> which contains 

+					<fo:inline font-family="Inconsolata,Courier">Package</fo:inline>s

+					and 

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline>es. The complementing Resource from the Complete OCL document is independent of the similarly structured 

+					complemented Resource of the completed metamodel.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding uses an Xtext parser with a UML-aligned output. The input text is therefore specified by

+					a URI and loaded by the Xtext parser to create a Concrete Syntax Resource. This may then be converted to the Pivot Abstract Syntax Resource. The Abstract Syntax Resource has a conventional Model, Package, Class, Operation hierarchy in order to provide a coherent composition context for the Constraints.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The elements of the independent complementing and complemented Resources are merged within 

+					<fo:inline font-family="Inconsolata,Courier">CompleteClass</fo:inline>es and

+

+					<fo:inline font-family="Inconsolata,Courier">CompletePackage</fo:inline>s of the 

+					<fo:inline font-family="Inconsolata,Courier">CompleteModel</fo:inline> managed behind the OCL facade. 

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There are therefore two 

+					<fo:inline font-family="Inconsolata,Courier">Class</fo:inline> objects named 

+					<fo:inline font-weight="bold">Library</fo:inline>, one for each Resource. The objects are distinct in so far as they belong to different resources, which can be separately serialized, and in so far as they may appear distinct to OCL expressions that use reflective access. However they are logically merged and the 

+					<fo:inline font-family="Inconsolata,Courier">CompleteEnvironment</fo:inline> provides utility methods that allow the multiple objects to be accessed as a merged object.

+				</fo:block><fo:block margin-left="0.5in" margin-right="0.5in" space-after.minimum="0.5em" space-after.optimum="1em" space-after.maximum="2em"><fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+						The Ecore binding provided an 

+						<fo:inline font-family="Inconsolata,Courier">OCLInput</fo:inline> class to supervise the OCL source text, and the result of parsing the document was a 

+						<fo:inline font-family="Inconsolata,Courier">List&lt;Constraint&gt;</fo:inline>.

+						p. 

+					</fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Complete OCL document is a textual Resource with an associated text tooling. The 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> facade provides

+					an API to load a Resource from a given 

+					<fo:inline font-family="Inconsolata,Courier">URI</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15D36"><fo:external-graphic src="url(images/6320-parsing.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-parsing.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="TraversingtheConstraints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Traversing the Constraints</fo:marker><fo:block font-size="14pt">7.8.2. Traversing the Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The parsed resurce can be traversed in the same way as other EMF resources.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15D48"><fo:external-graphic src="url(images/6320-traversing.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-traversing.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="AccessingtheConstraints2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Accessing the Constraints</fo:marker><fo:block font-size="14pt">7.8.3. Accessing the Constraints</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The contents of the Complete OCL document contribute to a 

+					<fo:inline font-family="Inconsolata,Courier">CompleteModel</fo:inline> that merges all the contributions.

+					The contributions can therefore be used as if defined in a primary metamodel.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15D5D"><fo:external-graphic src="url(images/6320-accessing.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-accessing.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block></fo:block><fo:block id="UsingtheConstraintstoValidateaModel"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Using the Constraints to Validate a Model</fo:marker><fo:block font-size="14pt">7.8.4. Using the Constraints to Validate a Model</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard EMF validation makes use of an 

+					<fo:inline font-family="Inconsolata,Courier">EValidatorRegistry</fo:inline> that maps the URI of an 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> to the

+					derived 

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline> that provides the constraints appilcable to the 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline>. If we want to exploit

+					additional constraints defined in a Complete OCL document, we must extend the underlying 

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline>.

+					The 

+					<fo:inline font-family="Inconsolata,Courier">ComposedValidator</fo:inline> enables multiple 

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline> to be composed and to behave as a single

+

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline>. 

+					<fo:inline font-family="Inconsolata,Courier">ComposedEValidator.install()</fo:inline> replaces the single 

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline> by a composite 

+					initially containing just the replaced 

+					<fo:inline font-family="Inconsolata,Courier">EValidator</fo:inline>. A 

+					<fo:inline font-family="Inconsolata,Courier">CompleteOCLEObjectValidator</fo:inline> provides the additional validation of the given 

+					<fo:inline font-family="Inconsolata,Courier">uri</fo:inline> and 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15D99"><fo:external-graphic src="url(images/6320-validating.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-validating.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The standard 

+					<fo:inline font-family="Inconsolata,Courier">Diagnostician</fo:inline> does not directly support validation of a 

+					<fo:inline font-family="Inconsolata,Courier">Resource</fo:inline>.

+

+					<fo:inline font-family="Inconsolata,Courier">MyDiagnostician</fo:inline> remedies this deficiency and provides a 

+					<fo:inline font-family="Inconsolata,Courier">SubstitutionLabelProvider</fo:inline>

+					that provides slightly better labels within OCL diagnostics.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+					<fo:block id="N15DB3"><fo:external-graphic src="url(images/6320-diagnostician.png)" width="auto" height="auto" content-width="70%" content-height="70%"/></fo:block>

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/6320-diagnostician.txt)">[Text for cut and paste]</fo:basic-link>

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The source for these examples may be found in the org.eclipse.ocl.examples.xtext.tests plugin in model/parsingDocumentsExample.ocl and in src/org/eclipse/ocl/examples/test/xtext/PivotDocumentationExamples.java.</fo:block></fo:block></fo:block><fo:block id="PivotMetamodels"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OCL Relationship to Metamodels</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.9. OCL Relationship to Metamodels</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot-based OCL implementation provides indirect support for models defined using either the

+				Ecore or the UML metamodel (as implemented by the Eclipse EMF and UML2 projects),

+				and an 

+				<fo:basic-link internal-destination="AdvancedMetamodelBindings"><fo:inline color="blue" text-decoration="underline">extensibility API</fo:inline></fo:basic-link> that allows

+				additional EMF-based metamodels to be plugged in. The indirection through the UML-aligned Pivot metamodel makes OMG compliance much easier and decouples the implementationm from particular bindings. Support for an alternate concrete metamodel representation is therefore comparatively simple. 

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				The OCL API implements support for different target metamodels via the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/EnvironmentFactory.html)">

+					<fo:inline font-family="Inconsolata,Courier">EnvironmentFactory</fo:inline>

+				</fo:basic-link> interface. An implementation of this interface binds the metamodel’s metaclasses to the generic type parameters of the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/utilities/OCL.html)">

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline>

+				</fo:basic-link> class. The metamodel-specific 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/examples/pivot/Environment.html)">

+					<fo:inline font-family="Inconsolata,Courier">Environment</fo:inline>

+				</fo:basic-link> implementation constructed by this factory implements the reflection capability required by OCL to discover the elements of the model being constrained and the relationships between them.

+			</fo:block><fo:block id="ThePivotMetamodelBinding"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">The Pivot Metamodel Binding</fo:marker><fo:block font-size="14pt">7.9.1. The Pivot Metamodel Binding</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The preliminary OCL binding for the Pivot metamodel has been provided since the Indigo release by the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.pivot</fo:inline> plug-in. This has been promoted to 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot</fo:inline> in the Mars release.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot metamodel prototypes resolutions of the following problems in the OCL 2.4 specification</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15DEE"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15DEF"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>UML-alignment</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15DF2"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OCL Standard Library model</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15DF5"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>XMI interchange</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15DF8"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Complete OCL implementability</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The support for an OCL Standard Library model enables large parts of the OCL specification to be captured by models. This makes the behavior mutable and extensible through definition of alternate or extended library models. (The corresponding Ecore and UML bindings have an Ecore representation of the library but much of its functionality is directly implemented and so immutable.)  </fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot metamodel is auto-generated by a package merge of</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15DFF"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E00"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>selected parts of the UML metamodel</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E03"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>additional OCL packages</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E06"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>implementation-specific packages</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implementation-specific packages provide</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E0B"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E0C"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Visitors throughout the entire metamodel (OCL 

+							<fo:inline font-weight="bold">and</fo:inline> MOF)

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E13"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Ecore extensions</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">It is anticipated that the performance advantages of a uniform compliant metamodel, without the complexities of the templates from the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl</fo:inline> plugin, will outweigh the initial overhead of converting an Ecore or UML metamodel to Pivot form. Once this has been demonstrated, the direct Ecore and UML metamodels will be deprecated.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding is provided by the

+

+					<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.4.0/org/eclipse/ocl/pivot/internal/utilities/PivotEnvironmentFactory.html)">

+						<fo:inline font-family="Inconsolata,Courier">PivotEnvironmentFactory</fo:inline>

+					</fo:basic-link> class.  For compatibility, as a default, the Pivot environment uses the static 

+					<fo:inline font-family="Inconsolata,Courier">EPackage</fo:inline> registry to look up package names. This default is deprecated since the domain of 

+					<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline> may be very large when many models are registered.  It should therefore be supplied with an alternative package registry (for example, one local to a 

+					<fo:inline font-family="Inconsolata,Courier">ResourceSet</fo:inline>) for relevant metamodels. The static registry is then used as a backup for package lookups, but not for 

+					<fo:inline font-family="Inconsolata,Courier">allInstances()</fo:inline>.  The Pivot environment factory maintains the Pivot models associated with

+				</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E30"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E31"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Ecore metamodels in use</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E34"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>UML metamodels in use</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E37"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Library models in use</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E3A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Concrete Syntax source models</fo:block><fo:list-block provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E3D"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E3E"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OCLinEcore (rather than Ecore)</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E41"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Complete OCL</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E44"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OCL Standard Library</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot binding for OCL will provide the full capabilities of the UML binding, but at present only the Ecore facilities have been tested. The Pivot binding has the additional ability to support extensions to the library.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For applications that work exclusively with the Pivot binding for OCL, the 

+					<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.pivot</fo:inline> package defines an 

+					<fo:inline font-family="Inconsolata,Courier">OCL</fo:inline> class that provides similar facilities to the corresponding Ecore and UML binding equivalents.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot metamodel is used by Eclipse OCL for:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E53"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E54"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>all Xtext editors; editing, parsing, analysis and validation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E57"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>the Xtext OCL console; editor and evaluation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E5A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>EMF delegates using the http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot URI</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E5D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>explicit use of the Pivot metamodel from Java</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Pivot metamodel is not used by Eclipse OCL for:</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E62"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E63"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>OCL console editing and evaluation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E66"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>EMF delegates using the http://www.eclipse.org/emf/2002/Ecore/OCL/LPG URI</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E69"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>

+							<fo:basic-link internal-destination="ImpactAnalyzer"><fo:inline color="blue" text-decoration="underline">Impact Analyzer</fo:inline></fo:basic-link>.

+						</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E70"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>explicit use of the Ecore or UML bindings from Java</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF delegates using the http://www.eclipse.org/emf/2002/Ecore/OCL virtual URI are redirected to either http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot or http://www.eclipse.org/emf/2002/Ecore/OCL/LPG by the

+					setting of the “Executor targeted by the default OCL delegate” preference setting, which defaults to

+					http://www.eclipse.org/emf/2002/Ecore/OCL/LPG for compatibility.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Note that the Indigo and Juno OCLinEcore editor uses the http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot URI and so uses the 

+					<fo:basic-link internal-destination="PivotEvaluator"><fo:inline color="blue" text-decoration="underline">Pivot Evaluator</fo:inline></fo:basic-link>, whereas the Helios OCLinEcore editor used the http://www.eclipse.org/emf/2002/Ecore/OCL URI and so the Ecore evaluator. A file using the http://www.eclipse.org/emf/2002/Ecore/OCL URI will automatically be upgraded to the http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot URI when edited using the Indigo or Juno OCLinEcore editors.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">In Kepler, Luna ans Mars, the OCLinEcore editor preserves any existing delegate URI selection. The new “Preferred executor requested for OCL constraints” preference determines the URI when no previous setting is available. This defaults to http://www.eclipse.org/emf/2002/Ecore/OCL/Pivot for backwards compatibility.</fo:block></fo:block></fo:block><fo:block id="Pivot-Ids"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Ids</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">7.10. Ids</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The ElementId hierarchy provides the simplest base level of metamodel representation. The ElementIds feature</fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" space-after.optimum="0.4em" space-after.minimum="0.3em" space-after.maximum="0.5em" provisional-label-separation="0.2em" provisional-distance-between-starts="1.0em" id="N15E83"><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E84"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>identity</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E87"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>uniqueness</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E8A"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>thread-safety</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E8D"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>predictability</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" id="N15E90"><fo:list-item-label end-indent="label-end()"><fo:block>•</fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>hashcodes</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Every primary hierachical metamodel object such as a Package, Type, Operation or Property has a globally unique identity established by the package-class-feature path.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Auxiliary metamodel object such as a TemplateParameter, TuplePart or List-of-Parameter have a locally unique identity supporting fast matching of tuples or single lookup for operation parameters.</fo:block><fo:block id="Pivot-Id-Equality"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Id Equality</fo:marker><fo:block font-size="14pt">7.10.1. Id Equality</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">ElementIds are unique, whereas metamodel elements are not; there may be many meta-models in many applications all with their own Boolean PrimitiveTypeImpl instances. The equivalence of these elements may be established rapidly since each returns the same TypeId.BOOLEAN singleton from PrimitiveTypeImpl.getTypeId().</fo:block></fo:block><fo:block id="Pivot-IdManager"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">IdManager</fo:marker><fo:block font-size="14pt">7.10.2. IdManager</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Uniqueness of ElementIds is enforced by the various getXxxId methods of the single IdManager.INSTANCE. These methods are synchronized to ensure thread safety. Child hierarchical objects are similarly mediated by their parent.</fo:block></fo:block><fo:block id="Pivot-CollectionTypeId"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">CollectionTypeId</fo:marker><fo:block font-size="14pt">7.10.3. CollectionTypeId</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">CollectionTypeIds are a degenerate form of specialization/generalization with a single template parameter. The template parameter is declared explicitly in generalizations.</fo:block></fo:block><fo:block id="Pivot-TupleTypeId"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">TupleTypeId</fo:marker><fo:block font-size="14pt">7.10.4. TupleTypeId</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">TupleTypes are self-contained, that is all external template parameter references with the part types are bindings of a specialized tuple type whose generalization replaces those external references by the template parameters of the generalization.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">For instance given a declaration</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Set(A)::op(B)() : Tuple(a:A, b:Bag(B), c:B)</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Tuple(a:A, b:Bag(B), c:B) is the (A,B) specialization of the Tuple(T1,T2)(a:T1,b:Bag(T2),c:T2) generalization.</fo:block></fo:block><fo:block id="Pivot-LambdaTypeId"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">LambdaTypeId</fo:marker><fo:block font-size="14pt">7.10.5. LambdaTypeId</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">LambdaTypes are self-contained in the same way as tuples with specializations of generalizations.</fo:block></fo:block><fo:block id="Pivot-ParameterIds"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">ParameterIds</fo:marker><fo:block font-size="14pt">7.10.6. ParameterIds</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A ParameterIds identifies an ordered list of typeid suitable for identifying an operation’s parameter list by a single object and hashcode.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A ParameterIds has no knowledge of its parent Operation and so ParameterIds are reused whenever the typeid list arises. Note that collection typeIds are always collectionTypeIds, so there is no need for multiplicities. The residual optional existence is not subject to overloading and is ignored in ParameterIds.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">LambdaTypes reuse ParameterIds to capture the extended type list comprising the typeids of context-type, result-type then parameter-types. </fo:block></fo:block><fo:block id="Pivot-TuplePartId"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">TuplePartId</fo:marker><fo:block font-size="14pt">7.10.7. TuplePartId</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A TuplePartId identifies a part of a Tuple. It has a name, typeid and index. The index is the part position in the set of parts in a parent tuple alphabetically sorted by name. It provides efficient access to a slot position in a tuple representation.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A TuplePartId has no knowledge of its parent Tuple and so TuplePartIds are reused whenever the same combination of name, typeid and index arise.</fo:block></fo:block><fo:block id="Pivot-TemplateParameterId"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">TemplateParameterId</fo:marker><fo:block font-size="14pt">7.10.8. TemplateParameterId</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A TemplateParameterId identifies a template parameter in the ordered list of template parameters in a parent templateable element. It has just an index in the parent list. For debugging purposes a TemplateParameterId has a name such as $0 or $1.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">A TemplateParameterId has no knowledge of its parent templateable element and so only a couple of TemplateParameterIds ever exist. Three are statically defined as TypeId.T_1, T_2, T_3.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">TemplateParameterId has no knowledge of whether it is a type or value parameter. Pragmatically a TemplateParameterId extends a TypeId. (This design decision may need revision.)</fo:block></fo:block><fo:block id="Pivot-Id-CG"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Code Generation</fo:marker><fo:block font-size="14pt">7.10.9. Code Generation</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Since the ElementIds are predictable and unique, code generation can assign them for computation once in static variables so that large parts of the costs of model elememnt location can be performed at compile time. At class load time it is only necessary to construct/share the ElementId object. At run-time the ElementId provides a hashcode to

+					provode rapid lookup.</fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>API Reference</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>API Reference</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="APIReference"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 8. API Reference</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="Javadoc"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Javadoc</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">8.1. Javadoc</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Javadoc for Eclipse OCL 2020-06 (6.12.0) APIs may be found by following the 

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(http://download.eclipse.org/ocl/javadoc/6.12.0/)">OCL 2020-06 (6.12.0) API Reference</fo:basic-link> link.

+			</fo:block></fo:block><fo:block id="Extensionpoints"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Extension points</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">8.2. Extension points</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is one extension point, but it is no longer clear that it has any useful functionality. Please consider it deprecated.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(../references/extension-points/org_eclipse_ocl_environments.html)">Extension Points Reference</fo:basic-link>.

+			</fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="body" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Building the OCL Project</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Building the OCL Project</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="BuildingtheOCLProject"><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats"><fo:block margin-left="0pt"><fo:block font-weight="bold" font-size="24.8832pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Chapter 9. Building the OCL Project</fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This section contains some details on the way in which the OCL project is built. This should only be of interest to users creating extension of the project.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The interactive build facilities may be found in the org.eclipse.ocl.examples.build plugin. The “Generate OCL All” launch invokes all the sub-generators for models and editors.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The documentation build uses the “OCL Documentation” Ant external launch; see org.eclipse.ocl.doc/libs/Readme.txt for prerequisites. The build populates the help/html/manual folders whose content should be committted to GIT to ensure that the regular build uses the updated documentation. Publishing ocl.pdf is an option that can be selected when performing a final Jenkins reklease build.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The Javadoc build uses the “Run OCL Javadoc using Ant directly” Ant external launch. The build populates the javadoc folder which should not be committted to GIT. Generating and publishing the javadoc is an option that can be selected when performing a final Jenkins release build.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The distribution build facilities uses the Maven pom.xml in the org.eclipse.ocl.releng.tycho plugin. The “Build OCL Distribution - Nightly” replicates the Jenkins build locally differing only the absence of the final signing. The build populates the org.eclipse.ocl.releng.build-site plugin</fo:block><fo:block id="OOMPH"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">OOMPH</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">9.1. OOMPH</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is an org.eclipse.ocl.oomph/setups/ocl.setup that users may find helpful to create a development workspace, but the setup is not used by the developers and so may be stale.</fo:block></fo:block><fo:block id="MavenCentralandrepo.eclipse.org"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Maven Central and repo.eclipse.org</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">9.2. Maven Central and repo.eclipse.org</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse projects, such as OCL, use Maven in the form of Tycho that adds support for Eclipse working practices such as the P2 repositories.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">There is no official support for provision of releases via Maven centeal and few projects provide it. When you find an Eclipse projhect on Maven Central be aware that it was probably provided by a well-meaning but misguided Maven user without knowledge or approval of the Eclipse oroject. It almost certain that that user will neglect to provide updates and so it is just about guaranteed that what you find is very stale.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Eclipse provides an http://repo.eclipse.org for use by Maven users and some projects publish there. However there is no standard support for http://repo.eclipse.org and it appears that this approach is going obsolete. Attempts to offer OCL via http://repo.eclipse.org have foundered.</fo:block></fo:block><fo:block id="MavenandGradle"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Maven and Gradle</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">9.3. Maven and Gradle</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Some enthusiastic users have succeeded in using Maven directly and even Gradle. Anyone interested is recommended to read</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(https://www.eclipse.org/forums/index.php?t=msg&amp;th=1097672&amp;goto=1826425&amp;#msg_1826425)">Maven and Complete OCL usage</fo:basic-link>

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">

+				<fo:basic-link color="blue" text-decoration="underline" external-destination="url(https://www.eclipse.org/forums/index.php?t=msg&amp;th=1097672&amp;goto=1826395&amp;#msg_1826395)">Gradle usage</fo:basic-link> 

+			</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Further contributions from users are welcome.</fo:block></fo:block><fo:block id="GenAnnotations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">GenModel GenAnnotations</fo:marker><fo:block font-size="17pt" border-bottom-style="solid" border-bottom-width="1pt">9.4. GenModel GenAnnotations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The automated generation of models that form part of the OCL tooling exploits a number of GenAnnotations to influence the auto-generated code.</fo:block><fo:block id="httpwww.eclipse.orgOCLGenModelGenAnnotationSource"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">http://www.eclipse.org/OCL/GenModel GenAnnotation Source</fo:marker><fo:block font-size="14pt">9.4.1. http://www.eclipse.org/OCL/GenModel GenAnnotation Source</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15F33">&lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel"&gt;

+  &lt;details key="Use Null Annotations" value="true"/&gt;

+&lt;/genAnnotations&gt;

+</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">This GenAnnotation is also used by regular OCL code generation</fo:block><fo:block id="UseDelegates"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.1.1. Use Delegates</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the 

+						<fo:inline font-style="italic">Use Delegates</fo:inline> key is present and has a 

+						<fo:inline font-style="italic">true</fo:inline> value genModel will generate code for OCL expressions that delegates to the run-time interpreter, rather than generating Java code.

+					</fo:block></fo:block><fo:block id="UseNullAnnotations"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.1.2. Use Null Annotations</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the 

+						<fo:inline font-style="italic">Use Null Annotations</fo:inline> key is present and has a 

+						<fo:inline font-style="italic">true</fo:inline> value the generated code will have 

+						<fo:inline font-style="italic">@NonNull</fo:inline> and 

+						<fo:inline font-style="italic">@NonNull</fo:inline> annotations.

+					</fo:block></fo:block></fo:block><fo:block id="httpwww.eclipse.orgOCLGenModelToString"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">http://www.eclipse.org/OCL/GenModel/ToString</fo:marker><fo:block font-size="14pt">9.4.2. http://www.eclipse.org/OCL/GenModel/ToString</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15F5B">&lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel/ToString"&gt;

+  &lt;details key="org.eclipse.ocl.examples.codegen.cgmodel.CGElement"

+    value="return &amp;lt;%org.eclipse.ocl.examples.codegen.analyzer.CG2StringVisitor%&gt;.toString(this);"/&gt;

+&lt;/genAnnotations&gt;

+</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">By default EMF generates a toString() method that identifies all attribute values. This cannot be suppressed, only circumvented.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">If the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/OCL/GenModel/ToString</fo:inline> GenAnnotation is present the default is changed to use an inherited implementation, which must be specified somewhere.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Specific implementations of toString may be provided as the values of detail entries whose key is the qualified name of the interface class. Imports may be encoded with the implementation by enclosing the fully qualified name in 

+					<fo:inline font-family="Inconsolata,Courier">&lt;%...%&gt;</fo:inline>.

+				</fo:block></fo:block><fo:block id="httpwww.eclipse.orgOCLGenModelVisitor"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">http://www.eclipse.org/OCL/GenModel/Visitor</fo:marker><fo:block font-size="14pt">9.4.3. http://www.eclipse.org/OCL/GenModel/Visitor</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15F6F">&lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel/Visitor"&gt;

+  &lt;details key="Root Visitor Class" value="org.eclipse.ocl.pivot.util.Visitor"/&gt;

+  &lt;details key="Derived Visitor Class" value="org.eclipse.ocl.pivot.util.Visitor"/&gt;

+  &lt;details key="Visitable Interface" value="org.eclipse.ocl.pivot.util.Visitable"/&gt;

+  &lt;details key="Visitable Classes" value="org.eclipse.ocl.pivot.Element"/&gt;

+&lt;/genAnnotations&gt;

+</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The accept method for an hierarchical visitor pattern may be woven into the code using the 

+					<fo:inline font-family="Inconsolata,Courier">http://www.eclipse.org/OCL/GenModel/Visitor</fo:inline> genAnnotation.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implementation for class XXXX in the root package is</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15F7A"><fo:inline font-family="Inconsolata,Courier">@Nullable R accept(@NonNull RootVisitorClass&lt;R&gt; visitor) {

+	return visitor.visitXXXX(this);

+} 

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The implementation for class XXXX in the derived package is</fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15F81"><fo:inline font-family="Inconsolata,Courier">@Nullable R accept(@NonNull RootVisitorClass&lt;R&gt; visitor) {

+	return (R) (DerivedVisitorClass&lt;?&gt;)visitor).visitXXXX(this);

+} 

+</fo:inline></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The direct cast to the derived type assumes that the caller has ensured that the visitor in use supports the visitor interfaces for all objects in use.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The null annotations or omitted unless null annotations have been enabled.</fo:block><fo:block id="RootVisitorClass"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.3.1. Root Visitor Class</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The fully qualified name of the visitor class must be specified as the value of the 

+						<fo:inline font-style="italic">Root Visitor Class</fo:inline> detail. This class defines the argument type of the accept method.

+					</fo:block></fo:block><fo:block id="DerivedVisitorClass"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.3.2. Derived Visitor Class</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The fully qualified name of the derived visitor class must be specified as the value of the 

+						<fo:inline font-style="italic">Derived Visitor Class</fo:inline> detail. This detail may be omitted for the root package.

+					</fo:block></fo:block><fo:block id="VisitableInterface"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.3.3. Visitable Interface</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The fully qualified name of the visitable interface must be specified as the value of the 

+						<fo:inline font-style="italic">Visitable Interface</fo:inline> detail. It’s mandatory for the root package.

+					</fo:block></fo:block><fo:block id="VisitableClasses"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.3.4. Visitable Classes</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">An @Override annotation is generated for all implementations. This leads to an error where the implementation is not an override. The space-separated fully qualified names of all classes for which the accpe is not an override must be specified as the value of the 

+						<fo:inline font-style="italic">Visitable Classes</fo:inline> detail.

+					</fo:block></fo:block><fo:block id="ImplementationDetails"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.3.5. Implementation Details</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The support for accept is in 

+						<fo:inline font-family="Inconsolata,Courier">templates/model/Class/insert.javajetinc</fo:inline> where the appropriate code is generated into the implementation file with help from OCLBuildGenModelUtil.

+					</fo:block></fo:block></fo:block><fo:block id="httpwww.eclipse.orgOCLGenModelCopyAndPaste"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">http://www.eclipse.org/OCL/GenModel/CopyAndPaste</fo:marker><fo:block font-size="14pt">9.4.4. http://www.eclipse.org/OCL/GenModel/CopyAndPaste</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.minimum="0.3em" space-before.optimum="0.4em" space-before.maximum="0.5em" space-after.minimum="0.3em" space-after.optimum="0.4em" space-after.maximum="0.5em" hyphenate="false" wrap-option="no-wrap" white-space-collapse="false" white-space-treatment="preserve" linefeed-treatment="preserve" text-align="start" start-indent="3pc" font-size="9pt" keep-together.within-column="always" background-color="#F0F0F0" border="0" id="N15FBB">&lt;genAnnotations source="http://www.eclipse.org/OCL/GenModel/CopyAndPaste"&gt;

+  &lt;details key="org.eclipse.ocl.xtext.markup.FigureElement" 

+   value="model/FigureElement.javacopy"/&gt;

+&lt;/genAnnotations&gt;

+</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">EMF allows custom code to be added to classes using an @Generated NOT comment annotation or no annotation at all. These additions are preserved during regeneration, but may be lost if the file is deleted and regenerated.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">As an alternative, custom contributions may be pasted into class implementation files by specifying a detail entry whose key is the qualified interface name of the class to be customised and whose value is the project-relative name of a file providing text to be copied and pasted.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The copied text should be tab indented so that it matches the tab indentation of the auto-generated code.</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The copied text may reference types that may need importing by encoding the fully qualified name in 

+					<fo:inline font-family="Inconsolata,Courier">&lt;%...%&gt;</fo:inline>.

+				</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The customization files are conventionally given a *.copyjava file name and are placed in the model folder alongside the *.genmodel.</fo:block><fo:block id="ImplementationDetails2"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.4.1. Implementation Details</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The support for copy and paste is in 

+						<fo:inline font-family="Inconsolata,Courier">templates/model/Class/insert.javajetinc</fo:inline> where the referenced text is copied into the implementation file with help from OCLBuildGenModelUtil.

+					</fo:block></fo:block></fo:block><fo:block id="ImplementationDetails3"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:marker marker-class-name="section.head.marker">Implementation Details</fo:marker><fo:block font-size="14pt">9.4.5. Implementation Details</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block id="org.eclipse.ocl.examples.build"><fo:block><fo:block><fo:block keep-together.within-column="always" font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" margin-left="0pt"><fo:block keep-with-next.within-column="always"><fo:block font-family="Myriad Pro,Delicious,Helvetica" font-weight="bold" keep-with-next.within-column="always" space-before.minimum="0.8em" space-before.optimum="1.0em" space-before.maximum="1.2em" text-align="start" start-indent="0pt"><fo:block font-size="12pt">9.4.5.1. 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.build</fo:inline>

+					</fo:block></fo:block></fo:block></fo:block></fo:block></fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.build</fo:inline> plugin hosts the build-time functionality that does not need to bloat the distribution.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Modified JET templates are in the 

+						<fo:inline font-family="Inconsolata,Courier">templates</fo:inline> folder which 

+						<fo:inline font-family="Inconsolata,Courier">.jetproperties</fo:inline> prefixes to the template path. The 

+						<fo:inline font-family="Inconsolata,Courier">.project</fo:inline> has an 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.emf.codegen.jet.IJETNature</fo:inline> nature and builder so that the custom JET templates are automatically built to the 

+						<fo:inline font-family="Inconsolata,Courier">jet-gen</fo:inline> source folder. The 

+						<fo:inline font-family="Inconsolata,Courier">.project</fo:inline> similarly has has an 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.xtext.ui.shared.xtextNature</fo:inline> nature and builder so that the Xtend templates are automatically built to the 

+						<fo:inline font-family="Inconsolata,Courier">xtend-gen</fo:inline> source folder. Both these generated source folders are excluded from source control, since they are 100% auto-generated and they do not form part of the distribution.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">Custom JET templates are declared by OCLBuildGenModelGeneratorAdapterFactory which creates a OCLBuildGenClassGeneratorAdapter that replaces the normal reference to 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.emf.codegen.ecore.templates.model.Class</fo:inline> by 

+						<fo:inline font-family="Inconsolata,Courier">org.eclipse.ocl.examples.build.templates.model.Class</fo:inline>.

+					</fo:block><fo:block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em">The custom build functionality is installed by the 

+						<fo:inline font-family="Inconsolata,Courier">GenModelSetup</fo:inline> workflow component,

+					</fo:block></fo:block></fo:block></fo:block></fo:flow></fo:page-sequence><fo:page-sequence xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions" master-reference="back" hyphenate="true" language="en" format="1" initial-page-number="auto" force-page-count="no-force" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2"><fo:static-content flow-name="xsl-region-before-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Glossary</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-bottom-width="0.5pt" border-bottom-style="solid" border-bottom-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="before" text-align="start" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="center" relative-align="baseline"><fo:block><fo:block>Glossary</fo:block></fo:block></fo:table-cell><fo:table-cell display-align="before" text-align="right" relative-align="baseline"><fo:block><fo:block/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-before-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:static-content flow-name="xsl-footnote-separator"><fo:block><fo:leader color="black" leader-pattern="rule" leader-length="1in"/></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-first"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-odd"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-even"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"><fo:table table-layout="fixed" width="100%" border-top-width="0.5pt" border-top-style="solid" border-top-color="black"><fo:table-column column-number="1" column-width="proportional-column-width(1)"/><fo:table-column column-number="2" column-width="proportional-column-width(1)"/><fo:table-column column-number="3" column-width="proportional-column-width(1)"/><fo:table-body><fo:table-row block-progression-dimension.minimum="14pt"><fo:table-cell display-align="after" text-align="start" relative-align="baseline"><fo:block>

+                  Eclipse OCL 2021-06 (6.15.0)

+              </fo:block></fo:table-cell><fo:table-cell display-align="after" text-align="center" relative-align="baseline"><fo:block/></fo:table-cell><fo:table-cell display-align="after" text-align="end" relative-align="baseline"><fo:block><fo:page-number xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0"/></fo:block></fo:table-cell></fo:table-row></fo:table-body></fo:table></fo:block></fo:static-content><fo:static-content flow-name="xsl-region-after-blank"><fo:block font-family="Birka,Gentium Basic,Times,Symbol,ZapfDingbats" margin-left="0pt"/></fo:static-content><fo:flow flow-name="xsl-region-body" start-indent="3pc" end-indent="0pt"><fo:block id="glossary"><fo:block><fo:block><fo:block font-family="Myriad Pro,Delicious,Helvetica,Symbol,ZapfDingbats" font-weight="bold" font-size="24.8832pt" margin-left="0pt"><fo:block keep-with-next.within-column="always" space-before.optimum="10pt" space-before.minimum="10pt * 0.8" space-before.maximum="10pt * 1.2" hyphenate="false" text-align="start" start-indent="0pt" hyphenation-character="-" hyphenation-push-character-count="2" hyphenation-remain-character-count="2">Appendix A. Glossary</fo:block></fo:block></fo:block></fo:block></fo:block><fo:list-block space-before.optimum="0.4em" space-before.minimum="0.3em" space-before.maximum="0.5em" provisional-label-separation="0.25in" provisional-distance-between-starts="2in"><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N16013">EMF</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Eclipse Modeling Framework</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N16019">OCL</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Object Constraint Language</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N1601F">OMG</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Object Management Group</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N16025">QVT</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Query View Transformation</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N1602B">RTF</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Revision Task Force</fo:block></fo:block></fo:list-item-body></fo:list-item><fo:list-item space-before.optimum="1em" space-before.minimum="0.8em" space-before.maximum="1.2em"><fo:list-item-label end-indent="label-end()"><fo:block><fo:inline id="N16031">UML</fo:inline></fo:block></fo:list-item-label><fo:list-item-body start-indent="body-start()"><fo:block><fo:block>Unified Modeling Language</fo:block></fo:block></fo:list-item-body></fo:list-item></fo:list-block></fo:flow></fo:page-sequence></fo:root>
\ No newline at end of file
diff --git a/doc/org.eclipse.ocl.doc/doc/0000-introduction.textile b/doc/org.eclipse.ocl.doc/doc/0000-introduction.textile
index 0020062..582d84b 100644
--- a/doc/org.eclipse.ocl.doc/doc/0000-introduction.textile
+++ b/doc/org.eclipse.ocl.doc/doc/0000-introduction.textile
@@ -2,7 +2,7 @@
 
 For a quick demonstration of OCL enrichment of an Ecore meta-model with computed constraints go to "Getting Started":#GettingStarted.
 
-A PDF version of this documentation is available at "OCL 2021-03 (6.14.0) Documentation":http://download.eclipse.org/ocl/doc/6.14.0/ocl.pdf.
+A PDF version of this documentation is available at "OCL 2021-06 (6.15.0) Documentation":http://download.eclipse.org/ocl/doc/6.15.0/ocl.pdf.
 
 h2. What is OCL?
 
diff --git a/doc/org.eclipse.ocl.doc/doc/4100-oclinecore-tutorial.textile b/doc/org.eclipse.ocl.doc/doc/4100-oclinecore-tutorial.textile
index ded2901..a8e8973 100644
--- a/doc/org.eclipse.ocl.doc/doc/4100-oclinecore-tutorial.textile
+++ b/doc/org.eclipse.ocl.doc/doc/4100-oclinecore-tutorial.textile
@@ -1,8 +1,8 @@
 
 h2(#OCLinEcoreTutorial). OCLinEcore tutorial
 
-This tutorial has been updated for Eclipse Mars; Eclipse 4.5, EMF 2.11, OCL 6.0.
-* Some screenshots may be slightly out of date.
+This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.
+* The graphical styling of some screenshots may be slightly out of date.
 
 h3. Overview 
 
@@ -76,6 +76,30 @@
 
 Left-click on *Finish*.
 
+h4. Convert to an OCL Project
+
+An OCL project, analogously to many other Eclipse projects, has an OCL nature and an OCL builder that compile OCL resources so that any problems are shown as error/warning/info markers in the *Problems View*.
+
+The OCL nature may be added to our project by right-clicking on the project and then invoking *Configure->Convert to OCL Project* from the context menu.
+
+!{width:60%}images/4100-convert_to_ocl_project.png(Conbert to OCL Project)!
+
+* The OCL nature may be removed by *Configure->Unconfigure OCL*.
+
+Adding the OCL nature makes the project also-an-OCL-project. It does not displace any other natures that the project already has.
+
+It is not necessary to add the OCL nature, but if you omit this step, every time you open an OCL editor, a pop-up will offer to add the OCL nature for you.
+
+bq.. 
+The EMF and UML2 projects do not provide corresponding natures to validate *.ecore or *.uml files. This would leave any OCL embedded in Ecore or UML unchecked and the user unaware of problems. The OCL nature therefore validates *.ecore or *.uml files as well as OCL files by default. This default can be adjusted by editing the value of the enabledExtensions in the .project file.
+p. 
+
+!{width:60%}images/4100-project-commands.png(Project Commands)!
+
+bq.. 
+If you cannot see files such as *.project*, open the *View* menu by clicking the top right tool bar icon of the *Package Explorer* and enable visibility of .resources in the *Filters*.
+p. 
+
 h4. Create a New Ecore Model
 
 We will now create a new model for this example.
@@ -189,17 +213,14 @@
 !{width:60%}images/4100-create_dynamic_instance_dialog.png(Create Dynamic Instance Dialog)!
 
 The model is automatically opened for editing. 
-If it is does not open with the Sample Reflective Ecore Model Editor,
-close the editor and open explicitly using *Open With->Sample Reflective Ecore Model Editor).
-This gives a tree-like presentation of the model. The properties of each node can
-be seen in the Properties View.
+
+* If it is does not open with the Sample Reflective Ecore Model Editor, close the editor and open explicitly using *Open With->Sample Reflective Ecore Model Editor*. This gives a tree-like presentation of the model. The properties of each node can be seen in the Properties View.
 
 !{width:60%}images/4100-initial_model.png(Initial Model)!
 
-(If the Properties View is not visible, right-click within the editor and left-click on
-*Show Properties View*.)
+* If the Properties View is not visible, right-click within the editor and left-click on *Show Properties View*.
 
-Select the Library and use give it a name such as @lib@.
+Select the @Library@ and give it a name such as @lib@.
 
 From the right-button menu for @Library@ use *New Child->Books Book* twice,
 use *New Child->Loans Loan* once and *New Child->Members Member* three times
@@ -222,6 +243,10 @@
 validate that this by right-clicking on the @Library@ node, and left-clicking
 to *Validate* @Library@ and all its children.
 
+bq.. 
+Beware. If you have installed WST for web support, or M2E for Maven support, there is a rival *Validate* with a checkbox near the bottom of the menu. It does not appear to do anything useful for EMF-based models. The correct *Validate* is the one just above *Live Validation*.
+p. 
+
 !{width:60%}images/4100-validate_menu.png(Validate Menu)!
 
 Since the model is so simple, it is difficult to have anything wrong; most of
@@ -230,10 +255,7 @@
 
 !{width:60%}images/4100-validation_successful.png(Validation Successful)!
 
-(If you have an error at this point, a *Details* button will lead you to some
-diagnostics that may clarify the problem. Pasting the following XMI 
-into *Tutorial.xmi* should also
-resolve an entry problem.)
+* If you have an error at this point, a *Details* button will lead you to some diagnostics that may clarify the problem. Pasting the following XMI into *Tutorial.xmi* should also resolve an entry problem.
 
 bc.. 
 <?xml version="1.0" encoding="ASCII"?>
@@ -262,7 +284,7 @@
 
 h3. Enrich the meta-model with OCL
 
-The semantic constraint that a book cannot be borrowed more times than there are books
+The semantic constraint that a book cannot be borrowed more times than there are copies of the book
 is a simple example of a constraint that cannot be expressed by simple multiplicities; 
 a more powerful capability is required that may potentially require evaluation
 of functions of almost arbitrary complexity. The Object Constraint Language
@@ -286,9 +308,9 @@
 * @->size()@ is a collection operation that just counts the number of selected loans
 * @<= copies@, which is short for @<= self.copies@ converts the count to @true@ if it is consistent, or @false@ if inconsistent.
 
-(it used to be necessary to close the *Tutorial.xmi* editor before modifying its meta-model since
+* it used to be necessary to close an XML editor such as *Tutorial.xmi* before modifying its meta-model since
 a wide variety of unpleasant errors could occur if the meta-model changes after the model is loaded.
-This EMF limitation now appears to have been resolved.)
+This EMF limitation now appears to have been resolved. It is nonetheless prudent to do so.
 
 Add the invariant shown below to the meta-model.
 
@@ -306,7 +328,7 @@
 The *Details* identifies that the @SufficientCopies@ invariant is not
 satisfied for the @b2@ book.
 
-Alternatively you may invoke *Live Validation* so that validation happens automatically with
+Alternatively you may enable *Live Validation* so that validation happens automatically with
 error icons and hover text identifying problems.
 
 If you now change the first loan so that @b1@ is borrowed and then validate
@@ -345,10 +367,11 @@
 displays results. The lower pane supports entry of queries.
 
 Left-click to select the @Library@ in the *Tutorial.xmi* as the context
-for a query, and then type @books@ followed by a new line into the lower
-pane of the console. 
+for a query. The title of the console view shows the that the @Library@ has been selected as OCL's @self@ .
 
-The result of evaluating this query for the Library is shown.
+Type @books@ followed by a new line into the lower pane of the console. 
+
+The result of evaluating this query for the @Library@ is shown.
 
 !{width:60%}images/4100-books_query.png(Books Query)!
 
@@ -371,8 +394,7 @@
 !{width:70%}images/4100-metamodel3.png(Example Metamodel with Features)!
 "[Text for cut and paste]":../references/4100-metamodel3.oclinecore
 
-Note that the derived property must also be volatile to avoid problems when
-a model is loaded but has no content.
+* Note that the derived property must also be volatile to avoid problems when a model is loaded but has no content.
 
 Reopen *Tutorial.xmi* and select *Book b2* so that the derived property is visible in the *Properties* view.
 
@@ -385,7 +407,7 @@
 We will now add further helpers and constraints to enforce an
 at most two loans per member policy and to require loans to be unique.
 
-(It is prudent, but perhaps no longer necessary, to close *Tutorial.xmi* and the Console while changing the meta-model.)
+* It is prudent, but perhaps no longer necessary, to close *Tutorial.xmi* and the Console while changing the meta-model.
 
 !{width:70%}images/4100-metamodel4.png(Example Metamodel with More Features)!
 "[Text for cut and paste]":../references/4100-metamodel4.oclinecore
@@ -401,12 +423,20 @@
 h3(#OCLinEcoreTutorial-genmodel). Generating Java Code
 
 We have shown how OCL may be used to enrich Ecore meta-models, how model instances can be created
-and validated and how expressions can be evaluated, all without generating any Java code.
+and validated and how expressions can be evaluated, all without generating any Java code. The OCLinEcore support
+provides the requisite Ecore EAnnotations to ensure that the dynamic execution of EMF activates an OCL
+interpreter where OCL functionality is required.
 
-Exactly the same facilities are available if you do generate Java code and as a result you gain some speed benefits. By default, in the Eclipse OCL 6.4.0 (Photon) release the generated Java code for OCL is interpreted and so the speed gains occur only for the EMF models.
-In the "Code Generation Tutorial":#CodeGenerationTutorial, a preliminary release of 
-the OCL to Java code generator is described, giving an approximately five-fold speed improvement
-and eliminating the need for run-time compilation.
+Exactly the same facilities are available if you generate Java code for the Ecore model and as a result you gain some speed benefits. You have two choices for the realization of the OCL embedded with Ecore models.
+
+* Generate Java code within the *Impl classes
+* Delete for interpretation at run-time
+
+The first newer approach takes longer to generate the model since the OCL is compiled to Java incurring parser overheads at compile-time. However the OCL runs approximately five times faster and has fewer dependencies since no parsing is necessary at run-time. This approach is described In the "Code Generation Tutorial":#CodeGenerationTutorial.
+
+The second older approach embeds the OCL in the Java as unparsed stings so that parsing occurs overheads at run-time. The generated Java is smaller since the executable Java for OCL is larger than uncompiled strings. 
+
+We continue here with the older approach for which delegation to yyje interpreter is selected as a root *Window->Preferences->OCL* relaization preference.
 
 Generating Java code is exactly the same as for any other EMF project. (Prior to EMF 2.8, there was one important difference; you must explicitly set *Operation Reflection* to true. The default for this changed to true in EMF 2.8.)
 
diff --git a/doc/org.eclipse.ocl.doc/doc/4300-complete-ocl-tutorial.textile b/doc/org.eclipse.ocl.doc/doc/4300-complete-ocl-tutorial.textile
index 1d31edc..30ab150 100644
--- a/doc/org.eclipse.ocl.doc/doc/4300-complete-ocl-tutorial.textile
+++ b/doc/org.eclipse.ocl.doc/doc/4300-complete-ocl-tutorial.textile
@@ -1,8 +1,8 @@
 
 h2(#CompleteOCLTutorial). Complete OCL tutorial
 
-This tutorial has been updated for Eclipse Mars: Eclipse 4.5, EMF 2.11, OCL 6.0.
-* Some screenshots may be slightly out of date.
+This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.
+* The graphical styling of some screenshots may be slightly out of date.
 
 h3. Overview 
 
diff --git a/doc/org.eclipse.ocl.doc/doc/4400-code-generation-tutorial.textile b/doc/org.eclipse.ocl.doc/doc/4400-code-generation-tutorial.textile
index 6cd6b9f..135c41e 100644
--- a/doc/org.eclipse.ocl.doc/doc/4400-code-generation-tutorial.textile
+++ b/doc/org.eclipse.ocl.doc/doc/4400-code-generation-tutorial.textile
@@ -1,10 +1,10 @@
 
 h2(#CodeGenerationTutorial). Code Generation tutorial
 
-This tutorial has been updated for Eclipse Mars: Eclipse 4.5, EMF 2.11, OCL 6.0.
-* Some screenshots may be slightly out of date.
+This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.
+* The graphical styling of some screenshots may be slightly out of date.
 
-The direct OCL to Java Code generator was a very experimental functionality for the Juno release. It has been substantially rewritten for Kepler. Some optimisations have been activated for Luna and Mars. 
+The direct OCL to Java Code generator has matured significantly from its experimental functionality for the Juno release. It is now the recommended approach. 
 
 In this tutorial we will continue the OCLinEcore tutorial and show how to get a direct Java representation of the Ecore model avoiding the need for run-time compilation.
 
@@ -20,7 +20,7 @@
 
 Whether to generate OCL as text strings for interpretation or to convert directly to Java is determined by the Code Generation Mode. This may be configured using  the project property or workspace preference as described in "Code Generation Mode":#CodeGenerationMode. So use *Window->Preferences->OCL* to change the *Realisation of OCL embedded in Ecore models* setting to *==Generate Java code in *Impl classes==*.
 
-Now open *Tutorial.genmodel*, select the root resource and invoke *Generate Model Code* to (re)generate the Java code. This will take somewhat longer as additional work items show that the OCL is being compiled and that Xtend templates are generating additional Java code.
+Now open *Tutorial.genmodel*, select the root @Tutorial@ resource and invoke *Generate Model Code* to (re)generate the Java code. This will take somewhat longer as additional work items show that the OCL is being compiled and that Xtend templates are generating additional Java code.
 
 bq.. 
 Note that you must close *Tutorial.genmodel* while changing the Code Generation Mode.
@@ -30,11 +30,15 @@
 
 That is all there is to it. Your model code is now 100% Java; no OCL parsing is needed at run-time. 
 
+bq.. 
+If you see errors related to undefined ...__DIAGNOSTICCHAIN_MAP, you need tio edit your *.genmodel to make sure that the Model->Operation Reflection option on the overall GenModel is set true.
+p. 
+
 h3. Using a GenAnnotation
 
 Changing the default genmodel setting is a little dangerous since the change will affect any other genmodel activities you perform. It is therefore advisable to reset the workspace preference setting to its default and use a GenAnnotation to embed the setting in the genmodel.
 
-The easiest way to create the GenAnnotation that ensure direct code generation regardless of workspace or project preferences, is to paste the following three lines into your genmodel just above the @foreignModel@ or @genpackages@ element.
+The easiest way to create the GenAnnotation that ensure direct code generation regardless of workspace or project preferences, is to paste the following three lines into your genmodel just above the @foreignModel@ or @genPackages@ element.
 
 bc.. 
   <genAnnotations source="http://www.eclipse.org/OCL/GenModel">
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-books_query.png b/doc/org.eclipse.ocl.doc/doc/images/4100-books_query.png
index b84873d..8cda785 100644
--- a/doc/org.eclipse.ocl.doc/doc/images/4100-books_query.png
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-books_query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-convert_to_ocl_project.png b/doc/org.eclipse.ocl.doc/doc/images/4100-convert_to_ocl_project.png
new file mode 100644
index 0000000..bd6abe2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-convert_to_ocl_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-empty_ecore.png b/doc/org.eclipse.ocl.doc/doc/images/4100-empty_ecore.png
index 12c03d1..958952f 100644
--- a/doc/org.eclipse.ocl.doc/doc/images/4100-empty_ecore.png
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-empty_ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-new_ecore_model_dialog.png b/doc/org.eclipse.ocl.doc/doc/images/4100-new_ecore_model_dialog.png
index 7160595..3c3a6b3 100644
--- a/doc/org.eclipse.ocl.doc/doc/images/4100-new_ecore_model_dialog.png
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-new_ecore_model_dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-new_empty_emf_project.png b/doc/org.eclipse.ocl.doc/doc/images/4100-new_empty_emf_project.png
index 141f2c9..05effad 100644
--- a/doc/org.eclipse.ocl.doc/doc/images/4100-new_empty_emf_project.png
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-new_empty_emf_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-project-commands.png b/doc/org.eclipse.ocl.doc/doc/images/4100-project-commands.png
new file mode 100644
index 0000000..0ecf3c9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-project-commands.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/doc/images/4100-validate_menu.png b/doc/org.eclipse.ocl.doc/doc/images/4100-validate_menu.png
index 9bc0a16..64303f8 100644
--- a/doc/org.eclipse.ocl.doc/doc/images/4100-validate_menu.png
+++ b/doc/org.eclipse.ocl.doc/doc/images/4100-validate_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/CompleteOCLTutorial.html b/doc/org.eclipse.ocl.doc/help/CompleteOCLTutorial.html
index 8c76c27..afaeaa3 100644
--- a/doc/org.eclipse.ocl.doc/help/CompleteOCLTutorial.html
+++ b/doc/org.eclipse.ocl.doc/help/CompleteOCLTutorial.html
@@ -166,7 +166,7 @@
 </div>

 <p>The import statement is a serious omission from the OMG specification, since without it, any attempt to

 						align the Complete OCL constraints with external models relies on implementation-specific magic. The import

-						statement is therefore an Eclipse OCL extension that is likely to be part of a future OCL specification revision.</p>

+						statement is therefore an extension that the Pivot-based Eclipse OCL prototypes for a future OCL specification revision.</p>

 <p>Zero or more import statements may be present to specify the URIs of external model elements and optionally

 						alias names for those elements. In the example:</p>

 <div class="literallayout">

@@ -194,7 +194,7 @@
 <p>Prior to the Juno release, import statements were not understood and so there was a usage conflict between Pivot and Ecore/UML bindings. Preparation of a

 							Complete OCL document using the Xtext editor, or usage with Pivot model and Xtext parser required import statements.

 							But re-use with the Ecore and UML LPG parser required the import statements to be removed.</p>

-<p>In Juno, the LPG parser ignores the import statements, so they may be left in.</p>

+<p>Since Juno, the LPG parser ignores the import statements, so they may be left in.</p>

 </blockquote>

 </div>

 <p></p>

@@ -419,7 +419,7 @@
 </blockquote>

 </div>

 <p></p>

-<p>In Mars, suitable applications are</p>

+<p>Since Mars, suitable applications are</p>

 <div class="itemizedlist">

 <ul class="itemizedlist" type="disc">

 <li class="listitem">

diff --git a/doc/org.eclipse.ocl.doc/help/ContentAssistSupport.html b/doc/org.eclipse.ocl.doc/help/ContentAssistSupport.html
index 6adf3c3..516264d 100644
--- a/doc/org.eclipse.ocl.doc/help/ContentAssistSupport.html
+++ b/doc/org.eclipse.ocl.doc/help/ContentAssistSupport.html
@@ -103,7 +103,7 @@
 					<code class="code">Choice</code> s is supported for the

 					following tokens, which may be used by a client as auto-assist triggers:

 				</p>

-<table id="N14DF1">

+<table id="N14E78">

 <tr>

 						

 <th>Token</th>

diff --git a/doc/org.eclipse.ocl.doc/help/OverviewandGettingStarted.html b/doc/org.eclipse.ocl.doc/help/OverviewandGettingStarted.html
index 13421f4..42fcc23 100644
--- a/doc/org.eclipse.ocl.doc/help/OverviewandGettingStarted.html
+++ b/doc/org.eclipse.ocl.doc/help/OverviewandGettingStarted.html
@@ -46,7 +46,7 @@
 			<a class="link" href="GettingStarted.html" title="Getting Started">Getting Started</a>.

 		</p>

 <p>A PDF version of this documentation is available at 

-			<a class="ulink" href="http://download.eclipse.org/ocl/doc/6.14.0/ocl.pdf" target="_new">OCL 2021-03 (6.14.0) Documentation</a>.

+			<a class="ulink" href="http://download.eclipse.org/ocl/doc/6.15.0/ocl.pdf" target="_new">OCL 2021-06 (6.15.0) Documentation</a>.

 		</p>

 <div class="section" title="What is OCL?">

 <div class="titlepage">

diff --git a/doc/org.eclipse.ocl.doc/help/PivotEvaluatingConstraints.html b/doc/org.eclipse.ocl.doc/help/PivotEvaluatingConstraints.html
index b2a52f0..8c2b6fe 100644
--- a/doc/org.eclipse.ocl.doc/help/PivotEvaluatingConstraints.html
+++ b/doc/org.eclipse.ocl.doc/help/PivotEvaluatingConstraints.html
@@ -171,7 +171,7 @@
 </li>

 </ul>

 </div>

-<table id="N15ADB">

+<table id="N15B62">

 <tr>

 						

 <th>OCL</th>

diff --git a/doc/org.eclipse.ocl.doc/help/TargetMetamodels.html b/doc/org.eclipse.ocl.doc/help/TargetMetamodels.html
index 3add969..2a3f121 100644
--- a/doc/org.eclipse.ocl.doc/help/TargetMetamodels.html
+++ b/doc/org.eclipse.ocl.doc/help/TargetMetamodels.html
@@ -68,7 +68,7 @@
 					<code class="code">EcoreEnvironmentFactory.INSTANCE</code> is most practical.

 				</p>

 <p>The Ecore binding for OCL provides the following capabilities, reflecting the subset of Ecore&rsquo;s modeling constructs with respect to UML:</p>

-<table id="N14A3D">

+<table id="N14AC4">

 <tr>

 						

 <th>Capability</th>

@@ -293,7 +293,7 @@
 					<code class="code">EPackage</code> names corresponding to UML models.  A custom package registry may be provided by the client if necessary.

 				</p>

 <p>The UML binding for OCL provides the following capabilities:</p>

-<table id="N14BF2">

+<table id="N14C79">

 <tr>

 						

 <th>Capability</th>

diff --git a/doc/org.eclipse.ocl.doc/help/Tutorials.html b/doc/org.eclipse.ocl.doc/help/Tutorials.html
index cb9a919..7091b58 100644
--- a/doc/org.eclipse.ocl.doc/help/Tutorials.html
+++ b/doc/org.eclipse.ocl.doc/help/Tutorials.html
@@ -105,11 +105,11 @@
 </div>

 </div>

 </div>

-<p>This tutorial has been updated for Eclipse Mars; Eclipse 4.5, EMF 2.11, OCL 6.0.</p>

+<p>This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.</p>

 <div class="itemizedlist">

 <ul class="itemizedlist" type="disc">

 <li class="listitem">

-<p>Some screenshots may be slightly out of date.</p>

+<p>The graphical styling of some screenshots may be slightly out of date.</p>

 </li>

 </ul>

 </div>

@@ -307,6 +307,68 @@
 						<span class="bold"><strong>Finish</strong></span>.

 					</p>

 </div>

+<div class="section" title="Convert to an OCL Project">

+<div class="titlepage">

+<div>

+<div>

+<h4 class="title">

+<a name="ConverttoanOCLProject"></a>Convert to an OCL Project</h4>

+</div>

+</div>

+</div>

+<p>An OCL project, analogously to many other Eclipse projects, has an OCL nature and an OCL builder that compile OCL resources so that any problems are shown as error/warning/info markers in the 

+						<span class="bold"><strong>Problems View</strong></span>.

+					</p>

+<p>The OCL nature may be added to our project by right-clicking on the project and then invoking 

+						<span class="bold"><strong>Configure-&gt;Convert to OCL Project</strong></span> from the context menu.

+					</p>

+<p>

+						

+</p>

+<div class="mediaobject">

+<img src="images/4100-convert_to_ocl_project.png"></div>

+<p>

+					

+</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>The OCL nature may be removed by 

+								<span class="bold"><strong>Configure-&gt;Unconfigure OCL</strong></span>.

+							</p>

+</li>

+</ul>

+</div>

+<p>Adding the OCL nature makes the project also-an-OCL-project. It does not displace any other natures that the project already has.</p>

+<p>It is not necessary to add the OCL nature, but if you omit this step, every time you open an OCL editor, a pop-up will offer to add the OCL nature for you.</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+							The EMF and UML2 projects do not provide corresponding natures to validate *.ecore or *.uml files. This would leave any OCL embedded in Ecore or UML unchecked and the user unaware of problems. The OCL nature therefore validates *.ecore or *.uml files as well as OCL files by default. This default can be adjusted by editing the value of the enabledExtensions in the .project file.</p>

+</blockquote>

+</div>

+<p></p>

+<p>

+						

+</p>

+<div class="mediaobject">

+<img src="images/4100-project-commands.png"></div>

+<p>

+					

+</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+							If you cannot see files such as 

+							<span class="bold"><strong>.project</strong></span>, open the 

+							<span class="bold"><strong>View</strong></span> menu by clicking the top right tool bar icon of the 

+							<span class="bold"><strong>Package Explorer</strong></span> and enable visibility of .resources in the 

+							<span class="bold"><strong>Filters</strong></span>.

+						</p>

+</blockquote>

+</div>

+<p></p>

+</div>

 <div class="section" title="Create a New Ecore Model">

 <div class="titlepage">

 <div>

@@ -592,11 +654,16 @@
 <p>

 				

 </p>

-<p>The model is automatically opened for editing. 

-					If it is does not open with the Sample Reflective Ecore Model Editor,

-					close the editor and open explicitly using *Open With-&gt;Sample Reflective Ecore Model Editor).

-					This gives a tree-like presentation of the model. The properties of each node can

-					be seen in the Properties View.</p>

+<p>The model is automatically opened for editing. </p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If it is does not open with the Sample Reflective Ecore Model Editor, close the editor and open explicitly using 

+							<span class="bold"><strong>Open With-&gt;Sample Reflective Ecore Model Editor</strong></span>. This gives a tree-like presentation of the model. The properties of each node can be seen in the Properties View.

+						</p>

+</li>

+</ul>

+</div>

 <p>

 					

 </p>

@@ -605,11 +672,17 @@
 <p>

 				

 </p>

-<p>(If the Properties View is not visible, right-click within the editor and left-click on

-

-					<span class="bold"><strong>Show Properties View</strong></span>.)

-				</p>

-<p>Select the Library and use give it a name such as 

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If the Properties View is not visible, right-click within the editor and left-click on 

+							<span class="bold"><strong>Show Properties View</strong></span>.

+						</p>

+</li>

+</ul>

+</div>

+<p>Select the 

+					<code class="code">Library</code> and give it a name such as 

 					<code class="code">lib</code>.

 				</p>

 <p>From the right-button menu for 

@@ -656,6 +729,17 @@
 					<span class="bold"><strong>Validate</strong></span> 

 					<code class="code">Library</code> and all its children.

 				</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+						Beware. If you have installed WST for web support, or M2E for Maven support, there is a rival 

+						<span class="bold"><strong>Validate</strong></span> with a checkbox near the bottom of the menu. It does not appear to do anything useful for EMF-based models. The correct 

+						<span class="bold"><strong>Validate</strong></span> is the one just above 

+						<span class="bold"><strong>Live Validation</strong></span>.

+					</p>

+</blockquote>

+</div>

+<p></p>

 <p>

 					

 </p>

@@ -675,13 +759,16 @@
 <p>

 				

 </p>

-<p>(If you have an error at this point, a 

-					<span class="bold"><strong>Details</strong></span> button will lead you to some

-					diagnostics that may clarify the problem. Pasting the following XMI 

-					into 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> should also

-					resolve an entry problem.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If you have an error at this point, a 

+							<span class="bold"><strong>Details</strong></span> button will lead you to some diagnostics that may clarify the problem. Pasting the following XMI into 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> should also resolve an entry problem.

+						</p>

+</li>

+</ul>

+</div>

 <div class="literallayout">

 <p>

 <code class="code">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ASCII"?&gt;<br>

@@ -725,7 +812,7 @@
 </div>

 </div>

 </div>

-<p>The semantic constraint that a book cannot be borrowed more times than there are books

+<p>The semantic constraint that a book cannot be borrowed more times than there are copies of the book

 					is a simple example of a constraint that cannot be expressed by simple multiplicities; 

 					a more powerful capability is required that may potentially require evaluation

 					of functions of almost arbitrary complexity. The Object Constraint Language

@@ -795,11 +882,17 @@
 </li>

 </ul>

 </div>

-<p>Close the 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> editor before modifying its meta-model. (Beware that

-					a wide variety of unpleasant errors can occur if the meta-model is changed after

-					the model is loaded.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>it used to be necessary to close an XML editor such as 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> before modifying its meta-model since

+						</p>

+</li>

+</ul>

+</div>

+<p>a wide variety of unpleasant errors could occur if the meta-model changes after the model is loaded.

+					This EMF limitation now appears to have been resolved. It is nonetheless prudent to do so.</p>

 <p>Add the invariant shown below to the meta-model.</p>

 <p>

 					

@@ -837,7 +930,7 @@
 					satisfied for the 

 					<code class="code">b2</code> book.

 				</p>

-<p>Alternatively you may invoke 

+<p>Alternatively you may enable 

 					<span class="bold"><strong>Live Validation</strong></span> so that validation happens automatically with

 					error icons and hover text identifying problems.

 				</p>

@@ -911,11 +1004,16 @@
 <p>Left-click to select the 

 					<code class="code">Library</code> in the 

 					<span class="bold"><strong>Tutorial.xmi</strong></span> as the context

-					for a query, and then type 

-					<code class="code">books</code> followed by a new line into the lower

-					pane of the console. 

+					for a query. The title of the console view shows the that the 

+					<code class="code">Library</code> has been selected as OCL&rsquo;s 

+					<code class="code">self</code> .

 				</p>

-<p>The result of evaluating this query for the Library is shown.</p>

+<p>Type 

+					<code class="code">books</code> followed by a new line into the lower pane of the console. 

+				</p>

+<p>The result of evaluating this query for the 

+					<code class="code">Library</code> is shown.

+				</p>

 <p>

 					

 </p>

@@ -967,8 +1065,13 @@
 <a class="ulink" href="../references/4100-metamodel3.oclinecore" target="_new">[Text for cut and paste]</a>

 				

 </p>

-<p>Note that the derived property must also be volatile to avoid problems when

-					a model is loaded but has no content.</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>Note that the derived property must also be volatile to avoid problems when a model is loaded but has no content.</p>

+</li>

+</ul>

+</div>

 <p>Reopen 

 					<span class="bold"><strong>Tutorial.xmi</strong></span> and select 

 					<span class="bold"><strong>Book b2</strong></span> so that the derived property is visible in the 

@@ -983,9 +1086,9 @@
 				

 </p>

 <p>The helper operation can be evaluated in the 

-					<span class="bold"><strong>Console</strong></span> view, after closing and reopening, by selecting book 

+					<span class="bold"><strong>Console</strong></span> view by selecting book 

 					<code class="code">b2</code> and typing 

-					<code class="code">isAvailable()</code> for execution.

+					<code class="code">isAvailable()</code> for execution. (It is no longer necessary to close and reopen the Console after a metamodel change.)

 				</p>

 <p>

 					

@@ -997,9 +1100,15 @@
 </p>

 <p>We will now add further helpers and constraints to enforce an

 					at most two loans per member policy and to require loans to be unique.</p>

-<p>(Don&rsquo;t forget to close 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> while changing its meta-model.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>It is prudent, but perhaps no longer necessary, to close 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> and the Console while changing the meta-model.

+						</p>

+</li>

+</ul>

+</div>

 <p>

 					

 </p>

@@ -1039,12 +1148,26 @@
 </div>

 </div>

 <p>We have shown how OCL may be used to enrich Ecore meta-models, how model instances can be created

-					and validated and how expressions can be evaluated, all without generating any Java code.</p>

-<p>Exactly the same facilities are available if you do generate Java code and as a result you gain some speed benefits. By default, in the Eclipse OCL 6.4.0 (Photon) release the generated Java code for OCL is interpreted and so the speed gains occur only for the EMF models.

-					In the 

-					<a class="link" href="CodeGenerationTutorial.html" title="Code Generation tutorial">Code Generation Tutorial</a>, a preliminary release of 

-					the OCL to Java code generator is described, giving an approximately five-fold speed improvement

-					and eliminating the need for run-time compilation.

+					and validated and how expressions can be evaluated, all without generating any Java code. The OCLinEcore support

+					provides the requisite Ecore EAnnotations to ensure that the dynamic execution of EMF activates an OCL

+					interpreter where OCL functionality is required.</p>

+<p>Exactly the same facilities are available if you generate Java code for the Ecore model and as a result you gain some speed benefits. You have two choices for the realization of the OCL embedded with Ecore models.</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>Generate Java code within the *Impl classes</p>

+</li>

+<li class="listitem">

+<p>Delete for interpretation at run-time</p>

+</li>

+</ul>

+</div>

+<p>The first newer approach takes longer to generate the model since the OCL is compiled to Java incurring parser overheads at compile-time. However the OCL runs approximately five times faster and has fewer dependencies since no parsing is necessary at run-time. This approach is described In the 

+					<a class="link" href="CodeGenerationTutorial.html" title="Code Generation tutorial">Code Generation Tutorial</a>.

+				</p>

+<p>The second older approach embeds the OCL in the Java as unparsed stings so that parsing occurs overheads at run-time. The generated Java is smaller since the executable Java for OCL is larger than uncompiled strings. </p>

+<p>We continue here with the older approach for which delegation to yyje interpreter is selected as a root 

+					<span class="bold"><strong>Window-&gt;Preferences-&gt;OCL</strong></span> relaization preference.

 				</p>

 <p>Generating Java code is exactly the same as for any other EMF project. (Prior to EMF 2.8, there was one important difference; you must explicitly set 

 					<span class="bold"><strong>Operation Reflection</strong></span> to true. The default for this changed to true in EMF 2.8.)

diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-books_query.png b/doc/org.eclipse.ocl.doc/help/images/4100-books_query.png
index b84873d..8cda785 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4100-books_query.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-books_query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-convert_to_ocl_project.png b/doc/org.eclipse.ocl.doc/help/images/4100-convert_to_ocl_project.png
new file mode 100644
index 0000000..bd6abe2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-convert_to_ocl_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-empty_ecore.png b/doc/org.eclipse.ocl.doc/help/images/4100-empty_ecore.png
index 12c03d1..958952f 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4100-empty_ecore.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-empty_ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-new_ecore_model_dialog.png b/doc/org.eclipse.ocl.doc/help/images/4100-new_ecore_model_dialog.png
index 7160595..3c3a6b3 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4100-new_ecore_model_dialog.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-new_ecore_model_dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-new_empty_emf_project.png b/doc/org.eclipse.ocl.doc/help/images/4100-new_empty_emf_project.png
index 141f2c9..05effad 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4100-new_empty_emf_project.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-new_empty_emf_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-project-commands.png b/doc/org.eclipse.ocl.doc/help/images/4100-project-commands.png
new file mode 100644
index 0000000..0ecf3c9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-project-commands.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4100-validate_menu.png b/doc/org.eclipse.ocl.doc/help/images/4100-validate_menu.png
index 9bc0a16..64303f8 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4100-validate_menu.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4100-validate_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/help/images/4300-complete-ocl-tutorial-project.png b/doc/org.eclipse.ocl.doc/help/images/4300-complete-ocl-tutorial-project.png
index ea04517..d915677 100644
--- a/doc/org.eclipse.ocl.doc/help/images/4300-complete-ocl-tutorial-project.png
+++ b/doc/org.eclipse.ocl.doc/help/images/4300-complete-ocl-tutorial-project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-books_query.png b/doc/org.eclipse.ocl.doc/html/images/4100-books_query.png
index b84873d..8cda785 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4100-books_query.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-books_query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-convert_to_ocl_project.png b/doc/org.eclipse.ocl.doc/html/images/4100-convert_to_ocl_project.png
new file mode 100644
index 0000000..bd6abe2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-convert_to_ocl_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-empty_ecore.png b/doc/org.eclipse.ocl.doc/html/images/4100-empty_ecore.png
index 12c03d1..958952f 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4100-empty_ecore.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-empty_ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-new_ecore_model_dialog.png b/doc/org.eclipse.ocl.doc/html/images/4100-new_ecore_model_dialog.png
index 7160595..3c3a6b3 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4100-new_ecore_model_dialog.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-new_ecore_model_dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-new_empty_emf_project.png b/doc/org.eclipse.ocl.doc/html/images/4100-new_empty_emf_project.png
index 141f2c9..05effad 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4100-new_empty_emf_project.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-new_empty_emf_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-project-commands.png b/doc/org.eclipse.ocl.doc/html/images/4100-project-commands.png
new file mode 100644
index 0000000..0ecf3c9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-project-commands.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4100-validate_menu.png b/doc/org.eclipse.ocl.doc/html/images/4100-validate_menu.png
index 9bc0a16..64303f8 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4100-validate_menu.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4100-validate_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/images/4300-complete-ocl-tutorial-project.png b/doc/org.eclipse.ocl.doc/html/images/4300-complete-ocl-tutorial-project.png
index ea04517..d915677 100644
--- a/doc/org.eclipse.ocl.doc/html/images/4300-complete-ocl-tutorial-project.png
+++ b/doc/org.eclipse.ocl.doc/html/images/4300-complete-ocl-tutorial-project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/html/ocl.html b/doc/org.eclipse.ocl.doc/html/ocl.html
index b9117ac..1d553da 100644
--- a/doc/org.eclipse.ocl.doc/html/ocl.html
+++ b/doc/org.eclipse.ocl.doc/html/ocl.html
@@ -517,7 +517,7 @@
 			<a class="link" href="#GettingStarted" title="Getting Started">Getting Started</a>.

 		</p>

 <p>A PDF version of this documentation is available at 

-			<a class="ulink" href="http://download.eclipse.org/ocl/doc/6.14.0/ocl.pdf" target="_new">OCL 2021-03 (6.14.0) Documentation</a>.

+			<a class="ulink" href="http://download.eclipse.org/ocl/doc/6.15.0/ocl.pdf" target="_new">OCL 2021-06 (6.15.0) Documentation</a>.

 		</p>

 <div class="section" title="What is OCL?">

 <div class="titlepage">

@@ -12722,11 +12722,11 @@
 </div>

 </div>

 </div>

-<p>This tutorial has been updated for Eclipse Mars; Eclipse 4.5, EMF 2.11, OCL 6.0.</p>

+<p>This tutorial has been refreshed for Eclipse 2021-06; Eclipse 4.20, EMF 2.26, OCL 6.15.0.</p>

 <div class="itemizedlist">

 <ul class="itemizedlist" type="disc">

 <li class="listitem">

-<p>Some screenshots may be slightly out of date.</p>

+<p>The graphical styling of some screenshots may be slightly out of date.</p>

 </li>

 </ul>

 </div>

@@ -12924,6 +12924,68 @@
 						<span class="bold"><strong>Finish</strong></span>.

 					</p>

 </div>

+<div class="section" title="Convert to an OCL Project">

+<div class="titlepage">

+<div>

+<div>

+<h4 class="title">

+<a name="ConverttoanOCLProject"></a>Convert to an OCL Project</h4>

+</div>

+</div>

+</div>

+<p>An OCL project, analogously to many other Eclipse projects, has an OCL nature and an OCL builder that compile OCL resources so that any problems are shown as error/warning/info markers in the 

+						<span class="bold"><strong>Problems View</strong></span>.

+					</p>

+<p>The OCL nature may be added to our project by right-clicking on the project and then invoking 

+						<span class="bold"><strong>Configure-&gt;Convert to OCL Project</strong></span> from the context menu.

+					</p>

+<p>

+						

+</p>

+<div class="mediaobject">

+<img src="images/4100-convert_to_ocl_project.png"></div>

+<p>

+					

+</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>The OCL nature may be removed by 

+								<span class="bold"><strong>Configure-&gt;Unconfigure OCL</strong></span>.

+							</p>

+</li>

+</ul>

+</div>

+<p>Adding the OCL nature makes the project also-an-OCL-project. It does not displace any other natures that the project already has.</p>

+<p>It is not necessary to add the OCL nature, but if you omit this step, every time you open an OCL editor, a pop-up will offer to add the OCL nature for you.</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+							The EMF and UML2 projects do not provide corresponding natures to validate *.ecore or *.uml files. This would leave any OCL embedded in Ecore or UML unchecked and the user unaware of problems. The OCL nature therefore validates *.ecore or *.uml files as well as OCL files by default. This default can be adjusted by editing the value of the enabledExtensions in the .project file.</p>

+</blockquote>

+</div>

+<p></p>

+<p>

+						

+</p>

+<div class="mediaobject">

+<img src="images/4100-project-commands.png"></div>

+<p>

+					

+</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+							If you cannot see files such as 

+							<span class="bold"><strong>.project</strong></span>, open the 

+							<span class="bold"><strong>View</strong></span> menu by clicking the top right tool bar icon of the 

+							<span class="bold"><strong>Package Explorer</strong></span> and enable visibility of .resources in the 

+							<span class="bold"><strong>Filters</strong></span>.

+						</p>

+</blockquote>

+</div>

+<p></p>

+</div>

 <div class="section" title="Create a New Ecore Model">

 <div class="titlepage">

 <div>

@@ -13209,11 +13271,16 @@
 <p>

 				

 </p>

-<p>The model is automatically opened for editing. 

-					If it is does not open with the Sample Reflective Ecore Model Editor,

-					close the editor and open explicitly using *Open With-&gt;Sample Reflective Ecore Model Editor).

-					This gives a tree-like presentation of the model. The properties of each node can

-					be seen in the Properties View.</p>

+<p>The model is automatically opened for editing. </p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If it is does not open with the Sample Reflective Ecore Model Editor, close the editor and open explicitly using 

+							<span class="bold"><strong>Open With-&gt;Sample Reflective Ecore Model Editor</strong></span>. This gives a tree-like presentation of the model. The properties of each node can be seen in the Properties View.

+						</p>

+</li>

+</ul>

+</div>

 <p>

 					

 </p>

@@ -13222,11 +13289,17 @@
 <p>

 				

 </p>

-<p>(If the Properties View is not visible, right-click within the editor and left-click on

-

-					<span class="bold"><strong>Show Properties View</strong></span>.)

-				</p>

-<p>Select the Library and use give it a name such as 

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If the Properties View is not visible, right-click within the editor and left-click on 

+							<span class="bold"><strong>Show Properties View</strong></span>.

+						</p>

+</li>

+</ul>

+</div>

+<p>Select the 

+					<code class="code">Library</code> and give it a name such as 

 					<code class="code">lib</code>.

 				</p>

 <p>From the right-button menu for 

@@ -13273,6 +13346,17 @@
 					<span class="bold"><strong>Validate</strong></span> 

 					<code class="code">Library</code> and all its children.

 				</p>

+<div class="blockquote">

+<blockquote class="blockquote">

+<p>

+						Beware. If you have installed WST for web support, or M2E for Maven support, there is a rival 

+						<span class="bold"><strong>Validate</strong></span> with a checkbox near the bottom of the menu. It does not appear to do anything useful for EMF-based models. The correct 

+						<span class="bold"><strong>Validate</strong></span> is the one just above 

+						<span class="bold"><strong>Live Validation</strong></span>.

+					</p>

+</blockquote>

+</div>

+<p></p>

 <p>

 					

 </p>

@@ -13292,13 +13376,16 @@
 <p>

 				

 </p>

-<p>(If you have an error at this point, a 

-					<span class="bold"><strong>Details</strong></span> button will lead you to some

-					diagnostics that may clarify the problem. Pasting the following XMI 

-					into 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> should also

-					resolve an entry problem.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>If you have an error at this point, a 

+							<span class="bold"><strong>Details</strong></span> button will lead you to some diagnostics that may clarify the problem. Pasting the following XMI into 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> should also resolve an entry problem.

+						</p>

+</li>

+</ul>

+</div>

 <div class="literallayout">

 <p>

 <code class="code">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="ASCII"?&gt;<br>

@@ -13342,7 +13429,7 @@
 </div>

 </div>

 </div>

-<p>The semantic constraint that a book cannot be borrowed more times than there are books

+<p>The semantic constraint that a book cannot be borrowed more times than there are copies of the book

 					is a simple example of a constraint that cannot be expressed by simple multiplicities; 

 					a more powerful capability is required that may potentially require evaluation

 					of functions of almost arbitrary complexity. The Object Constraint Language

@@ -13412,11 +13499,17 @@
 </li>

 </ul>

 </div>

-<p>Close the 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> editor before modifying its meta-model. (Beware that

-					a wide variety of unpleasant errors can occur if the meta-model is changed after

-					the model is loaded.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>it used to be necessary to close an XML editor such as 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> before modifying its meta-model since

+						</p>

+</li>

+</ul>

+</div>

+<p>a wide variety of unpleasant errors could occur if the meta-model changes after the model is loaded.

+					This EMF limitation now appears to have been resolved. It is nonetheless prudent to do so.</p>

 <p>Add the invariant shown below to the meta-model.</p>

 <p>

 					

@@ -13454,7 +13547,7 @@
 					satisfied for the 

 					<code class="code">b2</code> book.

 				</p>

-<p>Alternatively you may invoke 

+<p>Alternatively you may enable 

 					<span class="bold"><strong>Live Validation</strong></span> so that validation happens automatically with

 					error icons and hover text identifying problems.

 				</p>

@@ -13528,11 +13621,16 @@
 <p>Left-click to select the 

 					<code class="code">Library</code> in the 

 					<span class="bold"><strong>Tutorial.xmi</strong></span> as the context

-					for a query, and then type 

-					<code class="code">books</code> followed by a new line into the lower

-					pane of the console. 

+					for a query. The title of the console view shows the that the 

+					<code class="code">Library</code> has been selected as OCL&rsquo;s 

+					<code class="code">self</code> .

 				</p>

-<p>The result of evaluating this query for the Library is shown.</p>

+<p>Type 

+					<code class="code">books</code> followed by a new line into the lower pane of the console. 

+				</p>

+<p>The result of evaluating this query for the 

+					<code class="code">Library</code> is shown.

+				</p>

 <p>

 					

 </p>

@@ -13584,8 +13682,13 @@
 <a class="ulink" href="../references/4100-metamodel3.oclinecore" target="_new">[Text for cut and paste]</a>

 				

 </p>

-<p>Note that the derived property must also be volatile to avoid problems when

-					a model is loaded but has no content.</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>Note that the derived property must also be volatile to avoid problems when a model is loaded but has no content.</p>

+</li>

+</ul>

+</div>

 <p>Reopen 

 					<span class="bold"><strong>Tutorial.xmi</strong></span> and select 

 					<span class="bold"><strong>Book b2</strong></span> so that the derived property is visible in the 

@@ -13600,9 +13703,9 @@
 				

 </p>

 <p>The helper operation can be evaluated in the 

-					<span class="bold"><strong>Console</strong></span> view, after closing and reopening, by selecting book 

+					<span class="bold"><strong>Console</strong></span> view by selecting book 

 					<code class="code">b2</code> and typing 

-					<code class="code">isAvailable()</code> for execution.

+					<code class="code">isAvailable()</code> for execution. (It is no longer necessary to close and reopen the Console after a metamodel change.)

 				</p>

 <p>

 					

@@ -13614,9 +13717,15 @@
 </p>

 <p>We will now add further helpers and constraints to enforce an

 					at most two loans per member policy and to require loans to be unique.</p>

-<p>(Don&rsquo;t forget to close 

-					<span class="bold"><strong>Tutorial.xmi</strong></span> while changing its meta-model.)

-				</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>It is prudent, but perhaps no longer necessary, to close 

+							<span class="bold"><strong>Tutorial.xmi</strong></span> and the Console while changing the meta-model.

+						</p>

+</li>

+</ul>

+</div>

 <p>

 					

 </p>

@@ -13656,12 +13765,26 @@
 </div>

 </div>

 <p>We have shown how OCL may be used to enrich Ecore meta-models, how model instances can be created

-					and validated and how expressions can be evaluated, all without generating any Java code.</p>

-<p>Exactly the same facilities are available if you do generate Java code and as a result you gain some speed benefits. By default, in the Eclipse OCL 6.4.0 (Photon) release the generated Java code for OCL is interpreted and so the speed gains occur only for the EMF models.

-					In the 

-					<a class="link" href="#CodeGenerationTutorial" title="Code Generation tutorial">Code Generation Tutorial</a>, a preliminary release of 

-					the OCL to Java code generator is described, giving an approximately five-fold speed improvement

-					and eliminating the need for run-time compilation.

+					and validated and how expressions can be evaluated, all without generating any Java code. The OCLinEcore support

+					provides the requisite Ecore EAnnotations to ensure that the dynamic execution of EMF activates an OCL

+					interpreter where OCL functionality is required.</p>

+<p>Exactly the same facilities are available if you generate Java code for the Ecore model and as a result you gain some speed benefits. You have two choices for the realization of the OCL embedded with Ecore models.</p>

+<div class="itemizedlist">

+<ul class="itemizedlist" type="disc">

+<li class="listitem">

+<p>Generate Java code within the *Impl classes</p>

+</li>

+<li class="listitem">

+<p>Delete for interpretation at run-time</p>

+</li>

+</ul>

+</div>

+<p>The first newer approach takes longer to generate the model since the OCL is compiled to Java incurring parser overheads at compile-time. However the OCL runs approximately five times faster and has fewer dependencies since no parsing is necessary at run-time. This approach is described In the 

+					<a class="link" href="#CodeGenerationTutorial" title="Code Generation tutorial">Code Generation Tutorial</a>.

+				</p>

+<p>The second older approach embeds the OCL in the Java as unparsed stings so that parsing occurs overheads at run-time. The generated Java is smaller since the executable Java for OCL is larger than uncompiled strings. </p>

+<p>We continue here with the older approach for which delegation to yyje interpreter is selected as a root 

+					<span class="bold"><strong>Window-&gt;Preferences-&gt;OCL</strong></span> relaization preference.

 				</p>

 <p>Generating Java code is exactly the same as for any other EMF project. (Prior to EMF 2.8, there was one important difference; you must explicitly set 

 					<span class="bold"><strong>Operation Reflection</strong></span> to true. The default for this changed to true in EMF 2.8.)

@@ -14074,7 +14197,7 @@
 </div>

 <p>The import statement is a serious omission from the OMG specification, since without it, any attempt to

 						align the Complete OCL constraints with external models relies on implementation-specific magic. The import

-						statement is therefore an Eclipse OCL extension that is likely to be part of a future OCL specification revision.</p>

+						statement is therefore an extension that the Pivot-based Eclipse OCL prototypes for a future OCL specification revision.</p>

 <p>Zero or more import statements may be present to specify the URIs of external model elements and optionally

 						alias names for those elements. In the example:</p>

 <div class="literallayout">

@@ -14102,7 +14225,7 @@
 <p>Prior to the Juno release, import statements were not understood and so there was a usage conflict between Pivot and Ecore/UML bindings. Preparation of a

 							Complete OCL document using the Xtext editor, or usage with Pivot model and Xtext parser required import statements.

 							But re-use with the Ecore and UML LPG parser required the import statements to be removed.</p>

-<p>In Juno, the LPG parser ignores the import statements, so they may be left in.</p>

+<p>Since Juno, the LPG parser ignores the import statements, so they may be left in.</p>

 </blockquote>

 </div>

 <p></p>

@@ -14327,7 +14450,7 @@
 </blockquote>

 </div>

 <p></p>

-<p>In Mars, suitable applications are</p>

+<p>Since Mars, suitable applications are</p>

 <div class="itemizedlist">

 <ul class="itemizedlist" type="disc">

 <li class="listitem">

@@ -18345,7 +18468,7 @@
 					<code class="code">EcoreEnvironmentFactory.INSTANCE</code> is most practical.

 				</p>

 <p>The Ecore binding for OCL provides the following capabilities, reflecting the subset of Ecore&rsquo;s modeling constructs with respect to UML:</p>

-<table id="N14A3D">

+<table id="N14AC4">

 <tr>

 						

 <th>Capability</th>

@@ -18570,7 +18693,7 @@
 					<code class="code">EPackage</code> names corresponding to UML models.  A custom package registry may be provided by the client if necessary.

 				</p>

 <p>The UML binding for OCL provides the following capabilities:</p>

-<table id="N14BF2">

+<table id="N14C79">

 <tr>

 						

 <th>Capability</th>

@@ -18880,7 +19003,7 @@
 					<code class="code">Choice</code> s is supported for the

 					following tokens, which may be used by a client as auto-assist triggers:

 				</p>

-<table id="N14DF1">

+<table id="N14E78">

 <tr>

 						

 <th>Token</th>

@@ -22365,7 +22488,7 @@
 </li>

 </ul>

 </div>

-<table id="N15ADB">

+<table id="N15B62">

 <tr>

 						

 <th>OCL</th>

diff --git a/doc/org.eclipse.ocl.doc/images/1100-binaryoperator.png b/doc/org.eclipse.ocl.doc/images/1100-binaryoperator.png
new file mode 100644
index 0000000..2debc58
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-binaryoperator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-booleanliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-booleanliteralexp.png
new file mode 100644
index 0000000..97bfe7f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-booleanliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-collectionliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-collectionliteralexp.png
new file mode 100644
index 0000000..ec56ba4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-collectionliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-collectionliteralpart.png b/doc/org.eclipse.ocl.doc/images/1100-collectionliteralpart.png
new file mode 100644
index 0000000..2b5a731
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-collectionliteralpart.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-collectiontype.png b/doc/org.eclipse.ocl.doc/images/1100-collectiontype.png
new file mode 100644
index 0000000..6341bef
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-collectiontype.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-exp.png b/doc/org.eclipse.ocl.doc/images/1100-exp.png
new file mode 100644
index 0000000..9b2124e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-exp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-ifexp.png b/doc/org.eclipse.ocl.doc/images/1100-ifexp.png
new file mode 100644
index 0000000..e14fe8a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-ifexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-indexexp1.png b/doc/org.eclipse.ocl.doc/images/1100-indexexp1.png
new file mode 100644
index 0000000..2e4687c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-indexexp1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-indexexp2.png b/doc/org.eclipse.ocl.doc/images/1100-indexexp2.png
new file mode 100644
index 0000000..60a86f5
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-indexexp2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-infixedexp.png b/doc/org.eclipse.ocl.doc/images/1100-infixedexp.png
new file mode 100644
index 0000000..55ea8c0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-infixedexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-infixoperator.png b/doc/org.eclipse.ocl.doc/images/1100-infixoperator.png
new file mode 100644
index 0000000..98a43f1
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-infixoperator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-invalidliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-invalidliteralexp.png
new file mode 100644
index 0000000..842e744
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-invalidliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-letexp.png b/doc/org.eclipse.ocl.doc/images/1100-letexp.png
new file mode 100644
index 0000000..8531f51
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-letexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-nameexp.png b/doc/org.eclipse.ocl.doc/images/1100-nameexp.png
new file mode 100644
index 0000000..fa9fcc0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-nameexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-navigatingarg.png b/doc/org.eclipse.ocl.doc/images/1100-navigatingarg.png
new file mode 100644
index 0000000..c4a2a5c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-navigatingarg.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-navigatingexp1.png b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp1.png
new file mode 100644
index 0000000..699d484
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-navigatingexp2.png b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp2.png
new file mode 100644
index 0000000..3fc681e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-navigatingexp3.png b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp3.png
new file mode 100644
index 0000000..de7d7d4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-navigatingexp3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-navigationoperator.png b/doc/org.eclipse.ocl.doc/images/1100-navigationoperator.png
new file mode 100644
index 0000000..998fef6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-navigationoperator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-nestedexp.png b/doc/org.eclipse.ocl.doc/images/1100-nestedexp.png
new file mode 100644
index 0000000..592a6ad
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-nestedexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-nullliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-nullliteralexp.png
new file mode 100644
index 0000000..42181db
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-nullliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-numberliteral.png b/doc/org.eclipse.ocl.doc/images/1100-numberliteral.png
new file mode 100644
index 0000000..f726e6f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-numberliteral.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-numberliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-numberliteralexp.png
new file mode 100644
index 0000000..930c53c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-numberliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-prefixedexp.png b/doc/org.eclipse.ocl.doc/images/1100-prefixedexp.png
new file mode 100644
index 0000000..a84623e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-prefixedexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-primaryexp.png b/doc/org.eclipse.ocl.doc/images/1100-primaryexp.png
new file mode 100644
index 0000000..59e5c0c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-primaryexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-primitiveliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-primitiveliteralexp.png
new file mode 100644
index 0000000..ef876a0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-primitiveliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-primitivetype.png b/doc/org.eclipse.ocl.doc/images/1100-primitivetype.png
new file mode 100644
index 0000000..4ad276e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-primitivetype.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-selfexp.png b/doc/org.eclipse.ocl.doc/images/1100-selfexp.png
new file mode 100644
index 0000000..59a2548
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-selfexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-stringliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-stringliteralexp.png
new file mode 100644
index 0000000..35391d8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-stringliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-tupleliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-tupleliteralexp.png
new file mode 100644
index 0000000..f05e798
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-tupleliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-tupleliteralpart.png b/doc/org.eclipse.ocl.doc/images/1100-tupleliteralpart.png
new file mode 100644
index 0000000..0789915
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-tupleliteralpart.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-tuplepart.png b/doc/org.eclipse.ocl.doc/images/1100-tuplepart.png
new file mode 100644
index 0000000..e320ae6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-tuplepart.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-tupletype.png b/doc/org.eclipse.ocl.doc/images/1100-tupletype.png
new file mode 100644
index 0000000..e3ffc27
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-tupletype.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-typeexp.png b/doc/org.eclipse.ocl.doc/images/1100-typeexp.png
new file mode 100644
index 0000000..d4b63b9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-typeexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-typeliteral.png b/doc/org.eclipse.ocl.doc/images/1100-typeliteral.png
new file mode 100644
index 0000000..c8c43d3
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-typeliteral.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-typeliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-typeliteralexp.png
new file mode 100644
index 0000000..09b40f1
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-typeliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-typenameexp.png b/doc/org.eclipse.ocl.doc/images/1100-typenameexp.png
new file mode 100644
index 0000000..abf1891
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-typenameexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-unaryoperator.png b/doc/org.eclipse.ocl.doc/images/1100-unaryoperator.png
new file mode 100644
index 0000000..d7c7d79
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-unaryoperator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1100-unlimitednaturalliteralexp.png b/doc/org.eclipse.ocl.doc/images/1100-unlimitednaturalliteralexp.png
new file mode 100644
index 0000000..2246313
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1100-unlimitednaturalliteralexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-annotation1.png b/doc/org.eclipse.ocl.doc/images/1200-annotation1.png
new file mode 100644
index 0000000..d7fa659
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-annotation1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-annotation2.png b/doc/org.eclipse.ocl.doc/images/1200-annotation2.png
new file mode 100644
index 0000000..fa5e2ad
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-annotation2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-annotation3.png b/doc/org.eclipse.ocl.doc/images/1200-annotation3.png
new file mode 100644
index 0000000..8e30d53
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-annotation3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-annotations.png b/doc/org.eclipse.ocl.doc/images/1200-annotations.png
new file mode 100644
index 0000000..8c9ceb4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-annotations.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-attribute1.png b/doc/org.eclipse.ocl.doc/images/1200-attribute1.png
new file mode 100644
index 0000000..37731b6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-attribute1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-attribute2.png b/doc/org.eclipse.ocl.doc/images/1200-attribute2.png
new file mode 100644
index 0000000..cbda1ee
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-attribute2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-attribute3.png b/doc/org.eclipse.ocl.doc/images/1200-attribute3.png
new file mode 100644
index 0000000..b098ccc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-attribute3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-attribute4.png b/doc/org.eclipse.ocl.doc/images/1200-attribute4.png
new file mode 100644
index 0000000..623898e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-attribute4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-class1.png b/doc/org.eclipse.ocl.doc/images/1200-class1.png
new file mode 100644
index 0000000..977fb9e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-class1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-class2.png b/doc/org.eclipse.ocl.doc/images/1200-class2.png
new file mode 100644
index 0000000..c98f422
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-class2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-class3.png b/doc/org.eclipse.ocl.doc/images/1200-class3.png
new file mode 100644
index 0000000..75211ed
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-class3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-class4.png b/doc/org.eclipse.ocl.doc/images/1200-class4.png
new file mode 100644
index 0000000..4e9e003
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-class4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-classifiers.png b/doc/org.eclipse.ocl.doc/images/1200-classifiers.png
new file mode 100644
index 0000000..0b61d72
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-classifiers.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-constraints.png b/doc/org.eclipse.ocl.doc/images/1200-constraints.png
new file mode 100644
index 0000000..c158974
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-constraints.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-datatype1.png b/doc/org.eclipse.ocl.doc/images/1200-datatype1.png
new file mode 100644
index 0000000..b9820fe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-datatype1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-datatype2.png b/doc/org.eclipse.ocl.doc/images/1200-datatype2.png
new file mode 100644
index 0000000..173d8f4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-datatype2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-detail.png b/doc/org.eclipse.ocl.doc/images/1200-detail.png
new file mode 100644
index 0000000..d20ba96
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-detail.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-documentation.png b/doc/org.eclipse.ocl.doc/images/1200-documentation.png
new file mode 100644
index 0000000..9cbf9f1
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-documentation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-enumeration1.png b/doc/org.eclipse.ocl.doc/images/1200-enumeration1.png
new file mode 100644
index 0000000..a53109f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-enumeration1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-enumeration2.png b/doc/org.eclipse.ocl.doc/images/1200-enumeration2.png
new file mode 100644
index 0000000..674a5ea
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-enumeration2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-enumerationliteral.png b/doc/org.eclipse.ocl.doc/images/1200-enumerationliteral.png
new file mode 100644
index 0000000..72a799c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-enumerationliteral.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-features.png b/doc/org.eclipse.ocl.doc/images/1200-features.png
new file mode 100644
index 0000000..a007fd8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-features.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-import.png b/doc/org.eclipse.ocl.doc/images/1200-import.png
new file mode 100644
index 0000000..7753c7b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-import.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-library.png b/doc/org.eclipse.ocl.doc/images/1200-library.png
new file mode 100644
index 0000000..6fb1c58
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-library.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation1.png b/doc/org.eclipse.ocl.doc/images/1200-operation1.png
new file mode 100644
index 0000000..a3c55bf
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation2.png b/doc/org.eclipse.ocl.doc/images/1200-operation2.png
new file mode 100644
index 0000000..7830f2a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation3.png b/doc/org.eclipse.ocl.doc/images/1200-operation3.png
new file mode 100644
index 0000000..ac6f7ae
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation4.png b/doc/org.eclipse.ocl.doc/images/1200-operation4.png
new file mode 100644
index 0000000..9c6dcd8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation5.png b/doc/org.eclipse.ocl.doc/images/1200-operation5.png
new file mode 100644
index 0000000..ce475d2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation5.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-operation6.png b/doc/org.eclipse.ocl.doc/images/1200-operation6.png
new file mode 100644
index 0000000..6f00a78
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-operation6.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-package1.png b/doc/org.eclipse.ocl.doc/images/1200-package1.png
new file mode 100644
index 0000000..ab41bec
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-package1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-package2.png b/doc/org.eclipse.ocl.doc/images/1200-package2.png
new file mode 100644
index 0000000..978e500
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-package2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-parameter1.png b/doc/org.eclipse.ocl.doc/images/1200-parameter1.png
new file mode 100644
index 0000000..a401b98
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-parameter1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-parameter2.png b/doc/org.eclipse.ocl.doc/images/1200-parameter2.png
new file mode 100644
index 0000000..bf8cda4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-parameter2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-reference1.png b/doc/org.eclipse.ocl.doc/images/1200-reference1.png
new file mode 100644
index 0000000..bb69de7
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-reference1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-reference2.png b/doc/org.eclipse.ocl.doc/images/1200-reference2.png
new file mode 100644
index 0000000..79c033f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-reference2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-reference3.png b/doc/org.eclipse.ocl.doc/images/1200-reference3.png
new file mode 100644
index 0000000..3a3498f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-reference3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-reference4.png b/doc/org.eclipse.ocl.doc/images/1200-reference4.png
new file mode 100644
index 0000000..3137816
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-reference4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-rootpackage.png b/doc/org.eclipse.ocl.doc/images/1200-rootpackage.png
new file mode 100644
index 0000000..e791415
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-rootpackage.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-templates.png b/doc/org.eclipse.ocl.doc/images/1200-templates.png
new file mode 100644
index 0000000..cd168ef
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-templates.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-terminals.png b/doc/org.eclipse.ocl.doc/images/1200-terminals.png
new file mode 100644
index 0000000..168dbfe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-terminals.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1200-types.png b/doc/org.eclipse.ocl.doc/images/1200-types.png
new file mode 100644
index 0000000..a3a664a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1200-types.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-body.png b/doc/org.eclipse.ocl.doc/images/1300-body.png
new file mode 100644
index 0000000..d221b43
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-body.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl1.png b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl1.png
new file mode 100644
index 0000000..ba3231b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl2.png b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl2.png
new file mode 100644
index 0000000..711ec26
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl3.png b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl3.png
new file mode 100644
index 0000000..505a030
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-classifiercontextdecl3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-contextdecl.png b/doc/org.eclipse.ocl.doc/images/1300-contextdecl.png
new file mode 100644
index 0000000..51cd6f7
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-contextdecl.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-def1.png b/doc/org.eclipse.ocl.doc/images/1300-def1.png
new file mode 100644
index 0000000..b45ef78
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-def1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-def2.png b/doc/org.eclipse.ocl.doc/images/1300-def2.png
new file mode 100644
index 0000000..0646d25
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-def2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-def3.png b/doc/org.eclipse.ocl.doc/images/1300-def3.png
new file mode 100644
index 0000000..0c02f1e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-def3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-der.png b/doc/org.eclipse.ocl.doc/images/1300-der.png
new file mode 100644
index 0000000..82fcdffe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-der.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-document.png b/doc/org.eclipse.ocl.doc/images/1300-document.png
new file mode 100644
index 0000000..2782093
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-document.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-import.png b/doc/org.eclipse.ocl.doc/images/1300-import.png
new file mode 100644
index 0000000..6cc0876
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-import.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-include.png b/doc/org.eclipse.ocl.doc/images/1300-include.png
new file mode 100644
index 0000000..53aba05
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-include.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-init.png b/doc/org.eclipse.ocl.doc/images/1300-init.png
new file mode 100644
index 0000000..2403313
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-init.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-inv.png b/doc/org.eclipse.ocl.doc/images/1300-inv.png
new file mode 100644
index 0000000..e770ff4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-inv.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-library.png b/doc/org.eclipse.ocl.doc/images/1300-library.png
new file mode 100644
index 0000000..3653d49
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-library.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-navigatingarg.png b/doc/org.eclipse.ocl.doc/images/1300-navigatingarg.png
new file mode 100644
index 0000000..dc17d07
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-navigatingarg.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-navigatingexp.png b/doc/org.eclipse.ocl.doc/images/1300-navigatingexp.png
new file mode 100644
index 0000000..573c7b8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-navigatingexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl1.png b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl1.png
new file mode 100644
index 0000000..9f40793
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl2.png b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl2.png
new file mode 100644
index 0000000..a2d0e2a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl3.png b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl3.png
new file mode 100644
index 0000000..e0d0780
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-operationcontextdecl3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration1.png b/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration1.png
new file mode 100644
index 0000000..7afdc0a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration2.png b/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration2.png
new file mode 100644
index 0000000..ddfed53
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-packagedeclaration2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-parameter.png b/doc/org.eclipse.ocl.doc/images/1300-parameter.png
new file mode 100644
index 0000000..2fb0c0f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-parameter.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-post.png b/doc/org.eclipse.ocl.doc/images/1300-post.png
new file mode 100644
index 0000000..0886e3a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-post.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-pre.png b/doc/org.eclipse.ocl.doc/images/1300-pre.png
new file mode 100644
index 0000000..3885281
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-pre.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl1.png b/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl1.png
new file mode 100644
index 0000000..b31ad90
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl2.png b/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl2.png
new file mode 100644
index 0000000..d237cdd
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-propertycontextdecl2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1300-specification.png b/doc/org.eclipse.ocl.doc/images/1300-specification.png
new file mode 100644
index 0000000..239a203
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1300-specification.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-accumulator.png b/doc/org.eclipse.ocl.doc/images/1400-accumulator.png
new file mode 100644
index 0000000..b707362
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-accumulator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-class1.png b/doc/org.eclipse.ocl.doc/images/1400-class1.png
new file mode 100644
index 0000000..6d4b609
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-class1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-class2.png b/doc/org.eclipse.ocl.doc/images/1400-class2.png
new file mode 100644
index 0000000..aea579a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-class2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-class3.png b/doc/org.eclipse.ocl.doc/images/1400-class3.png
new file mode 100644
index 0000000..994bcb5
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-class3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-classifier.png b/doc/org.eclipse.ocl.doc/images/1400-classifier.png
new file mode 100644
index 0000000..8dd0f7f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-classifier.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-inv.png b/doc/org.eclipse.ocl.doc/images/1400-inv.png
new file mode 100644
index 0000000..03f8900
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-inv.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration1.png b/doc/org.eclipse.ocl.doc/images/1400-iteration1.png
new file mode 100644
index 0000000..9e809f1
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration2.png b/doc/org.eclipse.ocl.doc/images/1400-iteration2.png
new file mode 100644
index 0000000..ecb8406
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration3.png b/doc/org.eclipse.ocl.doc/images/1400-iteration3.png
new file mode 100644
index 0000000..3d1cc57
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration4.png b/doc/org.eclipse.ocl.doc/images/1400-iteration4.png
new file mode 100644
index 0000000..090f458
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration5.png b/doc/org.eclipse.ocl.doc/images/1400-iteration5.png
new file mode 100644
index 0000000..72f9ef0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration5.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iteration6.png b/doc/org.eclipse.ocl.doc/images/1400-iteration6.png
new file mode 100644
index 0000000..4fe8ffe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iteration6.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-iterator.png b/doc/org.eclipse.ocl.doc/images/1400-iterator.png
new file mode 100644
index 0000000..a6a089d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-iterator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-library.png b/doc/org.eclipse.ocl.doc/images/1400-library.png
new file mode 100644
index 0000000..5cd586e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-library.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-library1.png b/doc/org.eclipse.ocl.doc/images/1400-library1.png
new file mode 100644
index 0000000..c2e1cdc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-library1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-library2.png b/doc/org.eclipse.ocl.doc/images/1400-library2.png
new file mode 100644
index 0000000..71bc597
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-library2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-library3.png b/doc/org.eclipse.ocl.doc/images/1400-library3.png
new file mode 100644
index 0000000..01fba6a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-library3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-operation.png b/doc/org.eclipse.ocl.doc/images/1400-operation.png
new file mode 100644
index 0000000..80c45b0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-operation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-operation1.png b/doc/org.eclipse.ocl.doc/images/1400-operation1.png
new file mode 100644
index 0000000..13fb9ad
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-operation1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-operation2.png b/doc/org.eclipse.ocl.doc/images/1400-operation2.png
new file mode 100644
index 0000000..a2d0e2a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-operation2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-operation3.png b/doc/org.eclipse.ocl.doc/images/1400-operation3.png
new file mode 100644
index 0000000..95eccc2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-operation3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-operation4.png b/doc/org.eclipse.ocl.doc/images/1400-operation4.png
new file mode 100644
index 0000000..2f98504
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-operation4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-package1.png b/doc/org.eclipse.ocl.doc/images/1400-package1.png
new file mode 100644
index 0000000..4f48b88
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-package1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-package2.png b/doc/org.eclipse.ocl.doc/images/1400-package2.png
new file mode 100644
index 0000000..d11a31b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-package2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-parameter.png b/doc/org.eclipse.ocl.doc/images/1400-parameter.png
new file mode 100644
index 0000000..5232662
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-parameter.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-post.png b/doc/org.eclipse.ocl.doc/images/1400-post.png
new file mode 100644
index 0000000..e81a1421
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-post.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-pre.png b/doc/org.eclipse.ocl.doc/images/1400-pre.png
new file mode 100644
index 0000000..3609f7a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-pre.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-precedence.png b/doc/org.eclipse.ocl.doc/images/1400-precedence.png
new file mode 100644
index 0000000..64eb0c2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-precedence.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-property1.png b/doc/org.eclipse.ocl.doc/images/1400-property1.png
new file mode 100644
index 0000000..8298811
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-property1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-property2.png b/doc/org.eclipse.ocl.doc/images/1400-property2.png
new file mode 100644
index 0000000..44da023
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-property2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1400-specification.png b/doc/org.eclipse.ocl.doc/images/1400-specification.png
new file mode 100644
index 0000000..239a203
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1400-specification.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1510-contentassist.png b/doc/org.eclipse.ocl.doc/images/1510-contentassist.png
new file mode 100644
index 0000000..bb96b6f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1510-contentassist.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1510-hovertext.png b/doc/org.eclipse.ocl.doc/images/1510-hovertext.png
new file mode 100644
index 0000000..2828e10
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1510-hovertext.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1520-console.png b/doc/org.eclipse.ocl.doc/images/1520-console.png
new file mode 100644
index 0000000..010572e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1520-console.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1530-validity-view.png b/doc/org.eclipse.ocl.doc/images/1530-validity-view.png
new file mode 100644
index 0000000..f64692e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1530-validity-view.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1540-debugger-console-launch.png b/doc/org.eclipse.ocl.doc/images/1540-debugger-console-launch.png
new file mode 100644
index 0000000..23b145b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1540-debugger-console-launch.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1540-debugger-image.png b/doc/org.eclipse.ocl.doc/images/1540-debugger-image.png
new file mode 100644
index 0000000..f244bf9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1540-debugger-image.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1540-debugger-run-configuration-launch.png b/doc/org.eclipse.ocl.doc/images/1540-debugger-run-configuration-launch.png
new file mode 100644
index 0000000..fe9dcc7
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1540-debugger-run-configuration-launch.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1540-debugger-validity-view-launch.png b/doc/org.eclipse.ocl.doc/images/1540-debugger-validity-view-launch.png
new file mode 100644
index 0000000..27822ce
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1540-debugger-validity-view-launch.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1600-load-document.png b/doc/org.eclipse.ocl.doc/images/1600-load-document.png
new file mode 100644
index 0000000..6c6da18
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1600-load-document.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-class-invariant-error.png b/doc/org.eclipse.ocl.doc/images/1710-class-invariant-error.png
new file mode 100644
index 0000000..66e101f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-class-invariant-error.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-class-invariant.png b/doc/org.eclipse.ocl.doc/images/1710-class-invariant.png
new file mode 100644
index 0000000..6484605
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-class-invariant.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-operation-constraints.png b/doc/org.eclipse.ocl.doc/images/1710-operation-constraints.png
new file mode 100644
index 0000000..c8ac5ca
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-operation-constraints.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-profile-constraint.png b/doc/org.eclipse.ocl.doc/images/1710-profile-constraint.png
new file mode 100644
index 0000000..ceca15c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-profile-constraint.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-property-constraint.png b/doc/org.eclipse.ocl.doc/images/1710-property-constraint.png
new file mode 100644
index 0000000..e51e818
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-property-constraint.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1710-transition-guard.png b/doc/org.eclipse.ocl.doc/images/1710-transition-guard.png
new file mode 100644
index 0000000..eda9a03
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1710-transition-guard.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-applied.png b/doc/org.eclipse.ocl.doc/images/1720-persons-applied.png
new file mode 100644
index 0000000..e5451d8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-applied.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-collections.png b/doc/org.eclipse.ocl.doc/images/1720-persons-collections.png
new file mode 100644
index 0000000..970973f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-collections.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-metamodel.png b/doc/org.eclipse.ocl.doc/images/1720-persons-metamodel.png
new file mode 100644
index 0000000..9c6209f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-metamodel.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-profile.png b/doc/org.eclipse.ocl.doc/images/1720-persons-profile.png
new file mode 100644
index 0000000..57ed7ba
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-profile.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-profiled.png b/doc/org.eclipse.ocl.doc/images/1720-persons-profiled.png
new file mode 100644
index 0000000..105bb58
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-profiled.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1720-persons-scalars.png b/doc/org.eclipse.ocl.doc/images/1720-persons-scalars.png
new file mode 100644
index 0000000..234dbac
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1720-persons-scalars.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1800-preference-pages.png b/doc/org.eclipse.ocl.doc/images/1800-preference-pages.png
new file mode 100644
index 0000000..5646744
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1800-preference-pages.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1800-property-pages.png b/doc/org.eclipse.ocl.doc/images/1800-property-pages.png
new file mode 100644
index 0000000..0e20d91
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1800-property-pages.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1810-code-generation-mode.png b/doc/org.eclipse.ocl.doc/images/1810-code-generation-mode.png
new file mode 100644
index 0000000..202aeec
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1810-code-generation-mode.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1810-default-delegation-mode.png b/doc/org.eclipse.ocl.doc/images/1810-default-delegation-mode.png
new file mode 100644
index 0000000..3592984
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1810-default-delegation-mode.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1820-ecore-uml-options.png b/doc/org.eclipse.ocl.doc/images/1820-ecore-uml-options.png
new file mode 100644
index 0000000..31fc1d6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1820-ecore-uml-options.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1830-uml-options.png b/doc/org.eclipse.ocl.doc/images/1830-uml-options.png
new file mode 100644
index 0000000..7afbe05
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1830-uml-options.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/1870-oclinecore-options.png b/doc/org.eclipse.ocl.doc/images/1870-oclinecore-options.png
new file mode 100644
index 0000000..9a3a5eb
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/1870-oclinecore-options.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/3200-ecore_console.png b/doc/org.eclipse.ocl.doc/images/3200-ecore_console.png
new file mode 100644
index 0000000..9645830
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/3200-ecore_console.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/3200-lib_console.png b/doc/org.eclipse.ocl.doc/images/3200-lib_console.png
new file mode 100644
index 0000000..d775ffb
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/3200-lib_console.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/3200-lib_editor_contrib.png b/doc/org.eclipse.ocl.doc/images/3200-lib_editor_contrib.png
new file mode 100644
index 0000000..f97b00a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/3200-lib_editor_contrib.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/3200-uml_console.png b/doc/org.eclipse.ocl.doc/images/3200-uml_console.png
new file mode 100644
index 0000000..f04ae60
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/3200-uml_console.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-books_query.png b/doc/org.eclipse.ocl.doc/images/4100-books_query.png
new file mode 100644
index 0000000..8cda785
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-books_query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-convert_to_ocl_project.png b/doc/org.eclipse.ocl.doc/images/4100-convert_to_ocl_project.png
new file mode 100644
index 0000000..bd6abe2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-convert_to_ocl_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance.png b/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance.png
new file mode 100644
index 0000000..168455f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance_dialog.png b/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance_dialog.png
new file mode 100644
index 0000000..6045589
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-create_dynamic_instance_dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-derived_property.png b/doc/org.eclipse.ocl.doc/images/4100-derived_property.png
new file mode 100644
index 0000000..eb41576
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-derived_property.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-ecore_diagram.png b/doc/org.eclipse.ocl.doc/images/4100-ecore_diagram.png
new file mode 100644
index 0000000..7a609fe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-ecore_diagram.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-empty_ecore.png b/doc/org.eclipse.ocl.doc/images/4100-empty_ecore.png
new file mode 100644
index 0000000..958952f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-empty_ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-empty_oclinecore.png b/doc/org.eclipse.ocl.doc/images/4100-empty_oclinecore.png
new file mode 100644
index 0000000..a4d08a2
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-empty_oclinecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-gen_model.png b/doc/org.eclipse.ocl.doc/images/4100-gen_model.png
new file mode 100644
index 0000000..64aa507
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-gen_model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-gen_model_menu.png b/doc/org.eclipse.ocl.doc/images/4100-gen_model_menu.png
new file mode 100644
index 0000000..3fb1113
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-gen_model_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-helper_operation.png b/doc/org.eclipse.ocl.doc/images/4100-helper_operation.png
new file mode 100644
index 0000000..bd69300
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-helper_operation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-initial_model.png b/doc/org.eclipse.ocl.doc/images/4100-initial_model.png
new file mode 100644
index 0000000..f50c822
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-initial_model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-metamodel.png b/doc/org.eclipse.ocl.doc/images/4100-metamodel.png
new file mode 100644
index 0000000..131f15b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-metamodel.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-metamodel2.png b/doc/org.eclipse.ocl.doc/images/4100-metamodel2.png
new file mode 100644
index 0000000..38e732c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-metamodel2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-metamodel3.png b/doc/org.eclipse.ocl.doc/images/4100-metamodel3.png
new file mode 100644
index 0000000..8222284
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-metamodel3.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-metamodel4.png b/doc/org.eclipse.ocl.doc/images/4100-metamodel4.png
new file mode 100644
index 0000000..638661e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-metamodel4.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-model_copies.png b/doc/org.eclipse.ocl.doc/images/4100-model_copies.png
new file mode 100644
index 0000000..f79a81c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-model_copies.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-model_pull_down.png b/doc/org.eclipse.ocl.doc/images/4100-model_pull_down.png
new file mode 100644
index 0000000..e8ef157
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-model_pull_down.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model.png b/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model.png
new file mode 100644
index 0000000..46dee31
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model_dialog.png b/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model_dialog.png
new file mode 100644
index 0000000..3c3a6b3
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_ecore_model_dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator.png b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator.png
new file mode 100644
index 0000000..a37f0fe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model.png b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model.png
new file mode 100644
index 0000000..bc56a45
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_ecore.png b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_ecore.png
new file mode 100644
index 0000000..634a4bf
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_load.png b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_load.png
new file mode 100644
index 0000000..09f45fe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_load.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_packages.png b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_packages.png
new file mode 100644
index 0000000..b18cb54
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_emf_generator_model_packages.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_empty_emf_project.png b/doc/org.eclipse.ocl.doc/images/4100-new_empty_emf_project.png
new file mode 100644
index 0000000..05effad
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_empty_emf_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_oclinecore-ecore.png b/doc/org.eclipse.ocl.doc/images/4100-new_oclinecore-ecore.png
new file mode 100644
index 0000000..16ce28b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_oclinecore-ecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-new_project.png b/doc/org.eclipse.ocl.doc/images/4100-new_project.png
new file mode 100644
index 0000000..3b7cd65
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-new_project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-ocl_console_menu.png b/doc/org.eclipse.ocl.doc/images/4100-ocl_console_menu.png
new file mode 100644
index 0000000..ae08a61
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-ocl_console_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-project-commands.png b/doc/org.eclipse.ocl.doc/images/4100-project-commands.png
new file mode 100644
index 0000000..0ecf3c9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-project-commands.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-two_validation_errors.png b/doc/org.eclipse.ocl.doc/images/4100-two_validation_errors.png
new file mode 100644
index 0000000..efb92f7
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-two_validation_errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-validate_menu.png b/doc/org.eclipse.ocl.doc/images/4100-validate_menu.png
new file mode 100644
index 0000000..64303f8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-validate_menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-validation_successful.png b/doc/org.eclipse.ocl.doc/images/4100-validation_successful.png
new file mode 100644
index 0000000..37a6a8a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-validation_successful.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4100-validation_unsuccessful.png b/doc/org.eclipse.ocl.doc/images/4100-validation_unsuccessful.png
new file mode 100644
index 0000000..bd184aa
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4100-validation_unsuccessful.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4120-expanded-safe-navigation-error.png b/doc/org.eclipse.ocl.doc/images/4120-expanded-safe-navigation-error.png
new file mode 100644
index 0000000..2372932
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4120-expanded-safe-navigation-error.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4120-null-free-collection-suppression.png b/doc/org.eclipse.ocl.doc/images/4120-null-free-collection-suppression.png
new file mode 100644
index 0000000..6d7ceec
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4120-null-free-collection-suppression.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4120-raw-safe-navigation-errors.png b/doc/org.eclipse.ocl.doc/images/4120-raw-safe-navigation-errors.png
new file mode 100644
index 0000000..6710d37
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4120-raw-safe-navigation-errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4120-safe-navigation-preferences.png b/doc/org.eclipse.ocl.doc/images/4120-safe-navigation-preferences.png
new file mode 100644
index 0000000..4c3f4c8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4120-safe-navigation-preferences.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4120-suppressed-safe-navigation-error.png b/doc/org.eclipse.ocl.doc/images/4120-suppressed-safe-navigation-error.png
new file mode 100644
index 0000000..9fff79d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4120-suppressed-safe-navigation-error.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-complete-ocl-tutorial-project.png b/doc/org.eclipse.ocl.doc/images/4300-complete-ocl-tutorial-project.png
new file mode 100644
index 0000000..d915677
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-complete-ocl-tutorial-project.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-content.png b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-content.png
new file mode 100644
index 0000000..a62bea8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-content.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-oclinecore.png b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-oclinecore.png
new file mode 100644
index 0000000..6e15efb
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-oclinecore.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-validation.png b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-validation.png
new file mode 100644
index 0000000..7ebeb3e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-ecore-validation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-uml-content.png b/doc/org.eclipse.ocl.doc/images/4300-extra-uml-content.png
new file mode 100644
index 0000000..9cdbe31
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-uml-content.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-uml-validation.png b/doc/org.eclipse.ocl.doc/images/4300-extra-uml-validation.png
new file mode 100644
index 0000000..4f4af38
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-uml-validation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-content.png b/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-content.png
new file mode 100644
index 0000000..abdcb39
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-content.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-validation.png b/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-validation.png
new file mode 100644
index 0000000..cef84dc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-extra-xtext-validation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-dialog.png b/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-dialog.png
new file mode 100644
index 0000000..2c20251
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-dialog.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-menu.png b/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-menu.png
new file mode 100644
index 0000000..8ee8058
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-load-complete-ocl-resource-menu.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial1.png b/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial1.png
new file mode 100644
index 0000000..a29b2db
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial2.png b/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial2.png
new file mode 100644
index 0000000..1d77330
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4300-new-complete-ocl-tutorial2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4400-genannotation.png b/doc/org.eclipse.ocl.doc/images/4400-genannotation.png
new file mode 100644
index 0000000..a049ca5
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4400-genannotation.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-image.png b/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-image.png
new file mode 100644
index 0000000..852cac9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-image.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-model.png b/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-model.png
new file mode 100644
index 0000000..f181ffa
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-complete-ocl-debugger-model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-image.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-image.png
new file mode 100644
index 0000000..252f53f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-image.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-input.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-input.png
new file mode 100644
index 0000000..9385f29
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-input.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-model.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-model.png
new file mode 100644
index 0000000..1e1d46d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step1.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step1.png
new file mode 100644
index 0000000..403ba89
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step2.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step2.png
new file mode 100644
index 0000000..c3ffc1b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-step2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-variables.png b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-variables.png
new file mode 100644
index 0000000..9062b2e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-simple-debugger-variables.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-errors.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-errors.png
new file mode 100644
index 0000000..86e4a37
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-image.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-image.png
new file mode 100644
index 0000000..9f2bf42
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-image.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-model.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-model.png
new file mode 100644
index 0000000..0695523
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step1.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step1.png
new file mode 100644
index 0000000..8e0082a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step2.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step2.png
new file mode 100644
index 0000000..f31e312
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-step2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv1.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv1.png
new file mode 100644
index 0000000..7ab6ee6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv1.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv2.png b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv2.png
new file mode 100644
index 0000000..1a3bda0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4500-validation-debugger-vv2.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-debugger.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-debugger.png
new file mode 100644
index 0000000..d1c7f6a
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-debugger.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-error-results.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-error-results.png
new file mode 100644
index 0000000..ecf628e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-error-results.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-metamodel-errors.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-metamodel-errors.png
new file mode 100644
index 0000000..1355c57
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-metamodel-errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-model-errors.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-model-errors.png
new file mode 100644
index 0000000..063f55d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-model-errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-model.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-model.png
new file mode 100644
index 0000000..13c5cfd
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-model.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-results-context.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-results-context.png
new file mode 100644
index 0000000..b1abfca
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-results-context.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-root-results.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-root-results.png
new file mode 100644
index 0000000..9b12c19
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-root-results.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-roots.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-roots.png
new file mode 100644
index 0000000..ecf5a38
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-roots.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4600-validation-view-some-results.png b/doc/org.eclipse.ocl.doc/images/4600-validation-view-some-results.png
new file mode 100644
index 0000000..fe8d0bd
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4600-validation-view-some-results.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4900-install_details.png b/doc/org.eclipse.ocl.doc/images/4900-install_details.png
new file mode 100644
index 0000000..e67dfd4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4900-install_details.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4900-install_license.png b/doc/org.eclipse.ocl.doc/images/4900-install_license.png
new file mode 100644
index 0000000..27157a4
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4900-install_license.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/4900-install_software.png b/doc/org.eclipse.ocl.doc/images/4900-install_software.png
new file mode 100644
index 0000000..57cbf39
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/4900-install_software.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5110-context.png b/doc/org.eclipse.ocl.doc/images/5110-context.png
new file mode 100644
index 0000000..ab5b16c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5110-context.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5110-creating.png b/doc/org.eclipse.ocl.doc/images/5110-creating.png
new file mode 100644
index 0000000..a5233af
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5110-creating.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5110-define.png b/doc/org.eclipse.ocl.doc/images/5110-define.png
new file mode 100644
index 0000000..93106cc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5110-define.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5110-environment.png b/doc/org.eclipse.ocl.doc/images/5110-environment.png
new file mode 100644
index 0000000..019bb8b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5110-environment.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5110-oclhelper.png b/doc/org.eclipse.ocl.doc/images/5110-oclhelper.png
new file mode 100644
index 0000000..79bb6fe
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5110-oclhelper.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5115-check-all.png b/doc/org.eclipse.ocl.doc/images/5115-check-all.png
new file mode 100644
index 0000000..b98dccf
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5115-check-all.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5115-check-one.png b/doc/org.eclipse.ocl.doc/images/5115-check-one.png
new file mode 100644
index 0000000..876c336
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5115-check-one.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5115-check-quick.png b/doc/org.eclipse.ocl.doc/images/5115-check-quick.png
new file mode 100644
index 0000000..fa10996
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5115-check-quick.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5115-query.png b/doc/org.eclipse.ocl.doc/images/5115-query.png
new file mode 100644
index 0000000..517d812
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5115-query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5120-accessing.png b/doc/org.eclipse.ocl.doc/images/5120-accessing.png
new file mode 100644
index 0000000..0ba92e5
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5120-accessing.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5120-extlibrary.png b/doc/org.eclipse.ocl.doc/images/5120-extlibrary.png
new file mode 100644
index 0000000..c4de6c8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5120-extlibrary.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5120-input.png b/doc/org.eclipse.ocl.doc/images/5120-input.png
new file mode 100644
index 0000000..7932d92
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5120-input.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5120-parsing.png b/doc/org.eclipse.ocl.doc/images/5120-parsing.png
new file mode 100644
index 0000000..b31df5d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5120-parsing.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5140-contentassist.png b/doc/org.eclipse.ocl.doc/images/5140-contentassist.png
new file mode 100644
index 0000000..87764c9
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5140-contentassist.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5150-ast.png b/doc/org.eclipse.ocl.doc/images/5150-ast.png
new file mode 100644
index 0000000..cf620dc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5150-ast.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5155-hidden-opposites.png b/doc/org.eclipse.ocl.doc/images/5155-hidden-opposites.png
new file mode 100644
index 0000000..8576cf8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5155-hidden-opposites.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5160-appcontext.png b/doc/org.eclipse.ocl.doc/images/5160-appcontext.png
new file mode 100644
index 0000000..e51d7dc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5160-appcontext.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5170-persistence.png b/doc/org.eclipse.ocl.doc/images/5170-persistence.png
new file mode 100644
index 0000000..7856567
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5170-persistence.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5180-bindings.png b/doc/org.eclipse.ocl.doc/images/5180-bindings.png
new file mode 100644
index 0000000..59268f0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5180-bindings.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5180-callexp.png b/doc/org.eclipse.ocl.doc/images/5180-callexp.png
new file mode 100644
index 0000000..2d6d28d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5180-callexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5180-literalexp.png b/doc/org.eclipse.ocl.doc/images/5180-literalexp.png
new file mode 100644
index 0000000..ae8efd0
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5180-literalexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5180-miscexp.png b/doc/org.eclipse.ocl.doc/images/5180-miscexp.png
new file mode 100644
index 0000000..2af2fcc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5180-miscexp.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5180-ocltypes.png b/doc/org.eclipse.ocl.doc/images/5180-ocltypes.png
new file mode 100644
index 0000000..ba6671b
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5180-ocltypes.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5190-event-manager-default-config.png b/doc/org.eclipse.ocl.doc/images/5190-event-manager-default-config.png
new file mode 100644
index 0000000..bd22bc6
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5190-event-manager-default-config.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5190-event-manager-instances.png b/doc/org.eclipse.ocl.doc/images/5190-event-manager-instances.png
new file mode 100644
index 0000000..5e138dc
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5190-event-manager-instances.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-classes.png b/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-classes.png
new file mode 100644
index 0000000..a7fd8c8
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-classes.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-instances.png b/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-instances.png
new file mode 100644
index 0000000..4cd6995
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/5190-impact-analyzer-instances.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6200-library-declarations.png b/doc/org.eclipse.ocl.doc/images/6200-library-declarations.png
new file mode 100644
index 0000000..08ce246
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6200-library-declarations.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-context.png b/doc/org.eclipse.ocl.doc/images/6310-context.png
new file mode 100644
index 0000000..be871fd
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-context.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-creating-external.png b/doc/org.eclipse.ocl.doc/images/6310-creating-external.png
new file mode 100644
index 0000000..68900e1
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-creating-external.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-creating-internal.png b/doc/org.eclipse.ocl.doc/images/6310-creating-internal.png
new file mode 100644
index 0000000..163c115
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-creating-internal.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-define.png b/doc/org.eclipse.ocl.doc/images/6310-define.png
new file mode 100644
index 0000000..d9cb9de
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-define.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-dispose.png b/doc/org.eclipse.ocl.doc/images/6310-dispose.png
new file mode 100644
index 0000000..7bc2fe3
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-dispose.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-environment.png b/doc/org.eclipse.ocl.doc/images/6310-environment.png
new file mode 100644
index 0000000..7708879
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-environment.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-errors.png b/doc/org.eclipse.ocl.doc/images/6310-errors.png
new file mode 100644
index 0000000..00f6e39
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-errors.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6310-oclhelper.png b/doc/org.eclipse.ocl.doc/images/6310-oclhelper.png
new file mode 100644
index 0000000..cd77964
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6310-oclhelper.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6315-check-all.png b/doc/org.eclipse.ocl.doc/images/6315-check-all.png
new file mode 100644
index 0000000..b548c49
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6315-check-all.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6315-check-one.png b/doc/org.eclipse.ocl.doc/images/6315-check-one.png
new file mode 100644
index 0000000..2138c5e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6315-check-one.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6315-check-quick.png b/doc/org.eclipse.ocl.doc/images/6315-check-quick.png
new file mode 100644
index 0000000..c169742
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6315-check-quick.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6315-query.png b/doc/org.eclipse.ocl.doc/images/6315-query.png
new file mode 100644
index 0000000..6019e8e
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6315-query.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-accessing.png b/doc/org.eclipse.ocl.doc/images/6320-accessing.png
new file mode 100644
index 0000000..9bb2a7f
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-accessing.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-diagnostician.png b/doc/org.eclipse.ocl.doc/images/6320-diagnostician.png
new file mode 100644
index 0000000..60bf42d
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-diagnostician.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-extlibrary.png b/doc/org.eclipse.ocl.doc/images/6320-extlibrary.png
new file mode 100644
index 0000000..762c058
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-extlibrary.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-parsing.png b/doc/org.eclipse.ocl.doc/images/6320-parsing.png
new file mode 100644
index 0000000..29b445c
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-parsing.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-traversing.png b/doc/org.eclipse.ocl.doc/images/6320-traversing.png
new file mode 100644
index 0000000..56a3157
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-traversing.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/images/6320-validating.png b/doc/org.eclipse.ocl.doc/images/6320-validating.png
new file mode 100644
index 0000000..eec1d90
--- /dev/null
+++ b/doc/org.eclipse.ocl.doc/images/6320-validating.png
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/manual/ocl.pdf b/doc/org.eclipse.ocl.doc/manual/ocl.pdf
index 2f9337a..e6262f3 100644
--- a/doc/org.eclipse.ocl.doc/manual/ocl.pdf
+++ b/doc/org.eclipse.ocl.doc/manual/ocl.pdf
Binary files differ
diff --git a/doc/org.eclipse.ocl.doc/styles/titlepage.xsl b/doc/org.eclipse.ocl.doc/styles/titlepage.xsl
index aa659c4..b6261ab 100644
--- a/doc/org.eclipse.ocl.doc/styles/titlepage.xsl
+++ b/doc/org.eclipse.ocl.doc/styles/titlepage.xsl
@@ -79,7 +79,7 @@
                                 <xsl:text>Christian Damus, Adolfo Sánchez-Barbudo Herrera, Axel Uhl, Edward Willink and contributors</xsl:text>
                             </fo:block>
                             <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
-                                <xsl:text>Copyright 2002 - 2020</xsl:text>
+                                <xsl:text>Copyright 2002 - 2021</xsl:text>
                             </fo:block>
                         </fo:table-cell>
                     </fo:table-row>
diff --git a/doc/org.eclipse.ocl.doc/styles/xmpp.xsl b/doc/org.eclipse.ocl.doc/styles/xmpp.xsl
index dc7c657..1e9664a 100644
--- a/doc/org.eclipse.ocl.doc/styles/xmpp.xsl
+++ b/doc/org.eclipse.ocl.doc/styles/xmpp.xsl
@@ -39,7 +39,7 @@
                       <xsl:text>Eclipse OCL </xsl:text><xsl:value-of select="//releaseinfo"/>
               </xsl:when>
               <xsl:otherwise>
-                  Eclipse OCL 2021-03 (6.14.0)
+                  Eclipse OCL 2021-06 (6.15.0)
               </xsl:otherwise>
           </xsl:choose>
       </xsl:variable>
diff --git a/doc/org.eclipse.ocl.doc/toc.xml b/doc/org.eclipse.ocl.doc/toc.xml
index 09609b3..2552638 100644
--- a/doc/org.eclipse.ocl.doc/toc.xml
+++ b/doc/org.eclipse.ocl.doc/toc.xml
@@ -354,6 +354,7 @@
 <topic href="help/Tutorials.html#Troubleshooting" label="Troubleshooting"></topic>

 <topic href="help/Tutorials.html#UsingtheOCLinEcoretexteditorforEcore" label="Using the OCLinEcore text editor for Ecore">

 <topic href="help/Tutorials.html#CreateaNewEMFProject" label="Create a New EMF Project"></topic>

+<topic href="help/Tutorials.html#ConverttoanOCLProject" label="Convert to an OCL Project"></topic>

 <topic href="help/Tutorials.html#CreateaNewEcoreModel" label="Create a New Ecore Model"></topic>

 <topic href="help/Tutorials.html#OCLinEcoreMetamodel" label="Edit Ecore Model as OCLinEcore"></topic>

 <topic href="help/Tutorials.html#TheTutorialMetaModel" label="The Tutorial Meta-Model"></topic>

diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.classpath b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.classpath
new file mode 100644
index 0000000..7ee57d4
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path=""/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.project b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.project
index cac31b1..ef9e9a1 100644
--- a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.project
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.project
@@ -6,6 +6,11 @@
 	</projects>
 	<buildSpec>
 		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
 			<name>org.eclipse.ocl.pivot.ui.oclbuilder</name>
 			<arguments>
 				<dictionary>
@@ -26,8 +31,20 @@
 				</dictionary>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.ocl.pivot.ui.oclnature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
 	</natures>
 </projectDescription>
diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.settings/org.eclipse.jdt.core.prefs b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..9f6ece8
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/META-INF/MANIFEST.MF b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3445af4
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Oclinecoretutorial
+Bundle-SymbolicName: org.eclipse.ocl.examples.project.oclinecoretutorial
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: org.eclipse.ocl.examples.project.oclinecoretutorial
+Export-Package: model
diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/build.properties b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/build.properties
new file mode 100644
index 0000000..0c6d2bb
--- /dev/null
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/build.properties
@@ -0,0 +1,4 @@
+source.. = .
+bin.includes = META-INF/,\
+               .,\
+               model/
diff --git a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/model/Tutorial.genmodel b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/model/Tutorial.genmodel
index d47a88b..c6d7d31 100644
--- a/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/model/Tutorial.genmodel
+++ b/examples/org.eclipse.ocl.examples.project.oclinecoretutorial/model/Tutorial.genmodel
@@ -1,8 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/OCLinEcoreTutorial/src" modelPluginID="OCLinEcoreTutorial"
-    modelName="Tutorial" importerID="org.eclipse.emf.importer.ecore" complianceLevel="6.0"
-    copyrightFields="false">
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.eclipse.ocl.examples.project.oclinecoretutorial/src"
+    modelPluginID="org.eclipse.ocl.examples.project.oclinecoretutorial" modelName="Tutorial"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="6.0" copyrightFields="false"
+    operationReflection="true">
+  <genAnnotations source="http://www.eclipse.org/OCL/GenModel">
+    <details key="Use Delegates" value="false"/>
+  </genAnnotations>
   <foreignModel>Tutorial.ecore</foreignModel>
   <genPackages prefix="Tutorial" disposableProviderFactory="true" ecorePackage="Tutorial.ecore#/">
     <genClasses ecoreClass="Tutorial.ecore#//Library">